DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。在介绍DWR之前呢,先简要介绍一下Ajax。其实和DWR配置的相关性不大,只是希望大家重温一下Ajax的使用。
(1)Ajax的代码部分:
<script type="text/javascript">
var xmlHttpRequest;
<!--根据浏览器类型解析xmlHttpRequest-->
function createXmlHttpRequest() {
if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
}
//POST形式
function doRequestUsingPost() {
url = "GetAndPostXml?";
xmlHttpRequest = createXmlHttpRequest();
xmlHttpRequest.open("POST", url, true);
xmlHttpRequest.onreadystatechange = parseResult;
//让服务器知道请求体中有参数
xmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
xmlHttpRequest.send(stringQuery());//参数表
}
//GET形式
function doRequestUsingGet(){
url="GetAndPostXml?"+stringQuery();
xmlHttpRequest=createXmlHttpRequest();
xmlHttpRequest.open("GET",url,true);
xmlHttpRequest.onreadystatechange=parseResult;
xmlHttpRequest.send(null);
}
//构造参数传递的方法
function stringQuery() {
var userName = document.getElementById("userName").value;
var passWord = document.getElementById("passWord").value;
var strQuery = "userName=" + userName+"&passWord="+passWord;
return strQuery;
}
<!--回调函数-->//在传递的Servlet中out.print(xxx),out.println(xxx)可能获取不到
function parseResult() {
if(xmlHttpRequest.readyState==4&&xmlHttpRequest.status==200){
var responseDiv=document.getElementById("responseDiv");
var xmlDoc=xmlHttpRequest.responseXML;
var content=xmlDoc.getElementsByTagName("Users");
var Info="<table><tr><td>用户</td><td>密码</td><td>性别</td><td>方法</td></tr>";
Info+="<tr><td>"+content[0].childNodes[0].firstChild.data+"</td>";
Info+="<td>"+content[0].childNodes[1].firstChild.data+"</td>";//文本也算一个节点
Info+="<td>"+content[0].childNodes[2].firstChild.data+"</td>";
Info+="<td>"+content[0].childNodes[3].firstChild.data+"</td></tr></table>";
responseDiv.innerHTML=Info;
}
}
</script>
<!--HTML代码部分-->
<div>
<form name="myFrom">
用户名:<input type="text" name="userName" value="" id="userName"/><br/>
(显示)密码:<input type="text" name="passWord" value="" id="passWord"/><br/>
<input type="button" value="使用Get" onclick="doRequestUsingGet()"/>
<input type="button" value="使用Post" onclick="doRequestUsingPost()"/>
</form>
</div>
<div id="responseDiv"></div>
(2)正题!DWR配置:
需要的Jar:commons-logging-1.0.4.jar、dwr.jar
web.xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="dwr" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<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>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
dwr.xml的配置:(与web.xml同目录)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<dwr>
<allow>
<!--设置New创造器-->
<create creator="new" javascript="service1">
<param name="class" value="com.lrl.test.Server" />
</create>
<!--设置dwr匹配的数据Bean-->//区别于Spring的Bean
<convert match="com.xxx.entity.Person" converter="bean">
<param name="include" value="id,name,pet"></param>
</convert>
<convert match="com.xxx.entity.Pet" converter="bean">
<param name="include" value="id,name"></param>
</convert>
<!--如果需要给Spring管理,creator="spring" 且param里 name="beanName"
value="Spring的BeanId"-->//注意,value里的是Spring管理的bean的id!如果不给Spring管理的话,那么依赖注入会失败。所以根据情况而定!
<create creator="spring" javascript="userService">
<param name="beanName" value="userServiceImpl"></param>
<param name="location" value="classpath:beans.xml" />//spring的xml的位置
</create>
</allow>
</dwr>
dwr的HTML代码部分:
<script type="text/javascript" src='/AjaxDwrPro1/dwr/engine.js'></script>//引用内置的,否则会出错。
<script type="text/javascript" src='/AjaxDwrPro1/dwr/util.js'></script>//这个也引用内置的把!
<script type="text/javascript" src='/AjaxDwrPro1/dwr/interface/server1.js'>
</script>//这里的server1就是dwr里面javascript设定的值!路径别错!
<script type="text/javascript">
function dwrTest() {
var userName = document.getElementsByName("userName")[0].value;
var passWord = document.getElementsByName("passWord")[0].value;
server1.checkLogin(userName, passWord, callBack);//第三个参数是回调函数,一般把回调函数都放在最后一个参数的位置上把~~
}
function callBack(date) {//date是调用checkLogin函数后返回的数据。
if (date == true) {
alert("登陆成功!");
document.myForm.submit();
} else if (date == false) {
alert("登录失败");
return false;
}
}
</script>
基本用法就这样,更深层次的应用以后再慢慢补充把~~
总结:
(1)主要配置过程:web.xml+dwr.xml+jsp
(2)jsp里需包含使用到的js文件。详情看本文
(3)dwr与Struts整合需要struts2-dwr-plugin-2.2.1.1.jar包