首页 > 代码库 > DWR笔记

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=http://www.mamicode.com/” dwr/engine.js ”></script>

<script  src=http://www.mamicode.com/” dwr/util.js ”></script>

<script  src=http://www.mamicode.com/” 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=http://www.mamicode.com/"提交"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 =http://www.mamicode.com/= "Success"){

                                     //此处直接跳转,因为data出不了该dwr的匿名函数

                                      window.location.href =http://www.mamicode.com/"XXXservlet?param=xx¶m=xx";>

                            }

                  });

                            returnfalse;    //此处始终返回false

                  }

         </script>

 

四、       注意点:

<1>.其中的参数debug值为true,意思是:打印调试信息,一般开发时为true,上线时改为false,不该页无所谓。

<2>.配完后无需再写一个servletdwr.jar包里有一套反射机制的类,能读取dwr.xml中配置的参数来匹配请求的参数,自动反射实例化dwr.xml中配置的类。

<3>.测试配置是否成功的方法:浏览器输入:

http//localhost:8080/HelloProject/dwr/engine.js

                   engine.js可以调用内置一个配置,查看是否成功配置。

         <4>.配置dwr.xml时,注意将首页的dwr配置信息的DTD3.0改为2.0,不然不能用。

         <5>.如果是tomcat v7以上的,注意web.xml文件里的配置要多加一组<init-param>,见上文2.2

         <6>.常用技巧:前台发送请求的JS名称一般命名为:后台处理的类名后加”JS”,这样前台调用时可以直接在JS里写:类目 + ”JS” + ”.” + 类中方法名,完成前台对后台的调用。

 

DWR可以简单完成如下功能:

       用户登陆信息验证注册信息验证前台天气预报自动实时刷新股票信息实时刷新 等等… …

DWR笔记