加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

DWR的使用,配置,例子,详解整理

发布时间:2020-12-15 21:53:54 所属栏目:百科 来源:网络整理
导读:DWR的原理: 在安装DWR时会在web.xml中配置一个servlet,这个servlet负责把前台的JS参数封装成JAVA,去调用你的JAVA类, 然后将返回结果(JAVA类型)再翻译成JS生成到你的JSP页面上,给你的错觉就是你用JS直接调用了JAVA方法 实际: JAVA类实现了js与java类

DWR的原理:在安装DWR时会在web.xml中配置一个servlet,这个servlet负责把前台的JS参数封装成JAVA,去调用你的JAVA类,

然后将返回结果(JAVA类型)再翻译成JS生成到你的JSP页面上,给你的错觉就是你用JS直接调用了JAVA方法

实际:JAVA类实现了js与java类之间的接口(DWR根据Java类来动态生成JavaScrip代码,是不是有些像JSP是由servlet生成html页面的方式)

DWR的作用:DWR是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在浏览器中的Javascript代码调用Web服务器上的Java代码,就像在Java代码就在浏览器中一样。还支持一个可选的commons-logging日记操作。

DWR的安装使用:
1、拷贝dwr.jar到项目的lib中
  2、配置web.xml,添加:

  <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> 


  3、新建dwr.xml,配置允许js调用的class
 
 <?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" scope="page"> 
  <param name="class" value="demo.Hello" /> 
  </create> 
  </allow> 
  </dwr> 
  如果有自定义类型可以考虑添加下面的配置在<allow>中 
  <convert converter="bean" match="x.y.Bean"/> 
  现在你必须让DWR知道通过XMLHttpRequest对象,什么对象将会接收请求。这个任务由叫做dwr.xml的配置文件来完成。在配置文件中,定义了DWR允许你从网页中调用的对象。从设计上讲,DWR允许访问所有公布类的公共方法,但在我们的例子中,我们只允许访问几个方法。下面是我们示例的配置文件: 
  <dwr> 
  <allow> 
  <convert converter="bean" match="com.yd.pojos.Userss"/> 
  <create creator="new" javascript="userAction" class="com.yd.imp.UserCol"> <!--不建议class,应该使用param的方式-->
  <include method="getALlUser"/> 
  </create> 
  </allow> 
  </dwr> 
  上面的文件实现了我们例子中的两个目标。首先,<convert>标记告诉DWR将com.yd.pojos.Userss对象的类型转换为联合数组,因为,出于安全的原因,DWR默认的不会转换普通bean。第二,<create>标记让DWR暴露出com.yd.imp.UserCol类给JavaScript调用;我们在页面中使用JavaScript文件被javascript属性定义。我们必须注意<include>标记,它指明了com.yd.imp.UserCol类的哪些方法可用。 
  4、页面添加: 
  <script type="text/javascript" src="dwr/engine.js"></script> 
  <script type="text/javascript" src="dwr/util.js"></script> 
  <script type="text/javascript" src="dwr/interface/Hello.js"></script> 
  说明:Hello.js 对应dwr.xml <create creator="new" javascript="Hello" scope="page"> 
  5、自行设计调用处理方法 
  <script type="text/javascript"> 
  function callback(str) 
  { 
  alert(str); 
  } 
  function test() 
  { 
  Hello.sayHelloTo("zhangsan",callback); 
  } 
  </script>
其他扩展:
多dwr.xml文件的配置 
可能有几种情况,我们一一列举。 一个servlet,多个dwr.xml配置文件;多个servlet,每个servlet对应一个或多个dwr.xml. 
一个servlet,多个dwr.xml配置文件;
java代码: <servlet> 
<servlet-name>dwr-invoker</servlet-name> 
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> 
<init-param> 
<param-name>config-1</param-name> 
<param-value>WEB-INF/dwr1.xml</param-value> 
</init-param> 
<init-param> 
<param-name>config-2</param-name> 
<param-value>WEB-INF/dwr2.xml</param-value> 
</init-param> 
</servlet>
在这种配置下,param-name的值必须以config开头。param-name可以有>=0个。如果没有param-name,那么将会读取 WEB-INF/dwr.xml。如果有大于零个param-name,那么WEB-INF/dwr.xml文件将不会被读取。
多个servlet,每个servlet对应一个或多个dwr.xml
java代码: <servlet> 
<servlet-name>dwr-invoker</servlet-name> 
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> 
<!--用classes/dwr.xml--> 
</servlet> 
<servlet> 
<servlet-name>dwr-invoker1</servlet-name> 
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> 
<init-param> 
<param-name>config-admin</param-name> 
<param-value>WEB-INF/dwr1.xml</param-value> 
</init-param> 
<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> 
<servlet-mapping> 
<servlet-name>dwr-invoker1</servlet-name> 
<url-pattern>/dwr1/*</url-pattern> 
</servlet-mapping>
在这种情况下,我们可以根据J2EE security来控制权限,针对不同url,加不同的角色。
<create>标签负责公开用于Web远程的类和类的方法。
<convert>标签则负责这些方法的参数和返回类型。
convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。
DWR自动地在Java和JavaScript表示之间调整简单数据类型。
这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、 数组和集合类型。
DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,要求显式的配置,<convert>标签就是完成此功能的。
converter="bean"属性指定转换的方式采用JavaBean命名规范,match=""com.dwr.TestBean"属性指定要转换的javabean名称,标签指定要转换的JavaBean属性。


第二个例子:--------------------------------------------------


最近在开发一个OA系统,用JSP实现。里面用到了DWR 这个ajax框架, 版本是2.0.5,到官方网站把dwr.jar下载下来后,开始配置测试用例。

1.将dwr.jar放到OA项目的WEB-INFlib.

2.配置web.xml

              <servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <display-name>DWR Servlet</display-name>
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
    <init-param><!-- org.directwebremoting.servlet.DwrServlet使用时也可以改成uk.ltd.getahead.dwr.DWRServlet -->
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param> 
    <init-param>
      <param-name>allowImpossibleTests</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>


3.测试DWR是否配置正确。启动OA项目,然后输入http://localhost:8080/hxyOA/dwr/,如果能导航到index.html,则说明配置DWR正确

4.在WebRoot目录下新建一个dwr目录。放入engine.js和util.js.

5.写测试类

package com.yuyun.dwr;

public class Test {
public String sayHello(String name)

{

return "Hello," + name;

}

}

6.在WebRoot目录下,新建一个test目录,在test目录下新建testdwr.jsp.内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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>My JSP 'testdwr.jsp' starting page</title>
    
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">    
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page"> 
 
 <script src='/hxyOA/dwr/interface/test.js'></script>  <!-- 此处的test.js,自动生成-->
 <script src='/hxyOA/dwr/engine.js'></script>  <!-- 此处的engin.js和util.js需要包含 -->
 <script src='/hxyOA/dwr/util.js'></script> 
  
 <script type="text/javascript" > 
  function update() 
  { 
   var name = dwr.util.getValue("demoName");
   
   test.sayHello(name,function(data) 
   { 
    dwr.util.setValue("demoReply",data); 
   }); 
    } 
  </script>

  </head>
  
  <body> 
 <div id="tabContents">
  <p>Name:<input type="text" id="demoName"/>  
  <input value="Send" type="button" onclick="update()"/>  
  <br/>  
  ANSWER: <span id="demoReply"></span>   

</p>
   </div> 
 </body>
</html>


7.重启oa项目,输入http://localhost:8080/hxyOA/dwr/,如果发现导航到http://localhost:8080/hxyOA/dwr/index.html,并且有test的相关信息。说明已经产生了test.js,

Classes known to DWR:

  • test(com.yuyun.dwr.Test)

8.输入http://localhost:8080/hxyOA/test/testdwr.jsp进入测试。在文本框中,输入jack,将显示hello,jack.

至此,DWR配置正常,可以写其它与DWR相关的代码了。



使用具体方法如下:
[list]

  • 导包:将dwr.jar文件放到你的webapp的WEB-INF/lib目录下;
  • web.xml的配置:
    Java代码
    1. <servlet>
    2. <servlet-name>dwr-invoker</servlet-name>
    3. <display-name>DWRServlet</display-name>
    4. <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
    5. <init-param>
    6. <param-name>debug</param-name>
    7. <param-value>true</param-value>
    8. </init-param>
    9. </servlet>
    10. <servlet-mapping>
    11. <url-pattern>/dwr/*</url-pattern>
    12. </servlet-mapping>
  • dwr.xml的配置:
    <dwr>
  • <allow>
  • <createcreator="new"javascript="TestDwr">//-->产生的Js的名称,与jsp中调用名称一致
  • <paramname="class"value="com.edr.dwr.TestDwr"/>
  • </create>
  • </allow>
  • </dwr>
  • jsp上调用产生的js:
    <!--导入dwr的JS引擎-->
  • <scripttype="text/javascript"src="dwr/interface/TestDwr.js"></script>
  • <scripttype="text/javascript"src="dwr/engine.js"></script>
  • <scripttype="text/javascript"src="dwr/util.js"></script>
  • <!--调用后台类-->
  • <scripttype="text/javascript">
  • //删除一条数据
  • functiondo_delete(name){
  • alert("确定要删除?rn"+name);
  • TestDwr.doDelete(name);//具体方法类
  • }
  • </script>
  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读