JAVA学习札记

人生起航点!
posts - 18, comments - 0, trackbacks - 0, articles - 0
  语源科技BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

DWR学习笔记

Posted on 2011-10-10 16:07 簡簡單單 阅读(353) 评论(0)  编辑  收藏 所属分类: Ajax
一.DWR概述   
    DWR是Direct Web Remoting 的缩写。
    DWR 是一个开放源码的使用 Apache 许可协议的解决方案,它包含服务器端 Java 库、一个 DWR servlet 以及 JavaScript 库。虽然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC工具包,但是它是最成熟的,而且提供了许多有用的功能。
    从最简单的角度来说,DWR 是一个引擎,可以把服务器端 Java对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求-响应循环消除掉这意味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML。甚至不再需要编写 servlet 代码把 Ajax 请求调整成对 Java 域对象的调用。 ]
    DWR 是作为 Web 应用程序中的 servlet 部署的。把它看作一个黑盒子,这个 servlet 有两个主要作用:首先,对于公开的每个类,DWR 动态地生成包含在 Web 页面中的 JavaScript。
成的JavaScript包含存根函数,代表Java类上的对应方法并在幕后执行 XMLHttpRequest。这些请求被发送给 DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成 JavaScript。DWR 还提供了帮助执行常见的用户界面任务的 JavaScript 工具函数。
二.使用方法
    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
 它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容. DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码.这样WEB开发人员就可以在JavaScript里使用Java代码就像它们是浏览器的本地代码(客户端代码)一样;但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源.出于安全的理由,WEB开发者必须适当地配置哪些Java类可以安全的被外部使用.
2.1、dwr.xml的配置
1   <dwr>
2     <allow>
3       <create creator="new" javascript="testClass" >
4          <include method="testMethod1"/> 
5     </create>
6    </allow>
7  </dwr>
8 

<allow>标签中包括可以暴露javascript访问的东西。

<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" testClass "属性指定javascript代码访问对象时使用的名称。标签指定要公开给javascriptjava类名。

<include>标签指定要公开javascript的方法。不指定的话就公开所有方法。

<exclude>标签指定要防止被访问的方法。

入门视频:

http://www.verycd.com/groups/@g1897244/737357.topic

 

拓展阅读:

http://baike.baidu.com/view/73492.htm

http://blog.csdn.net/zhaizhanpo/archive/2008/09/27/2988512.aspx

 

http://blog.csdn.net/caterpillar_here/archive/2006/09/06/1186566.aspx

 

三.实例

先下载DWR的JAR包,下载地址:

 

 

http://getahead.ltd.uk/dwr/

将demo(dwr-3.0.0.116.rc1-src\core\impl\demo\web\WEB-INF\lib)实例下的jar文件导入新建项目的web-inf/lib目录下,另外还要加入dwr.jar.

(注意:要加入commons-logging-1.0.4.jar,缺少有时候会报错.)

1.在web.xml文件中注册DWRServlet:负责处理客户端的请求,并呼叫Java物件的是DWRServlet

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 5     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    
 6     <servlet>
 7         <servlet-name>dwr-invoker</servlet-name>
 8         <servlet-class>
 9             org.directwebremoting.servlet.DwrServlet
10         </servlet-class>
11         <init-param>
12             <param-name>debug</param-name>
13             <param-value>true</param-value>
14         </init-param>
15     </servlet>
16     
17     <servlet-mapping>
18         <servlet-name>dwr-invoker</servlet-name>
19         <url-pattern>/dwr/*</url-pattern>
20     </servlet-mapping>    
21 </web-app>

2.编写Java物件,即业务Bean:

1 package helloWorld;
2 
3 public class Service {
4     
5     public String sayHello(String yourName) { 
6         //可以是访问数据库的复杂代码
7         return "Hello World " + yourName;
8         }
9 }

3.编写dwr.xml:客户端要呼叫这个Java物件,传给它参数,而返回一個字串,客戶端再展示这个字串,很神奇吧?其实就是是要告訴DWRServlet这件事情:

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
3 <dwr>
4     <allow>
5         <create creator="new" javascript="service">
6             <param name="class" value="helloWorld.Service" />
7         </create>
8     </allow>
9 </dwr>

4.测试DWR

将代码放入应用服务器(比如Tomcat),启动。然后在地址栏输入http://localhost:8080/你的工程/dwr

5.编写一个jsp
接下来最后一步就是创建一个jsp文件
1) 要引用几个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
 3) js里的service.sayHello和java类的那个有一点区别,多了个参数,用来callback返回的数据
index.jsp
 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <html>
 3     <head>
 4         <title>testDWR</title>
 5         <script type='text/javascript' src='dwr/util.js'> </script>
 6         <script type='text/javascript' src='dwr/engine.js'> </script>
 7         <script type="text/javascript" src="dwr/interface/service.js"></script>
 8         <script type="text/javascript">
 9             function firstDwr() {
10                 service.sayHello("Jorwen", callBackHello);
11             }
12             function callBackHello(data) {
13                 alert(data);
14             }
15         </script>
16     </head>
17     <body>
18         <input type="button" name="button" value="测试" onclick="firstDwr();">
19     </body>
20 </html>
6.地址栏输入http://localhost:8080/你的工程/index.jsp 显示的结果如下: