DWR笔记
DWR笔记 一、相关信息: 1.概述:开源框架,允许前端JS用Ajax方式调用后台Java代码。很常用很重要。 2.原理:DWR定义了一套JS,通过JS向后台发请求,请求路径为/dwr/*,在web.xml文件中配置的DWR可以将请求发给相应的servlet,该servlet通过参数用反射机制动态调用java代码,参数配置在dwr.xml文件中。 3.优点:开发效率高,使用框架的开发效率都非常高; 缺点:反射机制是动态加载相应的类的,所以执行效率低,但也低不到哪里去。 权衡:小项目不用DWR,直接用JSP/servlet;大项目用DWR,能简化开发。 4.注意: <1>. DWR版本为3.X和2.X,一般用2.X,比较成熟。下载地址和API在官网。 <2>. DWR需要依赖Apache的commentslogging jar包,需要一起使用。 二、使用简介:导包> 配xml> 改DTD> 定义处理类> 前端引入三个JS> 使用 1.导入DWR 2.x和 Apache commens logging的jar包。 2.配置web.xml文件:可以从官网copy,如下: <servlet> <display-name>DWRServlet</display-name> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> 注意:如果是tomcat v7以上的版本,需啊哟在<servlet>标签里加上一组<init-param>参数,不然会报A request has been denied as a potential CSRF attack,配置如下: <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> 3.创建一个新的dwr的配置文件: 在web.xml相同目录下,创建名为dwr.xml的配置文件,文件内容可以从官网copy到。dwr.xml文件的作用是指定dwr可以操作的java类,不配置的类不能操作以增加安全性。 4.前端使用时要引入三个js文件,这三个文件都包含于dwr.jar,所以只需要在页面加入三句<script>就好: <script src=” dwr/engine.js ”></script> <script src=” dwr/util.js ”></script> <script src=” dwr/interface/XX.js ”></script> // 注意:这里的XX.js是dwr.xml里配置的javascript=”XX”.
三、常用点深入研究(DWR要点): 1. 参数:前后台参数自动转型 (注意:仅限常用类型如String,boolean,int,Date等,自定义类的类型和jdk罕见类型需要配dwr.xml) 2. 返回值:前台用最后一个匿名函数获得返回值。 (注意:不能var一个变量接收dwr前端JS函数的返回值) 3. 对象的操作: <1>. 在dwr.xml中注册要操作的自定义的类,让dwr知道有该类的存在,最常用的是JavaBean规范,在参数中converter设为"bean"; <2>. 然后可以操作了,后台JavaBean对象,前台Json对象,一一对应。 4. 集合的操作(数组的操作): <1>. 同上,在dwr.xml文件中注册自定义类,让dwr知道有一个类存在,最好用javaBean规范; <2>. 然后操作即可,后台集合容器,前台Json数组,一一对应。 5. 不是所有的类的方法都可以调,不想让客户端调用的方法需要在dwr.xml中做如下配置: <include method="test1" /> : 表示只能调用类中的test1(),test2()方法。 <exclude method="test3" /> : 表示不能调用test3()这个方法,其他都可以掉。 6. 需要获得作用域,则可以通过WebContext获取,代码如下 : WebContext wc = WebContextFactory.get(); wc.getSession(); wc.getHttpServletRequest(); wc.getServletContext(); 7. 注意点: 1. dwr是Ajax框架,所以返回的参数data是出不来匿名函数的。即: var name; dwrTest.test1(function(data){ name = data; }); 以上是不可能的。 所以,用前端验证通用方法是submit标签里的onclick函数永远返回false,如果验证成功,做一下两件事:(1).后台的的java代码直接用dwr提供的WebContext获取作用域session、request等等,并设置其值;(2).在前端的dwr参数匿名函数内部直接使用window.location.href跳转。 e.g: java代码: public class Login(){ //登陆验证的方法 public StringloginCheck(String uName,String pwd){ if(uName=="Alvin"){ if(pwd=="mmdog"){ //登陆成功 //用WebContext对象获取dwr提供的servlet的作用域 WebContext wc =WebContextFactory.get(); wc.getSession().setAttribute("user",new User(uName,pwd)); return "Success"; } else{ //密码错误 return "pwd error !"; } } else { //用户名错误 return "uName error !"; } } } 前端JS代码: <input type="submit" name="Sub" value="提交"onclick="return checkIt()"> <script> /* 此函数是始终返回false,验证成功则直接在dwr参数匿名函数内部跳转,此处讲忽略,后台也用WebContext对象设置了session。 */ function checkIt(){ var uName =document.getElementsByName("Username")[0].value; var pwd =document.getElementsByName("Password")[0].value; dwrLogin.loginCheck(uName,pwd,function(data){ alert(data); if(data == "Success"){ //此处直接跳转,因为data出不了该dwr的匿名函数 window.location.href ="XXXservlet?param=xx¶m=xx"; } }); returnfalse; //此处始终返回false } </script>
四、注意点: <1>.其中的参数debug值为true,意思是:打印调试信息,一般开发时为true,上线时改为false,不该页无所谓。 <2>.配完后无需再写一个servlet,dwr.jar包里有一套反射机制的类,能读取dwr.xml中配置的参数来匹配请求的参数,自动反射实例化dwr.xml中配置的类。 <3>.测试配置是否成功的方法:浏览器输入: http://localhost:8080/HelloProject/dwr/engine.js engine.js可以调用内置一个配置,查看是否成功配置。 <4>.配置dwr.xml时,注意将首页的dwr配置信息的DTD从3.0改为2.0,不然不能用。 <5>.如果是tomcat v7以上的,注意web.xml文件里的配置要多加一组<init-param>,见上文2.2 <6>.常用技巧:前台发送请求的JS名称一般命名为:后台处理的类名后加”JS”,这样前台调用时可以直接在JS里写:类目 + ”JS” + ”.” + 类中方法名,完成前台对后台的调用。
DWR可以简单完成如下功能: 用户登陆信息验证, 注册信息验证, 前台天气预报自动实时刷新, 股票信息实时刷新 等等… … (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |