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可以简单完成如下功能:
用户登陆信息验证, 注册信息验证, 前台天气预报自动实时刷新, 股票信息实时刷新 等等… …
原文地址:http://blog.csdn.net/alvinnoending/article/details/43084503