DWR推送技术
“服務(wù)器推送技術(shù)”(ServerPushing)是最近Web技術(shù)中最熱門(mén)的一個(gè)流行術(shù)語(yǔ)。它是繼“Ajax”之后又一個(gè)倍受追捧的Web技術(shù)。“服務(wù)器推送技術(shù)”最近的流行跟“Ajax”有著密切的關(guān)系。
隨著Ajax技術(shù)的興起,讓廣大開(kāi)發(fā)人員又一次看到了使用瀏覽器來(lái)替代桌面應(yīng)用的機(jī)會(huì),并且這次機(jī)會(huì)非常大。Ajax將整個(gè)頁(yè)面的刷新變成頁(yè)面局部的刷新,并且數(shù)據(jù)的傳送是以異步方式進(jìn)行,這使得網(wǎng)絡(luò)延遲帶來(lái)的視覺(jué)差異將會(huì)消失。
但是,在瀏覽器中的Ajax應(yīng)用中存在一個(gè)致命的缺陷無(wú)法滿足傳統(tǒng)桌面系統(tǒng)的需求。那就是“服務(wù)器發(fā)起的消息傳遞”(Server-Initiated Message Delivery)。在很多的應(yīng)用當(dāng)中,服務(wù)器軟件需要向客戶端主動(dòng)發(fā)送消息或信息。因?yàn)榉?wù)器掌握著系統(tǒng)的主要資源,能夠最先獲得系統(tǒng)的狀態(tài)變化和事件的發(fā)生。當(dāng)這些變化發(fā)生的時(shí)候,服務(wù)器需要主動(dòng)的向客戶端實(shí)時(shí)的發(fā)送消息。例如股票的變化。在傳統(tǒng)的桌面系統(tǒng)這種需求沒(méi)有任何問(wèn)題,因?yàn)榭蛻舳撕头?wù)器之間通常存在著持久的連接,這個(gè)連接可以雙向傳遞各種數(shù)據(jù)。而基于HTTP協(xié)議的Web應(yīng)用卻不行。
開(kāi)始就簡(jiǎn)單介紹DWR技術(shù)的背景,下面來(lái)看下一個(gè)簡(jiǎn)單的Demo
附上簡(jiǎn)單的目錄結(jié)構(gòu)以及幾個(gè)重要的代碼:
MessagePush.java
package com.visec;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.locks.ReentrantLock;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.proxy.dwr.Util;
import com.sun.org.apache.bcel.internal.generic.DADD;
import uk.ltd.getahead.dwr.WebContext;
import uk.ltd.getahead.dwr.WebContextFactory;
/**
* MessagePush
* @author Dana·Li
*/
@SuppressWarnings({ "unused", "deprecation" })
public class MessagePush{
@SuppressWarnings("unchecked")
public void send(String msg){
WebContext webContext = WebContextFactory.get();
String ip = webContext.getHttpServletRequest().getRemoteAddr().toString();//獲取客戶端IP
String page = "/DwrInvoker/index.jsp"; //DWR為項(xiàng)目名稱(chēng),頁(yè)面為index.html
Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(page);
Util util = new Util(sessions);
util.addFunctionCall("dwrtest", ip + ": " + msg); //dwrtest為javascript函數(shù)
}
}
當(dāng)然這里有些會(huì)不理解,dwrtst的作用是干嘛的,dwrtest為Javascript函數(shù),后面的Index.jsp中會(huì)提到
dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="MessagePush">
<param name="class" value="com.visec.MessagePush"></param>
</create>
</allow>
</dwr>
MessagePush的作用是映射生成javascrpt的腳本,即后續(xù)的index.jsp中調(diào)用的!
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>activeReverseAjaxEnabled</param-name>
<param-value>TRUE</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>DwrInvoker</title>
<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/util.js"></script>
<script type="text/javascript" src="dwr/interface/MessagePush.js"></script>
<script type="text/javascript">
function dwrtest(data) {
document.getElementById("area").innerHTML = document.getElementById("area").innerHTML+ "
" + data;
}
function send(msg) {
if (event.keyCode == 13) {
MessagePush.send(msg);
}
}
</script>
</head>
<body onload="dwr.engine.setActiveReverseAjax(true);">
<textarea id="area">
</textarea>
<br />
<input type="text" id="in"
onkeyup="send(this.value)" />
</body>
</html>
代碼看到這里就可以上先是效果圖了!這個(gè)圖是簡(jiǎn)單的jpg圖
本案例測(cè)試成功后用及時(shí)用到項(xiàng)目中:[可能是電腦原因GIF圖制作的不怎么清晰,見(jiàn)諒....:)]
ping設(shè)備IP查看設(shè)備狀態(tài),看是否在線...DWR利用很廣泛
DOS命令下 ping 192.168.4.10
然后轉(zhuǎn)到項(xiàng)目中查看是否一致!
DWR的應(yīng)用很廣泛...類(lèi)似的,我們抓取后臺(tái)數(shù)據(jù)實(shí)現(xiàn)實(shí)時(shí)推送!
當(dāng)然看到這里,很多IT同胞就會(huì)提出Ajax也可以實(shí)現(xiàn),但是相對(duì)比較Ajax呢...
Ajax輪詢
Ajax隔一段時(shí)間(通常使用JavaScript的setTimeout函數(shù))就去服務(wù)器查詢是否有改變,從而進(jìn)行增量式的更新。但是間隔多長(zhǎng)時(shí)間去查詢成了問(wèn)題,因?yàn)樾阅芎图磿r(shí)性造成了嚴(yán)重的反比關(guān)系。間隔太短,連續(xù)不斷的請(qǐng)求會(huì)沖垮服務(wù)器,間隔太長(zhǎng),務(wù)器上的新數(shù)據(jù)就需要越多的時(shí)間才能到達(dá)客戶機(jī)。
優(yōu)點(diǎn):
a)不需要太多服務(wù)器端的配置。
b)降低帶寬的負(fù)荷(因?yàn)榉?wù)器返回的不是完整頁(yè)面)。
| 本文基于署名 2.5 中國(guó)大陸許可協(xié)議發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須且在文章頁(yè)面明顯位置給出原文鏈接Dana、Li(包含鏈接),具體操作方式可參考此處。如您有任何疑問(wèn)或者授權(quán)方面的協(xié)商,請(qǐng)留言或加Q群! |
總結(jié)
- 上一篇: css伪类元素加在元素前,CSS伪类:b
- 下一篇: 十大黑客技术论坛