浅析dwr

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,分享你的喜悦去吧

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值