因为业务需要,开始研究关于comet的一些问题。最后在众多框架中选中了dwr作为开发工具,因其开发较为简单,所以整理一下,分享并进行一下摘要。
看了下良格葛的微博,将其归结到这章。
一、 DWR 简介
一个开源的 ajax 框架,前台与后台沟通的桥梁。
二、 DWR 配置
官网下载地址 http://getahead.ltd.uk/dwr/
如果官网打不开,可以先到 http://download.csdn.net/detail/daidetian/4383933 下载 dwr 包,放到 WEB-INF/lib 目录下。
web.xml 中加入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!--dwr servlet-->
< servlet >
< 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 >
< load-on-startup > 1 </ load-on-startup >
</ servlet >
< servlet-mapping >
< servlet-name > dwr-invoker </ servlet-name >
< url-pattern > /dwr/* </ url-pattern >
</ servlet-mapping > </web-app>
下面写个 HelloWorld
1 2 3 4 5 6 7
package deet . dwr.demo ; public class HelloWorld {
public String hello(String name){
return "hello," +name+ "! 第一个 dwr" ;
}
}
客户端要呼叫这个 java 类,就需要做个映射,配置个 dwr.xml
1 2 3 4 5 6 7 8 9 10 11
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd"> <dwr> <allow> <create creator="new" javascript="Hello"> <param name="class" value="deet.dwr.demo .Hello World " /> </create> </allow> </dwr>
creator 设定为 new ,表示使用 Hello 的无参数建构子来生成对象, javascript 设定为 Hello ,表示客户端 JavaScript 程序可以使用 Hello 来呼叫对应的 deet.dwr.demo. HelloWorld 物件。
下面需要写个页面来验证。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title> 第一个 DWR 程序 </title> <script type='text/javascript' src='dwr/interface/Hello.js'></script> <script type='text/javascript' src='dwr/engine.js'></script> <script type='text/javascript' src='dwr/util.js'></script> <script type='text/javascript' src='hello.js'></script> </head> <body> <input id="user" type="text" /> <input type='button' value='哈喽 ' οnclick='hello();' /> <div id="result"></div> </body> </html>
dwr/interface/Hello.js 是由 DWRServlet 根据 dwr.xml 中的设定生成的, engine.js 负责客户端伺服端沟通, util.js 是一些好用的 JavaScript 程序,可以让您少写很多 JavaScript 。
hello.js 是我们自订的函式,按下按钮后,会呼叫当中的 hello() 函式:
1 2 3 4 5 6 7 8
function hello() { var user = $('user').value; Hello.hello(user, callback); } function callback(msg) { DWRUtil.setValue('result', msg); }
${'user'}取得输入字段的 DOM 对象, value 取得当中的字段值,而后呼叫 Hello.hello() ,并将 value 当作参数传送 … 结果是呼叫 Server 端的 Hello Java 对象,当结果传回后,会呼叫 JavaScript 的 callback 函式, DWRUtil 的 setValue() 方法会将传回的 msg 设定给指定 id 的 DOM ,结果就是 …啥! AJAX 的功能在哪 …就这个而言就是发出异步请求,而响应不用 Refresh 页面啦!
遇到问题
解决方案
CSRF Security Error
Web.xml 里如下配置(红字)
<servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>allowScriptTagRemoting</param-name> <param-value>true</param-value> </init-param> </servlet>