JAVA相关Word文件下载.docx
《JAVA相关Word文件下载.docx》由会员分享,可在线阅读,更多相关《JAVA相关Word文件下载.docx(21页珍藏版)》请在冰点文库上搜索。
2.客户端JavaScript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
3.当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;
这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。
7.9.3PiggyBack(回传)
PiggyBack(回传)方法是DWR提供的一种“被动式”方法。
服务器端将最新的数据排成队列,然后等待客户端下一次请求,接收到请求后就将等待更新的数据发给客户端。
DWR会使用默认的设置是PiggyBack,所以在默认情况下,启用反向Ajax时,不会导致服务器超载。
7.9.4反向Ajax的配置与实现
要让DWR程序支持反向AJAX,只需要在web.xml中DWRServlet里添加一个初始化参数,添加内容为:
Java代码
1.<
servlet>
2.
<
servlet-name>
dwr-invoker<
/servlet-name>
3.
display-name>
DWR
Servlet<
/display-name>
4.
description>
Direct
Web
Remoter
/description>
5.
servlet-class>
org.directwebremoting.servlet.DwrServlet<
/servlet-class>
6.<
init-param>
7.
param-name>
activeReverseAjaxEnabled<
/param-name>
8.
param-value>
true<
/param-value>
9.
/init-param>
10.<
11.<
12.
/servlet>
13.<
servlet-mapping>
14.
15.
url-pattern>
/dwr/*<
/url-pattern>
16.<
/servlet-mapping>
<
DWRServlet<
DirectWebRemoterServlet<
如果应用的是轮询技术,则需要添加中下参数:
1.param-name>
org.directwebremoting.extend.ServerLoadMonitor<
2.<
org.directwebremoting.impl.PollingServerLoadMonitor<
除了上述配置,为启用反向Ajax,在页面中还需要一些JavaScript代码,即:
dwr.engine.setActiveReverseAjax(true);
只需要上述代码和web.xml文件中的配置,就可以激活反向Ajax了。
处理轮询请求的过程通常是在服务器端编写一些代码,以更新附加到服务器端的每个客户端的会话。
DWR会记录与之联系的每个客户端,分别存储每个客户端的会话。
这一点与通常的HTTP会话不同。
借助于此,可以调用JavaScript代码,下一个轮询请求会通知这些调用。
下面就是一个处理轮询请求的例子,服务器端的发布者实现代码如下:
1.package
com.ajax.dwr;
2.import
java.util.LinkedList;
3.import
java.util.List;
4.import
org.directwebremoting.Browser;
5.import
org.directwebremoting.ScriptSessions;
6.public
class
SendMessage
{
7.public
void
addMessage(String
message)
System.out.println("
有客户请求,消息为:
"
+
message);
messages.add(message);
10.
Browser.withCurrentPage(new
Runnable()
{//启用监听客户端当前页线程
11.
public
run()
{//把数据添加到客户端调用的方法中
ScriptSessions.addFunctionCall("
receiveMessages"
messages);
13.
}
});
15.}
16.private
List<
String>
messages
=
new
LinkedList<
();
17.}
packagecom.ajax.dwr;
importjava.util.LinkedList;
importjava.util.List;
importorg.directwebremoting.Browser;
importorg.directwebremoting.ScriptSessions;
publicclassSendMessage{
publicvoidaddMessage(Stringmessage){
System.out.println("
+message);
messages.add(message);
Browser.withCurrentPage(newRunnable(){//启用监听客户端当前页线程
publicvoidrun(){//把数据添加到客户端调用的方法中
ScriptSessions.addFunctionCall("
messages);
}
});
}
privateList<
messages=newLinkedList<
这里主要通过WebContext类获得DWR应用的WEB上下文,用ServletContext获得DWRServlet的上下文,以及通过WEB上下文获取访问本应用的客户端浏览器的ScriptSession。
一旦获得当前页面的名称,就可以获取当前连接到这个页面的所有会话列表。
然后,启用监听客户端当前页线程,把数据添加到客户端调用的方法中。
下面是在客户端执行的JSP页面文件,代码如下:
html>
head>
3.<
base
href="
%=basePath%>
>
4.<
title>
starting
page<
/title>
5.<
script
type="
text/javascript"
src="
dwr/interface/SendMessage.js"
/script>
dwr/engine.js"
7.<
dwr/util.js"
8.<
function
sendMessage()
var
message=$("
message"
).value;
SendMessage.addMessage(message);
receiveMessages(messages)
16.
chatlog
;
17.
for
(var
data
in
messages)
18.
div>
dwr.util.escapeHtml(messages[data])
/div>
chatlog;
19.
20.
dwr.util.setValue("
list"
chatlog,
{
escapeHtml:
false
21.
22.<
23.<
/head>
24.<
body
onload="
25.input
message:
26.<
input
id="
text"
/>
27.<
button"
value="
send"
onclick="
sendMessage()"
28.<
br>
29.<
div
30.<
/body>
31.<
/html>
basehref="
startingpage<
scripttype="
src="
functionsendMessage()
{
varmessage=$("
SendMessage.addMessage(message);
functionreceiveMessages(messages)
varchatlog="
for(vardatainmessages){
chatlog="
+dwr.util.escapeHtml(messages[data])+"
+chatlog;
dwr.util.setValue("
chatlog,{escapeHtml:
false});
bodyonload="
inputmessage:
inputid="
type="
/>
inputtype="
value="
onclick="
divid="
Util类有很多很方便的方法,其中一个是setValue()。
这个方法类似于在客户端执行document.getElementById("
list"
).innerHTML="
,但是它会关注一些细节,比如目标元素是文本框或者其他元素。
在此,使用所记录的Date域的当前值来更新list的内容。
将第三个参数设为true,可以指定任何HTML内容,这样的话不会破坏客户端的任何内容
要用的java类在wr.xml文件配置内容如下:
create
javascript="
SendMessage"
creator="
new"
scope="
application"
param
name="
class"
com.ajax.dwr.SendMessage"
/param>
/create>
createjavascript="
creator="
scope="
paramname="
如果不希望使用轮询方法,那么可以非常容易地切换为用Comet方法,只需要把web.xml文件中如下代码注释掉:
如果应用PiggyBack方法,则不需要在web.xml中DWRServlet里添加上述初始化参数。
该例子中完整的web.xml配置内容如下;
?
xml
version="
1.0"
encoding="
UTF-8"
web-app
2.4"
xmlns="
3.xmlns:
xsi="
http:
//www.w3.org/2001/XMLSchema-instance"
4.xsi:
schemaLocation="
5.
!
--
配置DWR的核心Servlet
-->
指定DWR核心Servlet的名字
dwr<
指定DWR核心Servlet的实现类
org.directwebremoting.servlet.DwrServlet
指定DWR核心Servlet处于调试状态
debug<
设置使用反向Ajax技术
22.
23.
24.
25.
26.
initApplicationScopeCreatorsAtStartup
27.
28.
29.
30.
31.
--长连接只保持时间
32.
maxWaitAfterWrite<
33.
60<
34.
35.
load-on-startup>
1<
/load-on-startup>
36.<
37.<
指定核心Servlet的URL映射
38.<
39.
40.
41.<
42.<
welcome-file-list>
43.
welcome-file>
index.jsp<
/welcome-file>
44.<
/welcome-file-list>
45.<
/web-app>
xmlversion="
encoding="
web-appversion="
xmlns="
xmlns:
xsi:
--配置DWR的核心Servlet-->
--指定DWR核心Servlet的名字-->
--指定DWR核心Servlet的实现类-->
org.directwebremoting.servlet.DwrServle