实现在js客户端对Spring的动态调用(一)
?
一、目的:
JS客户端在编写程序时,可以像调用本地方法一样调用服务器端的Spring中Bean的方法,实现对Spring的动态调用,从而减少客户端的每个请求都要配置成action的麻烦,使业务模块的开发只关注业务逻辑的展示页面的开发。
二、设计思路:
1.服务器端利用Struts机制,提供统一的动态action,名称为DynamicAjaxAction,接收客户端的请求,并返回处理结果;
2.DynamicAjaxAction内部解析请求后,通过java反射机制动态调用spring中的baen方法;
3.客户端封装异步请求方法,提供调用接口;
总体架构如下示意图:
?
?
?
三、详细设计:
1.DynamicAjaxAction的设计:
?
DynamicAjaxAction是一个标准的Struts的Action,类的execute方法中,首先接收到请求的参数,重点是名称为serviceUrl的参数,此参数据形如“textService/test/abc”,参数分为三段,以“/”分隔,第一部分是bean的名称,第二部分为方法名称,第三部分为方法的参数,如果有多个参数,分别顺序添加即可。
然后,调用ActionInvoker的方法,通过反射访问目标方法,接收返回结果。
最后,接返回的结果写入response,返回给客户端。
当然, 需要将此类在Struts和Spring中分别进行配置,以确保客户端能正常访问。
?
2.java反射机制的封装:
?
ActionInvoker是一个针对java动态调用方法的封装,用来根据传入的参数,动态调用请求的方法。
设计的基本思路是:根据beanName和方法名称,确定方法,如果可以确定唯一的目标方法(即方法没有重载),则将请求的参数,按要调用的方法所需的参数进行转换,转换成功后,即可进行调用。如果转换失败或没有发现目标方法,则调用不成功。
如果目标方法不唯一,那么要看请求的参数个数,确定方法中的参数个数小于等于请求的参数个数的方法为目标方法(这个逻辑可以根据自己的应用情况进行修改),然后按照方法的需要把参数转换为所需的类型即可调用。
调用成功后,返回结果。
3.客户端异步请求方法的实现 :
justgin.bap.ajax.request({ serviceUrl: 'testService/test/abc', success: function(data) { alert(data.id + data.name); } });?
五、总结
动态调用Srping的实现目的主要为了提高js客户端访问服务器端业务逻辑的便捷性,为客户端与服务器端的通讯提供一种解决方案,为了开发者提供方便的使用方式,使其在在业务模块的设计时,更关注于内部逻辑。当然,相关的安全、性能等问题没有列入其中,具体的情况可以根据应用场景的不同进行优化。
下一篇会根据上述内容,针对业务模块开发时常用的列表数据和表单数据提供更具体的分析和设计,使动态调用更有针对性,例如service的参数可以直接是一个业务对象,最大限度地减轻客户端与服务器端通讯时,业务对象和Json之间转换的工作量,敬请关注。
?
