今天無意間看到了一篇關于dwr的文章,講的是反向Ajax,想了想半年前一個項目的功能需求如果用它實現就太完美了。
項目要求是:數據庫中A表中如果有了新的數據,系統的管理界面上要實時的顯示出來,提醒給操作人員(是某種報警信息,好像特別重要)。
項目要求是:數據庫中A表中如果有了新的數據,系統的管理界面上要實時的顯示出來,提醒給操作人員(是某種報警信息,好像特別重要)。
當時的實現方法是:讓一Iframe里的頁面每隔多少秒就刷新一次,來監視數據庫A表的變化。這樣客戶端不斷地向服務發送請求,服務器被動的返回客戶端想要的數據。
反向Ajax技術是服務器向客戶端主動的發關數據,很大的減少了服務的負擔。
學習新的知識點就要多寫些自己的Demo,在這里寫一個最簡單的例子,以作筆記:
sendMsg.jsp負責向表中添加數據(更新數據庫),showMsg.jsp用來實時顯示前者添加的信息。
dwr.xml
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr//dwr30.dtd"> <dwr>
<allow>
<create creator="new" javascript="SendMsg" scope="session">
<param name="class" value="com.dwr.bean.SendMsg" />
</create>
</allow>
</dwr>
<allow>
<create creator="new" javascript="SendMsg" scope="session">
<param name="class" value="com.dwr.bean.SendMsg" />
</create>
</allow>
</dwr>
SendMsg.java
package com.dwr.bean;
import java.util.Collection;
import java.util.LinkedList;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;
/**
* DWR反向Ajax示例
* @author ︶ㄣ旺
* @version 1.0
* */
public class SendMsg
{
public static WebContext wctx = null;
//用一個List代表數據庫 來儲存消息
private LinkedList list = new LinkedList();
//調用添加和顯示方法
public void sendMsg(String msg)
{
list.addFirst(msg);
//最多保留10條聊天記錄
if(list.size()>10){
list.removeLast();
}
wctx = WebContextFactory.get();
Util utilThis = new Util(wctx.getScriptSession());
//使用utilThis重置 Id 屬性為 msg 的文本框的內容
utilThis.setValue("msg", "請輸入信息");
String currentPage = "/login/showMsg.jsp"; //要推信息的頁面地址
//獲得所有已經打開此頁面的會話
Collection sessions = wctx.getScriptSessionsByPage(currentPage);
Util utilAll = new Util(sessions);
//將消息從LinkedList中取出來,放放到一個字符串數組中
//在這里遇到一個問題,就是直接用String[] msgs = (String[])list.toArray();時,報類型轉換錯誤
//但如下,給toArray()方法傳遞一個空的數組就不報錯了,求解中
.
String[] msgs = new String[list.size()];
msgs = (String[]) list.toArray(msgs);
//先清空頁面的消息內容,去除ul元素下所有元素
utilAll.removeAllOptions("ul");
//向頁面添加消息內容
utilAll.addOptions("ul", msgs);
}
}
import java.util.Collection;
import java.util.LinkedList;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;
/**
* DWR反向Ajax示例
* @author ︶ㄣ旺
* @version 1.0
* */
public class SendMsg
{
public static WebContext wctx = null;
//用一個List代表數據庫 來儲存消息
private LinkedList list = new LinkedList();
//調用添加和顯示方法
public void sendMsg(String msg)
{
list.addFirst(msg);
//最多保留10條聊天記錄
if(list.size()>10){
list.removeLast();
}
wctx = WebContextFactory.get();
Util utilThis = new Util(wctx.getScriptSession());
//使用utilThis重置 Id 屬性為 msg 的文本框的內容
utilThis.setValue("msg", "請輸入信息");
String currentPage = "/login/showMsg.jsp"; //要推信息的頁面地址
//獲得所有已經打開此頁面的會話
Collection sessions = wctx.getScriptSessionsByPage(currentPage);
Util utilAll = new Util(sessions);
//將消息從LinkedList中取出來,放放到一個字符串數組中
//在這里遇到一個問題,就是直接用String[] msgs = (String[])list.toArray();時,報類型轉換錯誤
//但如下,給toArray()方法傳遞一個空的數組就不報錯了,求解中

String[] msgs = new String[list.size()];
msgs = (String[]) list.toArray(msgs);
//先清空頁面的消息內容,去除ul元素下所有元素
utilAll.removeAllOptions("ul");
//向頁面添加消息內容
utilAll.addOptions("ul", msgs);
}
}
sendMsg.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>DWR反向Ajax示例</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/interface/SendMsg.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/engine.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/util.js'></script>
<script type="text/javascript">
function sendMessage()
{
var msg = $("msg").value;
SendMsg.sendMsg(msg);
}
</script>
</head>
<body>
DWR反向Ajax示例信息添加<br>
輸入信息:<input type="text" id="msg" name="msg" onkeypress="dwr.util.onReturn(event,sendMessage)">
</body>
</html>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>DWR反向Ajax示例</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/interface/SendMsg.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/engine.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/util.js'></script>
<script type="text/javascript">
function sendMessage()
{
var msg = $("msg").value;
SendMsg.sendMsg(msg);
}
</script>
</head>
<body>
DWR反向Ajax示例信息添加<br>
輸入信息:<input type="text" id="msg" name="msg" onkeypress="dwr.util.onReturn(event,sendMessage)">
</body>
</html>
showMsg.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>DWR反向Ajax示例</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/engine.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/util.js'></script>
</head>
<body onload="dwr.engine.setActiveReverseAjax(true);">
DWR反向Ajax示例信息顯示<br>
ul:
<ul id="ul">
</ul>
</body>
</html>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>DWR反向Ajax示例</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/engine.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/util.js'></script>
</head>
<body onload="dwr.engine.setActiveReverseAjax(true);">
DWR反向Ajax示例信息顯示<br>
ul:
<ul id="ul">
</ul>
</body>
</html>
運行效果如圖:
這時showMsg.jsp一直處于失去焦點狀態,卻能實時地顯示服務器端更新的數據