DWR是方便使用AJAX连接JS和JAVA的的一个框架,把服务器端 Java对象的方法公开给 JavaScript代码。
简单说,首先,你搭建DWR时会配置一个servlet,这个servlet记得吧?他就是负责把前台的JS参数封装成JAVA,去调用你的JAVA类,然后将返回结果(JAVA类型)再翻译成JS生成到你的JSP页面上,给你的错觉就是你用JS直接调用了JAVA方法
具体说,DWR应用中,所有的“/dwr/*”的请求都由这个DWRServlet来处理。当Web服务器启动的时候,DWRServlet调用init()方法完成初始化,设置日志级别、实例化DWRServlet用到的单例类、读取包括dwr.xml在内的配置文件。当“/dwr/*”请求送达的时候,DWRServlet的doGet,doPost方法调用processor.handle(req,res)方法,根据请求的URL完成如下事务。
— 请求URL为“/dwr/”根请求:将请求转向“/dwr/index.html”;
— 请求URL为“/dwr/index.html”:列出当前客户端可远程调用的全部Java类,页面仅供调试的时候使用;
— 请求URL为“/dwr/text/*”:为单独的Java类创建测试页面,页面仅供调试的时候使用;
— 请求URL为“/dwr/engine.js”或者“/dwr/uril.js”或者“/dwr/deprecated.js”:从dwr.jar包中读取相应Javascript文件的文件流,显示在页面上;
— 请求URL为“/dwr/interface/*”:将在dwr.xml中定义的Java类及其方法转化为Javascript函数;
— 请求URL为“/dwr/exec/”:处理远程Javascript请求;
— 请求URL为其他:设置http请求状态码为404,返回错误信息为“Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/”。
既定的Java类已经通过DWR转化成可供客户端使用Javascript调用的方法和对象了。接下来就是使用Javascript调用这些暴露的方法和对象了。DWR最大的挑战在于如何将Java同步调用执行的特性与Ajax的异步特性结合起来。
DWR采用了XMLHttpRequest对象的回调机制来解决上述矛盾,即当响应数据从服务器返回是调用用户指定的回调函数。DWR提供两种方式为Javascript指定回调函数,即将回调函数名称加入参数列表,或者在参数列表中增加一个包含数据对象的调用。
上述是帮助理解,下面跟我一起来配置、实现一简单的例子。
(如果是用dwr2.0的jar包,还需要同时导入log4j.jar和commons-loggin.jar,勿忘)
web.xml和dwr.xml放在WEB-INF下!
代码一:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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">
<!-- dwr配置 -->
<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>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
代码二:dwr.xml
<?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>
<!-- dwr校验 -->
<create creator="new" javascript="getTzgw">
<param name="class" value="com.wyebd.util.dwr.Dwrtest" />
</create>
<create creator="new" javascript="getdwr">
<param name="class" value="com.wyebd.util.dwr.Dwrtest"/>
</create>
</allow>
</dwr>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
代码三:后台处理类
package com.wyebd.util.dwr;
public class Dwrtest {
public String Message(String dwr){
String[] message=dwr.split(" ");
String msg="美丽的姑娘,";
for(String i:message){
msg+=i+"::";
}
System.out.println(msg);
return msg;
}
//前后台交互,配置dwr的方法传值,且代替action。JS+dwr
public String processM(String tt) throws Exception{
System.out.println("字符:"+tt);
return "我爱你:"+tt;
}
}
代码四:dwr页面调用
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Dwr测试</title>
<script type='text/javascript'src='<%=basePath%>dwr/interface/getdwr.js'></script>
<script type='text/javascript'src='<%=basePath%>dwr/interface/getTzgw.js'></script>
<script type='text/javascript'src='<%=basePath%>dwr/engine.js'></script>
<script type='text/javascript' src='<%=basePath%>dwr/util.js'></script>
<script type="text/javascript">
function objFunc(obj){
if(obj==null || obj==''){
return false;
}
getdwr.Message(obj,callbackChangeTzgw);//传参并指定一个回调函数
}
function func(obj){
if(obj==null || obj==''){
return false;
}
getTzgw.processM(obj,callbackChangeTzgw);
}
function callbackChangeTzgw(data){//此为回调函数
document.getElementById("dwrstr").innerHTML=data;
}
</script>
</head>
<body>
WelCome!<br>
<input type="button" name="wo ai ni" value="测试dwr" οnclick="objFunc(this.name);"/>
<input type="button" name="wo,ai,ni" value="dwr测试" οnclick="func(this.name);"/>
<div id="dwrstr"></div>
</body>
</html>
注:①变大的字体一定要对应上,是一对一的
②关于jar包,只有dwr.jar时发布无措但访问时会报以下错误:
严重: StandardWrapper.Throwable
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.directwebremoting.dwrp.PollHandler.<clinit>(PollHandler.java:443)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.directwebremoting.impl.ContainerUtil.class$(ContainerUtil.java:97)
at org.directwebremoting.impl.ContainerUtil.setupDefaults(ContainerUtil.java:150)
at org.directwebremoting.impl.ContainerUtil.setupDefaultContainer(ContainerUtil.java:125)
at org.directwebremoting.servlet.DwrServlet.init(DwrServlet.java:73)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1172)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:808)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
... 19 more
③找不到类吧,没关系添加comment-logging.jar
信息: - Java Version: 1.6.0_25
2013-9-6 14:13:11 org.directwebremoting.util.CommonsLoggingOutput info
信息: - Java Vendor: Sun Microsystems Inc.
2013-9-6 14:13:12 org.directwebremoting.util.CommonsLoggingOutput info
信息: Probably not an issue: org.jdom.Document is not available so the jdom converter will not load. This is only an problem if you wanted to use it.
2013-9-6 14:13:12 org.directwebremoting.util.CommonsLoggingOutput info
信息: Probably not an issue: org.jdom.Element is not available so the jdom converter will not load. This is only an problem if you wanted to use it.
④还是会报错,最后添加log4j.jar
log4j:WARN No appenders could be found for logger (org.directwebremoting.util.Logger).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
这样就可以了,当然如果你的dwr.jar的版本足够高,仅用dwr.jar也是可以的
就不用这么麻烦了,此例几段代码直接copy就能用,建立web project 对号入座。
OK,分享你的喜悦去吧