您的位置:首页 > 其它

基于EasyJWeb的Ajax远程脚本调用引擎

2008-04-29 11:30 295 查看
一、 远程脚本调用的好处
远程脚本调用也即是把JAVA类注入到客户端的JavaScript代码中,从而直接在客户端的JS代码中就可以远程调用服务器端暴露出来的JAVA类与类中的方法。这样的好处之一就是实现Ajax的异步调用,从而实现View层直接远程访问业务逻辑层,省去与Action控制器打交道。

二、 EasyJWeb集成远程脚本调用引擎
在J2EE开发领域中的远程脚本调用,最让大家熟悉的么过于EasyJWeb中的远程脚本调用引擎与DWR。二者都可实现直接在客户端的JS中远程调用JAVA类,但我更推荐使用EasyJWeb, 因为远程脚本调用引擎只是他的一个小功能,你还可以在需要的时候使用他的其它功能,不用在学习其它的(如Struts、JSF等)MVC框架。比如EXT接收数据只能是基于JSON格式,这在Struts中是需要我们自己去处理把数据转换成JSON格式再返回给EXT,而在JWEB中则直接String json = AjaxUtil.getJSON(obj); 再把这个JSON字符串返回给客户端的Ext.data.JsonStore类即可。
以下介绍二种View层为不同模版时远程脚本调用实例,及在使用它时的一些细节处理。

三、 View层为普通HTML模版实例
可以参照大峡的 《性能提升10倍的Ajax远程脚本调用引擎》http://www.easyjf.com/blog/html/20080103/1015816.html
Demo下载地址:ftp://ftp1.easyjf.com/easyjweb/demo/ajax.war

四、 View层为ExtJS的实例
其实在网上也能找到这类文章http://www.vifir.com/entry/view/917505.html
Demo下载地址:http://www.vifir.com/portal.ejf?cmd=downloadVipFile&name=codes/dwrstore.zip

但由于《DWRStore及示例》这个实例中的业务逻辑类暴露给客户端的方法所带参数为一个QueryObject,




public IPageList getPersons(QueryObject query) ...{


IPageList pageList=new PageList(new com.easyjf.web.tools.ListQuery(persons));


pageList.doList(query.getPageSize(),query.getCurrentPage(),"", "");


return pageList;


}



也就是说参数是一个查询实体类,而如果我们的项目是采用的EasyJWeb的命令自动根据域模型所生成,那么在生成的基本Crud时,业务逻辑类中的查询参数默认就是一个查询接口IQueryObject,而并非查询实体类QueryObject。如:




public IPageList getPersons (IQueryObject queryObject) ...{


return QueryUtil.query(queryObject, Person.class, this.personDao);


}



所以如果再像《DWRStore及示例》中介绍的方式在客户端的EXT中调用fn:personService.getPersons,, 则会在EXT中执行时报如下的错误:



原因就在于远程调用的的这个方法中所带的查询参数是一个接口而非一个实体查询对象,解决办法则是在项目的easyjf-web.xml配置文件中把<ajax></ajax>作如下配置修改:


<ajax>


<services allowName="*">


<service name="blogSortService" />


</services>


<signatures>


<![CDATA[blogSortService.getBlogSortBy(com.easyjf.core.support.query.QueryObject);]]>


</signatures>


</ajax>



当类中的方法参数为接口时如果没有做配置这是造成远程脚本调用失败的原因之一,现在请看下面这段配置代码。


<beans>


<bean name="blogSortService" class="com.easyjf.lyBlog.service.impl.BlogSortServiceImpl" />


</beans>


<ajax>


<services allowName="*">


<service name="blogSortService" />


</services>


<signatures>


<![CDATA[blogSortService.getBlogSortBy(com.easyjf.core.support.query.QueryObject);]]>


</signatures>


</ajax>

这样配置能远程调用成功吗?结果是NO。注意看,<service name="blogSortService" />这里依赖于上面我们自己单独创建的Bean,这个Bean并没有错,但我们并没有为这个Bean配置一个DAO呀。所以照样无法远程调用成功。会得到一个类似于这样的错:



可能还会有疑问,为什么最开始我们只配置了一个<ajax></ajax>并没有配置一个Bean,反而能远程调用成功,现在配置了一个Bean,只是没有配置这个Bean所管理的DAO却不能调用成功,原因就在于虽然我们在easyjf-web.xml配置文件中找不到对<service name="blogSortService" />name名称为blogSortService的Bean,但由于使用JWEB的命令生成一个EJS的项目时,默认它就自动为我们把这些管理业务逻辑,并与持久层关联的XML配置文件都自动生成好了,不然你到你所生成的项目的src/main/resources目录下查找看一下.
其它客户端EXT代码与《DWRStore及示例》完全一致,同时这里我也提供一个基于EJS(EasyJWeb+Spring+JPA)的Crud的远程脚本调用示例,

可以先增加一些数据 http://localhost:82/message.ejf



演示远程脚本调用 http://localhost:82/index.html




Demo下载地址: (所需要的包可以拷贝easyjweb1.1 lib目录下的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: