1.DWR是一个Java开源库,帮助你实现Ajax网站,它可以让你在浏览器中的Javascript代码调用Web服务器上的Java,就像在Java代码就在浏览器中一样。
2.DWR主要包括两部分:
在服务器上运行的Servlet来处理请求并把结果返回浏览器。
运行在浏览器上的Javascript,可以发送请求,并动态改变页面。DWR会根据你的java类动态的生成Javascript代码。这些代码的魔力是让你感觉整个Ajax调用都是在浏览器上发生的,但事实上是服务器执行了这些代码,DWR负责数据的传递和转换。
2.1这种Java和Javascript之间的远程调用会让DWR用户感觉像是曾经习惯使用的RMI或SOAP的RPC机制。而且这一过程还不需要额外的浏览器插件。
2.2Java是同步的,而Ajax是异步的。所以当你调用一个远程方法时,你要给DWR一个回调函数,当数据从网络上回来时,DWR会调用这个函数。
3.DWR动态为服务端AjaxService类(Java)生成了一个相应的客户端AjaxService类(Javascript)。这个类被 eventHandler调用。DWR就会去处理整个远程调用的细节,包括在Javascript和Java之间转换参数和返回值。然后在这里例子中,它会执行你提供的回调函数(populateList),这个函数再利用DWR提供的工具函数来更改页面内容。
4.开发流程
如何开始用DWR
4.1. 安装DWR的jar包
下载dwr.jar和commons-logging.jar文件。把它放到你的webapp的WEB-INF/lib目录下。那里可能已经有很多其他的jar文件了。
4.2. 编辑配置文件
<!-- 配置DWR的请求处理类 -->
<servlet>
servlet-name>dwr_invoker</servlet-class org.directwebremoting.servlet.DwrServlet
init-paramparam-namedebugparam-valuefalseservlet-mappingurl-pattern>/dwr/*>
在WEB-INF目录下的web.xml旁边创建一个dwr.xml文件。可以从最简单的配置开始:
<?xmlversion="1.0"encoding"UTF-8"?>
<!DOCTYPEdwrPUBLIC"-//GetAheadLimited//DTD Direct Web Remoting 3.0//EN""http://getahead.org/dwr/dwr30.dtd">
dwrallow<!--allow定义了DWR能够创建和转换的类 -->
createcreator"new"javascript"DwrDate"><!--create为创建器 -->
paramname"class"value"java.util.Date"></paramcreate"DwrService""cn.jbit.dwr.service.DwrService"设定暴露给客户端的方法-->
includemethod"getDwrBean"include设定Bean 转换器-->
convertconverter"bean"match"cn.jbit.dwr.service.DwrBean"convertDWR配置文件定义了那些DWR会创建提供远程调用的Javascript类。在上面的例子中我们定义了两个类来提供远程调用,并为其提供的Javascript类的名字。
在上面我们使用了new创建器,它会调用没有参数的构造函数来创建实例,但是所有JavaBean必须有这一构造函数。还要注意DWR有一些限制:
不要出现Javascript保留关键字;和保留关键字同名的函数指定被排除。
Javascript方法重载是不支持的,所以尽量不要再Java中使用。
4.2.1解释
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAheadLimited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd">
<dwr>
<init><!--用来声明创造bean的类和转换bean的类。-->
<creator id="..."class= />
<converter id= class=/>
</init>
定义了DWR能够创建和转换的类 -->
<allow>
<!--创建器-->
<create creator=".值有new和none new是新创建一个类:none适用于调用静态对象或存在的对象-->." javascript=".在客户端创建的javascript对象命名-->." scope=".作用域默认page-->."> <param name=".参数-->."value="..."/>
<include method=".定义允许访问的方法列表,其他默认不允许访问-->."/>
<exclude method=".定义不允许访问的方法列表,其他默认允许访问--> </create>
<convert converter=".类型转换器-->." match="..."/>
</allow>
<signatures> ... </signatures><!--使用反射来找出在转换时应该用那种类型。-->
</dwr>
--如果需要进行JavaBean对象和JavaScript对象之间的转换,需要在dwr.xml中显式设置
<convert converter="bean"match="www.dwrdemo.DwrBean">
<param name=".<!--参数-->."value="..."/>
</convert>
5. 访问下面的URL
http://localhost:8080/[YOUR-WEBAPP]/dwr/
你可以看见一个页面,里面有第二步中的类。接着往里点,你会看到所有可以调用的方法列表。这个页面是动态生成用来测试的例子。
到 http://localhost:8080/\[YOUR-WEBAPP\]/dwr/ 页面,点击你的类。查看源码,找到执行方法的那几行,把那些文字粘贴到你的HTML或JSP中。
要包括下面这些能产生神奇效果的Javascript文件的链接。
<script src=\'#\'" /[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js'></script> <scriptsrc=\'#\'" /[YOUR-WEBAPP]/dwr/engine.js'></script>
例:<!-- 导入DWR 为Java 对象动态生成的JavaScript 文件-->
<scripttype="text/javascript" src="dwr/interface/DwrDate.js"></script>
"dwr/interface/DwrService.js"></script>
<!--导入DWR 的JavaScript 文件-->
"dwr/engine.js"></script>
"dwr/util.js"></script>
5.1engine.js对DWR非常重要,它是DWR客户端的核心,用来把动态生成的JavaScript对象转换为服务器上的Java对象
dwr.engine.setTimeout(time),以毫秒为单位设置请求超时的时间
dwr.engine.setHttpMethod(method),该方法只能设置两个值POST和GET
dwr.engine.setordered(boolean),Ajax通常都是异步调用,但服务器响应的顺序与调用顺序往往不同,使用dwr.engine.setorfered(true)语句,DWR将保证请求的顺序与服务器响应的顺序一致
util.js文件中包含了一些工具函数,通过这些函数的帮助,将简化JavaScript操作
提供一些基本的页面操作函数,通过这些函数可以方便的操作HTML元素
文件与DWR框架关系不是特别大,可以在任何不同的网页中使用(即便该工程没有DWR支持)
简单的讲
$(ID) = document.getElementById(ID)
使用 $() 使代码更简洁、更清晰
6.多个dwr.xml文件
可以有多个dwr.xml文件(详细信息见web.xml文档)。每个文件中的定义会被加在一起。DWR用这个功能来加载基础配置文件。我们可以看看标准被配置文件来了解dwr.xml的内容。
7.使用DWR的一些技巧
这里有些东西可以帮你使用DWR。如果你也有什么使用技巧,也添加进来吧。
创建一个"Google Suggest"组件
我不建议你做自己的suggest组件。让一些基础的东西工作起来是很容易的,但是让键盘导航正常的工作却不那么容易。有一些库里面已经包含的suggest组件:
Script.aculo.us 里有一个 Autocompleter.Local 函数,可以和DWR整合起来。让Local版的组件和DWR的远程调用结合起来要比直接让Remote版的组件工作起来更容易一些,因为Remote版的组件一般对服务器上的工作又特殊要求。你会可以在DWR的用户邮件列表中找到相关的信息,也可以看Rubens的blog
另外,Rimu Hosting的Peter实现了一个自己的Suggest组件,也是可以和DWR一起用的,查看这里
Pierre Losson写了一个如何把DWR和Commons-Fileupload组件结合起来的文章。很不错,并且源码和演示都有。
改进加载信息
DWR 1.0 中的useLoadingMessage()函数有点问题,你可以自己定义这一信息,但是要小心调用。你也可以把这个函数中的问题修正一下。更多信息可以参看useLoadingMessage()的文档。
使用Server控制台
可以报告出详细的错误信息,这些信息可以帮你找出你的程序错在哪里。如果你的程序出现什么异常,你应该仔细查看你的web容器开始或运行过程中出现的错误信息。一般错误信息会在WARNING或ERROR级别,但是INFO级别的信息也很有用。
如果你的log信息中又什么错误,但是你想知道的更详细的信息,可以查看INFO级别的信息,因为有时错误信息和后台信息会被一起输出到log里。
使用debug/test页面
http://localhost:8080/[YOUR-WEBAPP ]/
开始指南中有基本使用方法。但是一定要记住在发现错误时可以在这些页面找到有用的信息。
访问HttpServletRequest
向回调函数传递参数
通常我们需要把额外的信息传递给callback函数,但是所有的callback函数只有一个参数(远程方法的返回码)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。