dwr实例和一点小结

一、web.xml

 

 <servlet>

     <servlet-name>dwr-invoker</servlet-name>

<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>

<init-param>

<param-name>debug</param-name>

<param-value>true</param-value>

</init-param>

 

<!-- DWR默认采用piggyback方式 -->

 

<!-- 使用polling和comet的方式 -->

<init-param>

<param-name>pollAndCometEnabled</param-name>

<param-value>true</param-value>

</init-param>

 

<!-- comet方式 -->

<!-- 

<init-param>

<param-name>activeReverseAjaxEnabled</param-name>

<param-value>true</param-value>

</init-param>

-->

 

<!-- polling方式:在comet方式的基础之上,再配置以下参数 -->

<!-- 

<init-param>

<param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>

<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>

</init-param>

-->

 

<!-- 毫秒数。页面默认的请求间隔时间是5秒 -->

<!-- 

<init-param>

<param-name>disconnectedTime</param-name>

<param-value>60000</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>

 

 

这里有三种模式

1.piggyback。被动模式,不会增加连接的开销,一个连接请求后,把积累的信息发出去,然后被动的等待下一次连接。缺点,下一次连接的时间并不确定,可能根本就没有了,造成数据丢失或者不及时展现。

2.comet。 主动模式,客户端不停向服务器建立连接,如果有数据则可以马上带回。缺点是大部分的连接并没有数据带回,比较浪费。

3.polling。主动模式,与comet差不多,可以手工控制定时请求的时间间隔。

三种模式在web.xml里的配置决定。

 

 

二、dwr.xml

新建dwr.xml文件,路径和web.xml路径一致。

<dwr>

<create creator="new" javascript="DWRHelper">

<param name="class" value="com.cjm.web.dwr.DWRHelper"/>

<include method="addMessage"/>

<include method="test"/>

</create>

 

<convert converter="bean" match="com.cjm.web.dwr.Message">

<param name="include" value="id,text"/>

</convert>

 

</dwr>

 

1.create   creator表示实例的创建方式常见有new,spring,以上用new来做例子。内容比较简单。

2.convert  传递的参数转换。

 

三.java代码

1.Message的源码

public class Message {

private long id = System.currentTimeMillis();

private String text;

 

public Message(){

 

}

 

public Message(String newText){

text = newText;

}

 

public long getId() {

return id;

}

public void setId(long id) {

this.id = id;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

}

 

2.DWRHelper类源码

public class DWRHelper {

private static LinkedList<Message> messages = new LinkedList<Message>();

private static ReentrantLock lock = new ReentrantLock(); //JDK5锁

 

public void addMessage(String text){

try{

lock.lock();

 

if(text!=null && text.trim().length()>0){

messages.addFirst(new Message(text));

if(messages.size()>10){

messages.removeLast();

}

}

}catch(Exception ex){

ex.printStackTrace();

}finally{

lock.unlock();

}

 

//获得DWR上下文

WebContext webContext = WebContextFactory.get();

 

//获取当前页面URL,比如/ext3/test_tag.jsp

String currentPage = webContext.getCurrentPage();

 

//当前脚本sessin

ScriptSession scriptSession = webContext.getScriptSession();

 

//设置页面控件的值

Util util = new Util(scriptSession);

util.setValue("text", ""); //这里是清空页面输入框的值

 

//设置脚本sessin的属性值

scriptSession.setAttribute("uid", "cjm");

 

//获取脚本session的属性值

for(Iterator it=scriptSession.getAttributeNames();it.hasNext();){

String attrName = (String)it.next();

System.out.println(attrName + "=" + scriptSession.getAttribute(attrName));

}

 

//获取所有浏览当前页面的脚本session

Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(currentPage);

 

Util utilAll = new Util(sessions);

 

//执行客户端脚本 

//这里就在拼写 js 语句

ScriptBuffer script = new ScriptBuffer();

script.appendScript("clientFunction(")

 .appendData(scriptSession.getAttribute("uid"))

 .appendScript(");");

 

for(ScriptSession session: sessions){

session.addScript(script);

}

 

//更新这些脚本session的一些元素

utilAll.removeAllOptions("messages");

utilAll.addOptions("messages", messages, "id", "text");

}

 

}

 

 

四、前段页面

<%@ page language="java" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

<script type='text/javascript' src='/ext3/dwr/engine.js'></script>

<script type='text/javascript' src='/ext3/dwr/util.js'></script>

<script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script>

  </head>

  

  <!-- 通过 dwr.engine.setActiveReverseAjax(true); 启动该页面的Reverse Ajax功能  -->

  <body οnlοad="dwr.engine.setActiveReverseAjax(true);sendMessage();">

  <p>输入信息: <input id="text" οnkeypress="dwr.util.onReturn(event, sendMessage)" /> 

<input type="button" value="Send" οnclick="sendMessage()" /></p>

 

<script type="text/javascript">

    function sendMessage() {

      DWRHelper.addMessage(dwr.util.getValue("text"));

    }

</script>

 

<hr/>

<select id="messages"></select>

 

  </body>

</html>

 

五、小结

1.dwr.xml是关键,定义了java向js暴露的方法,和传递的参数。

2.<script type='text/javascript' src='/ext3/dwr/engine.js'></script>

<script type='text/javascript' src='/ext3/dwr/util.js'></script>

<script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script> 

都是动态生成的js,其中DWRHelper.js就是dwr.xml中转换过来的

3.页面用DWRHelper.addMessage向后台发送数据,后台用session.addScript(script)调用前段js的方法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值