? 什么是DWR?
dwr(Direct Web Remoting) 作为一个java open source library,可以帮助开发人员完成应用AJAX技术的web程序。它可以让浏览器上的javascript方法调用运行在web服务器上java方法。
? DWR的原理
DWR采取了一种动态生成基于Java类的Javascript代码的新方法来实现和处理Ajax。这样Web开发人员就可以在Javascript里像使用浏览器的本地代码一样使用Java代码,而实际上这些Java代码是运行在服务器端并且可以自由访问Web 服务器资源的。出于安全的考虑,Web开发者必须适当地配置,决定哪些Java类可以安全地被外部使用。(通过dwr.xml配置) 优点:
★把java类转化为javascript类由dwr自动完成,只需简单的配置。 ★应用起来极其简单。开发者不要该服务器代码就可以集成。 ★容易测试。
★及强扩展性。例如与spring集成,只需修改一点代码。 ★自动把java对象转化为javascript对象,并且及易扩展。 ? 传统的请求响应机制
HTTP超文本传输协议是一种请求/响应模式的协议。一个完整的HTTP事务处理过程是:创建TCP/IP连接、客户端发出请求信息、服务器响应信息、结束连接。
我们渴望的请求响应机制
能够C/S模式一样,服务器和客户端之间能够自由方便的交互数据。
? 为什么要使用COMET?
Comet被称为长连接技术,是一种从服务器端向多个浏览器主动推数据的一种技术 。 随着Ajax在Web程序开发技术里建立了牢固的位置,出现了几种常见的Ajax使用模式。例如,Ajax通常用于响应用户输入来使用新数据修改局部页面。但有时候,Web程序的用户界面需要根据偶尔的异步服务器端事件来更新,而不需要用户动作 -- 例如,在Ajax聊天程序里显示其他用户输入的一条新消息。由于Web浏览器和服务器间的HTTP连接只能由浏览器建立,服务器不能“推”更改数据到浏览器。 Ajax程序有两个解决该问题的基本方式:浏览器每隔几秒请求服务器来获得更改,或者服务器维持与浏览器的连接并且传递数据。 对长连接技术的呼唤来自它可感知的高效。客户端不会产生轮询方式特有的传输浪费,一旦事件发生,就会被发布到客户端。 ? 如何实现长连接?
DWR 2开始就新引入的概念为反转Ajax。该机制将服务端事件“推”给客户端。客户端DWR代码透明的处理连接建立和应答解析,所以从开发人员的角度来看,事件可以从服务端Java代码简单的发布到客户端。 一个称为ServerContext的接口提供DWR的反转Ajax魔法。ServerContext知道查看当前页面的所有Web客户端并且可以提供一个ScriptSession用来与每个客户端交流。 实现就是客户端向服务器请求后,服务器不立即回应,从而导致一个http长连接,等到有更新数据的时候,再利用这个连接“主动”向客户端回送。 下面是一个非常简单的dwr应用,让服务器每隔5秒钟推送1次数据到客户端显示。 ? Web.xml
xmlns=\
xmlns:xsi=\ xsi:schemaLocation=\ http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd\
\ \
? Publisher.java 需要dwr.jar包
public class Publisher implements Runnable { private ServerContext sctx; public Publisher() {
System.out.println(\初始化Publisher\
// WebContext类获得DWR应用的WEB上下文 WebContext wctx = WebContextFactory.get();
sctx = ServerContextFactory.get(wctx.getServletContext()); ServletContext获得DWRServlet的上下文 new Thread(this).start(); }
public void onPush(String text) {
// 用 ScriptBuffer script = new ScriptBuffer();
script.appendScript(\//将调用界面的receive回调函数
Set sessions = new HashSet(); // 从Java代码推JavaScript片段到客户端。 sessions.addAll(sctx.getAllScriptSessions()); // 获取所有客户端, 数据 System.out.println(\当前客服端数量:\ Iterator it = sessions.iterator(); while (it.hasNext()) {
ScriptSession session = (ScriptSession) it.next(); session.addScript(script); } }
Public void run(){ // 每5秒向客户端推送数据 while (true) { try {
Thread.sleep(5000);
SimpleDateFormat sdf = new SimpleDateFormat(\
this.onPush(\当前系统时间:\e.printStackTrace(); } } } }
? Receive.jsp
<%@ page language=\
? 关于ScriptSession的几点说明
在DWR中,我们可以通过WebContextFactory.get()来取得一个WebContext对象,进而通过WebContext的getScriptSession()取得ScriptSession对象。 ScriptSession不会与HttpSession同时创建,当我们访问一个页面的时候,如果是第一次访问,就会创建一个新的HttpSession,之后再访问的时候,就会保持当前的Session,即使是刷新,也能保持当前的HttpSession。但是,ScriptSession不同,第一次访问,会创建一个ScriptSession,但是,如果你刷新,就会创建一个新的ScriptSession.