DWR推送技術

「服務器推送技術」(ServerPushing)是最近Web技術中最熱門的一個流行術語。它是繼「Ajax」以後又一個倍受追捧的Web技術。「服務器推送技術」最近的流行跟「Ajax 」有着密切的關係。javascript

隨着 Ajax技術的興起,讓廣大開發人員又一次看到了使用瀏覽器來替代桌面應用的機會,而且此次機會很是大。Ajax將整個頁面的刷新變成頁面局部的刷新,而且數據的傳送是以異步方式進行,這使得網絡延遲帶來的視覺差別將會消失。html

可是,在瀏覽器中的 Ajax應用中存在一個致命的缺陷沒法知足傳統桌面系統的需求。那就是「服務器發起的消息傳遞」(Server-Initiated Message Delivery)。在不少的應用當中,服務器軟件須要向客戶端主動發送消息或信息。由於服務器掌握着系統的主要資源,可以最早得到系統的狀態變化和事件的發生。當這些變化發生的時候,服務器須要主動的向客戶端實時的發送消息。例如股票的變化。在傳統的桌面系統這種需求沒有任何問題,由於客戶端和服務器之間一般存在着持久的鏈接,這個鏈接能夠雙向傳遞各類數據。而基於HTTP協議的 Web應用卻不行。java

開始就簡單介紹DWR技術的背景,下面來看下一個簡單的Demoweb

附上簡單的目錄結構以及幾個重要的代碼:apache

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爲項目名稱,頁面爲index.html
    Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(page); Util util = new Util(sessions); util.addFunctionCall("dwrtest", ip + ": " + msg);             //dwrtest爲javascript函數 
 } }

固然這裏有些會不理解,dwrtst的做用是幹嗎的,dwrtest爲Javascript函數,後面的Index.jsp中會提到服務器

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的腳本,即後續的index.jsp中調用的!

web.xmlsession

<?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.jspapp

<%@ 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+ "\n" + data; } function send(msg) { if (event.keyCode == 13) { MessagePush.send(msg); } } </script>
</head>
<body onload="dwr.engine.setActiveReverseAjax(true);">
    <textarea style="width: 800px; height: 600px;" id="area">
</textarea>
    <br />
    <input type="text" style="width: 800px;" id="in" onkeyup="send(this.value)" />
</body>
</html>

代碼看到這裏就能夠上先是效果圖了!這個圖是簡單的jpg圖

本案例測試成功後用及時用到項目中:[多是電腦緣由GIF圖製做的不怎麼清晰,見諒....:)]

ping設備IP查看設備狀態,看是否在線...DWR利用很普遍

DOS命令下 ping 192.168.4.10 

而後轉到項目中查看是否一致!

DWR的應用很普遍...相似的,咱們抓取後臺數據實現實時推送!

固然看到這裏,不少IT同胞就會提出Ajax也能夠實現,可是相對比較Ajax呢...

Ajax 輪詢

Ajax隔一段時間(一般使用JavaScript的setTimeout函數)就去服務器查詢是否有改變,從而進行增量式的更新。可是間隔多長時間去查詢成了問題,由於性能和即時性形成了嚴重的反比關係。間隔過短,接二連三的請求會沖垮服務器,間隔太長,務器上的新數據就須要越多的時間才能到達客戶機。

優勢:

a) 不須要太多服務器端的配置。

b) 下降帶寬的負荷(由於服務器返回的不是完整頁面)。

 

 

本文基於 署名 2.5 中國大陸許可協議發佈,歡迎轉載,演繹或用於商業目的,可是必須且在文章頁面明顯位置給出原文連接 Dana、Li(包含連接),具體操做方式可參考此處。如您有任何疑問或者受權方面的協商,請留言或加Q羣!
相關文章
相關標籤/搜索