`
yangyangmilan
  • 浏览: 30044 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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 onload="dwr.engine.setActiveReverseAjax(true);sendMessage();">

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

<input type="button" value="Send" onclick="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的方法。

 

分享到:
评论

相关推荐

    JavaEE框架总结

    - 创建BeanFactory实例,读取配置文件。 - 根据配置文件创建对象并注入依赖。 - 调整对象状态,如执行初始化方法。 - 将对象交给客户端使用。 - 对象使用完毕后,调用销毁方法。 **3. Spring AOP工作原理**: - ...

    Spring攻略(第二版 中文高清版).part2

    1.15 小结 56 第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决方案 57 2.1.3 工作原理 57 2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 ...

    Spring攻略(第二版 中文高清版).part1

    1.15 小结 56 第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决方案 57 2.1.3 工作原理 57 2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 ...

Global site tag (gtag.js) - Google Analytics