基於 Java 的成熟的伺服器推送架構有 DWR 。
DWR是一個開放源碼的使用Apache許可協議的解決方案,它包含伺服器端Java庫、一個 DWR
servlet以及 JavaScript庫。雖然 DWR不是 Java平台上唯一可用的Ajax-RPC 工具包,但是它是最成熟的,而且提供了許多有用的功能。從最簡單的角度來說,DWR是一個引擎,可以把伺服器端Java對象的方法公開給JavaScript 代碼。使用DWR 可以有效地從應用程式代碼中把Ajax的全部請求 -響應迴圈消除掉。這意味著用戶端代碼再也不需要直接處理XMLHttpRequest對象或者伺服器的響應。不再需要編寫對象的序列化代碼或者使用第三方工具才能把對象變成XML。甚至不再需要編寫servlet代碼把 Ajax請求調整成對 Java域對象的調用。
DWR 從 2.0開始增加了 push 功能 , 也就是在非同步傳輸的情況下可以從 Web-Server 端發送資料到 Browser
一個簡單的dwr推送程式
第一步 將dwr相關的jar包匯入到工程
第二步 配置web.xml檔案
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><servlet><servlet-name>dwr-invoker</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class><!-- 設定是否允許使用dwr推送技術 --><init-param><param-name>activeReverseAjaxEnabled</param-name><param-value>true</param-value></init-param><init-param><param-name>maxWaitAfterWrite</param-name><param-value>-1</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dwr-invoker</servlet-name><url-pattern>/dwr/*</url-pattern></servlet-mapping></web-app>
第三步編寫com.im.service.SendPushService類
public class SendPushService {//發送訊息public void send(String msg) {System.out.println("==========調用了send方法==========");ScriptBuffer scriptBuffer = new ScriptBuffer(); //構造js指令碼WebContext webContext=WebContextFactory.get();ScriptSession myScSession = webContext.getScriptSession();scriptBuffer.appendScript("dwrtest(");scriptBuffer.appendData(msg);scriptBuffer.appendScript(")");Util util = new Util(myScSession);util.addScript(scriptBuffer); //向用戶端推送訊息}}
第四步 在dwr.xml檔案定義向外暴露的介面
<allow><create creator="new" javascript="SendPushService"><param name="class" value="com.im.service.SendPushService"/></create></allow>
第五步: 編寫jsp檔案.
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns=" http://www.w3.org/1999/xhtml"><head><base href="${basePath }" /><script type='text/javascript' src='${basePath}dwr/engine.js'></script><script type='text/javascript' src='${basePath}dwr/util.js'></script><script type='text/javascript' src='${basePath}dwr/interface/SendPushService.js'></script><script type="text/javascript">function hello(){SendPushService.send("第一個dwr推程式");}/**由dwr在後台調用這個方法**/function dwrtest(data){alert(data);}</script><title>第一個dwr推程式</title></head><body onload="dwr.engine.setActiveReverseAjax(true);"><input type="button" value="點擊我" onclick="hello();" /></body></html>