DWR是一个开源的类库,它允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样.
它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet(小应用程序)中获取数据.另外一方面一个JavaScript库可以帮助网站开放人员轻松地利用获取的数据来动态改变网页的内容.
DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码 .这样WEB开发人员就可以在JavaScript里使用Java代码就像它们是浏览器的本地代码(客户端代码 )一样;但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源.出于安全的理由,WEB开发者必须适当地配置哪些Java类可以安全的被外部使用.
这个从JAVA到JavaScript的远程功能方法给DWR的用户带来 非常像传统的RPC机制,就像RMI或者SOAP一样,而且拥有运行在WEB上但是不需要浏览器插件的好处 .
DWR 不认为浏览器/WEB服务器协议是重要的,而更乐于保证编程界面的简单自然.对此最大的挑战就是把AJAX的异步特性和正常JAVA方法调用的同步特性相 结合.在异步模式下,结果数据在开始调用之后的一段时间之后才可以访问.DWR解决了这个问题,允许WEB开发人员使用一个特殊的方法参数来指定一个函 数,以便在数据返回后来回调此函数.
一、配置DWR使用注解功能
如果让dwr使用注解功能需要在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 >
- <!-- 将设定注解的域对象和业务实现类放在下面列表中,中间使用逗号间隔 -->
- < init-param >
- < param-name > classes </ param-name >
- < param-value >
- com.dwr.test.Book,
- com.dwr.test. Bank,
- com.dwr.test. dao.BookDao
- </ param-value >
- </ init-param >
- </ servlet >
- < servlet-mapping >
- < servlet-name > dwr-invoker </ servlet-name >
- < url-pattern > /dwr/* </ url-pattern >
- </ servlet-mapping >
这样设置之后就可以在dwr中使用注解了,非常的方便。
二、DWR提供的注解类型
经常用到的注解主要有:@RemoteProxy、@RemoteMethod、@DataTransferObject和@RemoteProperty。
1. @RemoteProxy和@RemoteMethod
@RemoteMethod 对应于原来dwr.xml文件中的create标签,用于创建DWR所提供的远程方法;而@RemoteMethod对应于create标签中的 <include method=”"/>,用来指定所要暴露的方法名称。我们举例来说明:
- @ RemoteProxy ( name = " bankFunctions " )
- public class Bank {
- @ RemoteMethod
- public void buy () {
- // ...
- }
- }
从上面可以看出,@RemoteProxy表示这个类将用于远程方法,而使用@RemoteMethod指定所要暴露的方法,没有使用@RemoteMethod的方法将不会显示在客户端。
上面的注释使用dwr.xml表示如下:
- < ! DOCTYPE dwr PUBLIC
- " -//GetAhead Limited//DTD Direct Web Remoting 2.0//EN "
- " http://getahead.ltd.uk/dwr/dwr20.dtd " >
- < dwr >
- < allow >
- < create creator = " new " javascript = " bankFunctions " >
- < param name = " class " value = " com.dwr.test. Bank " />
- < include method = " buy " />
- </ create >
- </ allow >
- </ dwr >
如果使用Spring中的DAO或逻辑层则需要进行如下的设置:
- // BookDao
- @ RemoteProxy ( creator = SpringCreator . class ,
- creatorParams = @ Param ( name = " beanName " , value = " bookDao " ) ,
- name = " bookFunctions " )
- public class BookDao {
- @ RemoteMethod
- public void addBook ( Book book ) {
- // ...
- }
- }
通过指定@RemoteProxy中的creator类型为SpringCreator,然后在creatorParams指定对应的beanName名称。对应的dwr.xml文件如下:
- < ! DOCTYPE dwr PUBLIC
- " -//GetAhead Limited//DTD Direct Web Remoting 2.0//EN "
- " http://getahead.ltd.uk/dwr/dwr20.dtd " >
- < dwr >
- < allow >
- < create creator = " spring " javascript = " bookFunctions " >
- < param name = " beanName " value = " bookDao " />
- < include method = " addBook " />
- </ create >
- </ allow >
- </ dwr >
2. @DataTransferObject和@RemoteProperty
@DataTransferObject对应于原来dwr.xml文件中的convert标签,用于转换Java对象;@RemoteProperty则对应于convert标签中的 <param name=”include” value=”" />。
举例说明一下:
- @ DataTransferObject
- public class Book {
- @ RemoteProperty
- private int id ;
- @ RemoteProperty
- private String name ;
- public Book () {
- }
- public int getId () {
- return id ;
- }
- public void setId ( int id ) {
- this . id = id ;
- }
- public String getName () {
- return name ;
- }
- public void setName ( String name ) {
- this . name = name ;
- }
- }
@RemoteProperty可以放在JavaBean中的私有变量上面,也可以放在getXXX方法上面。另外如果想将JavaBean中所有的属性都暴露出来的话,不需要在任何属性上面添加@RemoteProperty注释就可以了。
上面的注释对应的dwr.xml文件如下:
- < ! DOCTYPE dwr PUBLIC
- " -//GetAhead Limited//DTD Direct Web Remoting 2.0//EN "
- " http://getahead.ltd.uk/dwr/dwr20.dtd " >
- < dwr >
- < allow >
- < convert converter = " bean "
- match = " com.javatang.domain.Book " >
- < param name = " include " value = " id, name " />
- </ convert >
- <!-- 或者用下面的方式也可以
- <convert converter="bean" match="com.javatang.domain.Book" />
- -->
- </ allow >
- </ dwr >
关于具体每个注释使用的方法已经所包含的参数可以参考Java Doc。使用DWR2.0的注解极大的简化了原来dwr.xml的配置,非常的方便。
总结:
针对DWR对Javabean的注解分为两类:
Object和Class
针对Class的注解使用:
@RemoteProperty 注解类为远程访问类,相等于create
@RemoteMethod 注解类为远程访问方法,相等于dwr.xml中白名单中注解的方法
注意默认的类中所有的方法为全部在黑名单中。不可作为远程访问对象的。
针对:Object使用@DataTransferObject 和@RemoteProperty注解接口
@DataTransferObject仅仅注解类对象
@RemoteProperty注解属性和方法的应用
使用远程访问类的
package com.dwr.test;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
/**
* 注解此类为远程访问对象的应用
* @author Rabby
*
*/
@RemoteProxy(name = "DWRAnnotation")
public class DWRAnnotation {
/**
* 注解此方法为远程方法的
* @param username
* @return
*/
@RemoteMethod
public String hello(String username) {
return "Hello ," + username;
}
}
web.xml的配置信息:
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<!-- 用于测试dwr的模式 -->
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<!-- 针对注解类必须使用的远程访问对象的描述 -->
<init-param>
<param-name>classes</param-name>
<param-value>
com.dwr.test.DWRAnnotation
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
相应的jsp页面用于测试注解的使用
<head>
<script type='text/javascript'
src='/DWRAnnotation/dwr/interface/DWRAnnotation.js'></script>
<script type='text/javascript' src='/DWRAnnotation/dwr/engine.js'></script>
<script type='text/javascript' src='/DWRAnnotation/dwr/util.js'></script>
<script type="text/javascript">
function helloMessage()
{
var username=DWRUtil.getValue("username");
DWRAnnotation.hello(username,function(data)
{
DWRUtil.setValue("message",data);
});
}
</script>
</head>
<body>
UserName:
<input type="text" id="username" name="username" value="" />
<div id="message"></div>
<input type="button" onclick="helloMessage()" />
</body>
</html>
DWR写的聊天室:
http://blog.csdn.net/caterpillar_here/archive/2006/09/30/1311605.aspx
Dwr小应用:
http://blog.csdn.net/caterpillar_here/archive/2006/09/18/1239538.aspx
相关推荐
ta_lib-0.5.1-cp312-cp312-win32.whl
课程设计 在线实时的斗兽棋游戏,时间赶,粗暴的使用jQuery + websoket 实现实时H5对战游戏 + java.zip课程设计
ta_lib-0.5.1-cp310-cp310-win_amd64.whl
基于springboot+vue物流系统源码数据库文档.zip
GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载
知识图谱
333498005787635解决keil下载失败的文件.zip
【微信机器人原理与实现】 微信机器人是通过模拟微信客户端的行为,自动处理消息、发送消息的程序。在Python中实现微信机器人的主要库是WeChatBot,它提供了丰富的接口,允许开发者方便地进行微信消息的接收与发送。这个项目标题中的"基于python实现的微信机器人源码"指的是使用Python编程语言编写的微信机器人程序。 1. **Python基础**:Python是一种高级编程语言,以其简洁的语法和强大的功能深受开发者喜爱。在实现微信机器人时,你需要熟悉Python的基本语法、数据类型、函数、类以及异常处理等概念。 2. **微信API与WeChatBot库**:微信为开发者提供了微信公共平台和微信开放平台,可以获取到必要的API来实现机器人功能。WeChatBot库是Python中一个用于微信开发的第三方库,它封装了微信的API,简化了消息处理的流程。使用WeChatBot,开发者可以快速搭建起一个微信机器人。 3. **微信OAuth2.0授权**:为了能够接入微信,首先需要通过OAuth2.0协议获取用户的授权。用户授权后,机器人可以获取到微信用户的身份信息,从而进行
基于springboot实验室研究生信息管理系统源码数据库文档.zip
张力控制,色标跟踪,多轴同步,电子凸轮,横切等工艺控制案例。
在Python编程环境中,处理Microsoft Word文档是一项常见的任务。Python提供了几个库来实现这一目标,如`python-docx`,它可以让我们创建、修改和操作.docx文件。本教程将重点介绍如何利用Python进行Word文档的合并、格式转换以及转换为PDF。 1. **合并Word文档(merge4docx)** 合并多个Word文档是一项实用的功能,特别是在处理大量报告或文档集合时。在Python中,可以使用`python-docx`库实现。我们需要导入`docx`模块,然后读取每个文档并将其内容插入到主文档中。以下是一个基本示例: ```python from docx import Document def merge4docx(file_list, output_file): main_doc = Document() for file in file_list: doc = Document(file) for paragraph in doc.paragraphs: main_doc.add_paragraph(paragraph.text) m
基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip
基于springboot餐品美食论坛源码数据库文档.zip
基于springboot亚运会志愿者管理系统源码数据库文档.zip
使用WPF的数据样式绑定,切换对象数据值来完成控件动态切换背景渐变动画效果。 使用动画样式渲染比线程修改性能消耗更低更稳定
基于SpringBoot的企业客源关系管理系统源码数据库文档.zip
基于springboot+vue的桂林旅游网站系统源码数据库文档.zip
基于springboot嗨玩旅游网站源码数据库文档.zip
基于springboot的流浪动物管理系统源码数据库文档.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip