Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1537309 2005是Ajax最火爆的年份,以gmail为先驱的Ajax应用已经逐渐深入人心了。也许这就是所谓的轮回吧,计算机界面的设计从最初瘦到胖再到瘦,如今又要开始胖了。不过,在web界面的胖与之前的胖还是有很多区别的,web界面的胖主要依赖于DHML和Javascript来实现。这也是本文的来由了,相信很多OO的开发人员都不愿与页面层的效果打交道,尤其是Javascript的这样的开发语言,我也是其中之一了,非常不喜欢Javascript,语法松散,结构复杂。反正是不喜欢了,但是在web时代,既然流行胖子,想不用Javascript是不可能的了,那么怎么样来简化Ajax的开发呢?DWR由此延生了,他封装了XMLHttpRequest,直接调用服务端的方法,省了好多Javascript啊^_^ Struts虽然已经开始开下陡路,但底子厚,将DWR与Struts结合依然会是大多数开发者的选择。 本文分两部分:框架介绍和实例开发。先来: 第一部分 框架介绍 一、Ajax介绍 Ajax--Asynchronous JavaScript and XML,异步JavaScript和XML。 名字中已经包含Ajax的组成部分:异步处理XMLHttpRequest,JavaScript,XML。 其中: 1、XMLHttpRequest是Ajax的关键部分,正是由于他的存在,才使得胖子越来越吃香了。 2、JavaScript是Ajax的必备部分,没有他还玩个屁 3、XML是Ajax数据格式的推荐方式,但也可以不用 当然还少不了CSS,有了CSS使得在Ajax中更容易修改用户的界面 Ajax的细节和样例使用就不多说了,N多的资源,自己找吧。 二、DWR介绍 DWR-Direct Web Remote,翻译过来应该是直接远程网页访问。(这个Web一直找不到好的词语来表达,这里就用网页吧) 如名字所述,DWR的主要特点就是可以在Ajax中直接调用服务器上的方法,很奇妙吧。就是说,不需要通过URL来告诉服务来处理,而是直接在Javascript中调用类的方法,并返回数据。 DWR简化了Ajax的开发: 1、封装了Ajax中的使用,不再需要直接使用XMLHttpRequest了,这可是非常重要的,减少了好多Javascript呀 2、通过回调函数的方式,简化了错误处理及返回数据的处理。 3、直接调用服务器类的方法,不再需要通过URL方式,也省了不少的事。 DWR的主要部件有:dwr.xml/engine.js/util.js,前者是DWR的Servlet使用的配置文件,后两者DWR替我们封装的Ajax的代码,当然也提供了其他有用的功能。 三、Struts介绍 Struts还用介绍吗?没听说过?那就不用往下看,休息休息吧^_^ 这里就说一下在DWR如何调用Struts中Action的方法吧,说白了,是不可能的。这不是白说吗#$@$@%@# 实际上是这样的,虽然DWR支持方法的调用,但ActionForward/ActionForm/ActionMap这些东西如何在DWR调用方法前生成呢?我也不知道,所以DWR对Struts的支持实际上就是要重构Action中的方法,去掉上面的东西,然后就可以了(这是DWR说的,可不是我说的^_^)。 看了上面的一小通介绍,不知道大家有没有什么感觉,我也觉得写得太少了,可能看了跟没看差不多。不过这里主要是想大家对这些概念有个了解。接下来的第二部分,将会以实例开发的方式来写,这样就更容易依样画葫芦了(我也比较喜欢这样的方式)。 摘要:先讲一下应用的结构页面端: demo.jsp用来展示界面服务端: DemoAction是Struts中的Action子类负责控制转换, DemoFacade是业务类负责业务处理。 Goods是一个业务实体类Struts部分的配置就 先讲一下应用的结构 页面端: demo.jsp用来展示界面 服务端: DemoAction是Struts中的Action子类负责控制转换, DemoFacade是业务类负责业务处理。 Goods是一个业务实体类
Struts部分的配置就忽略不说了,实际上这个应用并没有包含Struts的配置 主要讲一下dwr的配置,首先需要在web.xml增加下面的servelt映射: <servlet> <description>Direct Web Remoter Servlet</description> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> 如上uk.ltd.getahead.dwr.DWRServlet是dwr的核心,用来处理javascript的对远程方法的调用,还有其他参数请参考相关文档。 然后,需要在dwr.xml配置相应的远程方法(与具体需要在客户端调用的方法相关),如下为演示应用的配置: <dwr> <allow> <convert converter="bean" match="dwr.demo.Goods"/> <create creator="new" javascript="DemoAction" class="dwr.demo.DemoAction"> <include method="query4dwr"/> <include method="copy4dwr"/> <include method="paste4dwr"/> </create> <create creator="new" javascript="DemoFacade" class="dwr.demo.DemoFacade"> <include method="queryList"/> <include method="restore"/> <include method="del"/> </create> </allow> </dwr> 如上有一个转换器(converter)是用来映射dwr.demo.Goods为bean类型,其他转换器类型请参考相关文档;还有两个创建器分别创建javascript中的DemoAction类和DemoFacade类,分别对应dwr.demo.DemoAction类和dwr.demo.DemoFacade,其中定义的方法就可以从javascript中直接调用了。 最后,我们需要在页面中包含相应的javascript: <script src='dwr/interface/DemoAction.js'></script> <script src='dwr/interface/DemoFacade.js'></script> <script src='dwr/engine.js'></script> <script src='dwr/util.js'></script> 如上,dwr/interface/DemoAction.js和dwr/interface/DemoFacade.js是dwr自动生成的javascript文件,包含相应的类及方法,dwr/engine.js是dwr的核心引擎脚本处理客户端调用的转换,dwr/util.js包含了工具函数简化页面处理。
下面以查询为例,看一下dwr的具体使用: DemoAction: public List query4dwr(int type, boolean needClear, HttpServletRequest request) { if (needClear) request.getSession().removeAttribute("dwr.demo.goodsId"); return demoFacade.queryList(type); } demo.jsp: function updateResults() { DWRUtil.removeAllRows("goodsbody"); var type = document.getElementById("type").value; DemoAction.query4dwr(type, true, fillTable); } function fillTable(goods) { document.forms[0].select.checked = false; document.getElementById("totalRecords").innerHTML = goods.length; DWRUtil.addRows("goodsbody", goods, [ addCheckbox, getName, getPrice, getCount]); } 如上,DemoAction.query4dwr(type, true, fillTable)就可以直接调用DemoAction的方法了,这里fillTable是函数,dwr通过回调函数的方式来进行后续处理。比较一下javascript和action中的方法参数,HttpServletRequest是可以不传的,dwr会自动加上,另一个就是回调参数放在最后,这是比较好的方式,其他方式请参考文档。
最后看一下,dwr如何与Struts集成,如下代码: public ActionForward query(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String type = request.getParameter("type"); //或者从form中取值 List goodsList = query4dwr(Integer.parseInt(type), true, request); request.setAttribute("goodsList", goodsList); return mapping.findForward("success"); }
public List query4dwr(int type, boolean needClear, HttpServletRequest request) { if (needClear) request.getSession().removeAttribute("dwr.demo.goodsId"); return demoFacade.queryList(type); } 前一个方法是Struts的方式,但dwr不支持,因此要重构一下在下面的方法才可以被dwr调用。 实际上,只有在方法中需要使用到HttpServletRequest是才需要重构方法,如果不使用HttpServletRequest,我们就可以直接调用业务层的类的方法,这样即简单又方便,如下: demo.jsp: function restore() { DemoFacade.restore(updateResults); }
DemoAction: public synchronized void restore() { goodsList.clear(); initGoods(); }
小结
dwr封装了ajax中与服务端交互的模块,通过直接调用服务端类的方法简化了客户端与服务端的交互。虽然说还缺省类似tag这样的组件,但已经很大程度简化了ajax的开发。
资源 1、示例源程序:下载 2、dwr主站:http://getahead.ltd.uk/dwr 3、ajax主站:http://en.wikipedia.org/wiki/AJAX
|
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1537309
分享到:
相关推荐
dwr结合Struts卡发Ajax
采用dwr+Ajax和struts开发文件上传进度条(网络文章)
在Struts 2.0中使用DWR实现AJAX表单校验。提供完整的实例源码!
DWR是一个很好的Ajax框架,使用他和STRUTS框架结合在一起,实现输入的校验的效果非常好,使用也方便
Dwr+Ajax实例和教程,通过struts1.2+spring2.5的整合而成。希望可以帮助到大家。
Dwr2+Struts2+Spring2.5+Hibernate3实战——用户登录注册系统
下载放到Myeclips里就可以运行、里面包含struts2环境搭建(点击按钮)、struts2+dwr整合(在文本框中输入值后会访问后台,给select动态增加option赋值、点击按钮又会显示会select被选中的option的value和text值)、...
以用户管理为例,结合spring struts hibernate dwr jstl做的实例,struts hibernate dwr 与Spring完全结合,实现用户列表、信息增、删、改、查、维护时用户重名提示等功能,还包括页面自动转码设置(web.xml),...
struts2+dwr整合实例,在文本框中输入值。会到后台查询,给select标签赋值,要是想实现级联下拉框,我想你看完应该能做出来。
我自己做的spring3+struts2+hibernate3+dwr3+spring security3+ajax请求+数据库配置权限 完整实例
整合SSH的Dwr2实例,非常完整.Spring 整合 Dwr Struts ajax
AJAX 入门视频之 Ext 2.0.1 & DWR 1表格实时编辑器实例 AJAX 入门视频之 MyEclipse 6 开发的 Ext 2.0.1 & DWR 1表格实时编辑器示例 2008-1-27 说实话, 我也是特别懒的人, 很早就想看看 Ext, 尤其是做一个实时...
我们一般会使用遵循MVC设计模式的Struts来规范程序结构,使用优秀的ORM组件Hibernate来简化数据库访问操作,使用系统黏合剂Spring来提高开发效率,使用异步访问的Ajax来提高用户体验。而今天我们要做的一个demo是一...
spring-hibernate-dwr做的AJAX操作CRUD实例 环境:myeclipse6.0+jdk1.6 所需lib列表,请自行加入 mysql-connector-java-3.1.7-bin.jar antlr-2.7.6rc1.jar asm-attrs.jar cglib-2.1.3.jar ...
jar包:项目中除了使用了struts2,hibernate3.0和spring1.8以外(用spring2.0的包也可以.不能低于1.8的包.)还是用了junit,ajax,第三方的table组件.等等.所以需要下载相对应的包. 为了上传jar.我专门申请了一个网盘.所有...
2.3.2 struts 2应用基本开发步骤—搭建eportal应用 69 2.3.3 struts 2中集成fckeditor 80 2.3.4 struts 2中集成displaytag 83 2.4 struts 2国际化实现 85 2.4.1 web应用的中文本地化 85 2.4.2 struts 2应用的...