dwr总结

dwr被称之为“反向ajax”,其实是一种假象。特别在它的3种方式中的“polling”---轮询这种方式中表现最明显,就是客户端不断请求服务端询问服务端是否有信息要输出到客户端。

 

一、dwr的3种方式:

 

1、piggyback(dwr默认的配置):如果后台有什么信息要推送到浏览器,就需要等下次浏览器发起ajax请求时,将该信息附加在请求的信息之后推送到浏览器。(当启用反向ajax是不会导致服务器超载的)

 

web.xml配置:

 

<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>
	    <!-- DWR默认采用piggyback方式 -->  
	    <init-param>  
	        <param-name>pollAndCometEnabled</param-name>  
	        <param-value>true</param-value>  
	    </init-param>  
<!-- 毫秒数。页面默认的请求间隔时间是5秒 -->  
	    <!--    
	    <init-param>  
	        <param-name>disconnectedTime</param-name>  
	        <param-value>60000</param-value>    
	    </init-param>  
	     --> 
		<init-param>
			<param-name>crossDomainSessionSecurity</param-name>
			<param-value>false</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>
	<!-- dwr 配置结束-->
 

 

2.polling(轮询):由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。

 

 

在piggybackl基础上再加上:

 

<init-param>  
	 <param-name>activeReverseAjaxEnabled</param-name>  
	 <param-value>true</param-value>  
 </init-param>  

 

 3、comet(长连接):当服务端和客户端建立连接之后,将页面内容输出到浏览器后,对应的连接并不关闭,而是暂时的挂起,当服务端有新内容需要传到浏览器时,该连接激活传输数据。 但是由于服务端所能提供的链接数是一定的,当很多人访问浏览器的该页面时,连接没有关闭会造成新的连接请求不能接入,从而影响服务质量。

 

在polling配置的基础上,再加上:

 

<init-param>  
	        <param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>  
	        <param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>  
</init-param>

 

二、dwr.xml文件的配置:

 

dwr我一般用在spring项目中,dwr.xml文件配置采取spring方式:

 

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr> 
   <allow> 
      <create creator="spring" javascript="messagePush"> 
          <param name="beanName" value= "messagePush"><!--交给spring管理后才可以这样写-->
          	 <include method="sendMessage,updateUserList"/>
          </param> 
       </create>  
       <convert match="com.luo.model.User" converter="bean"></convert>
   </allow> 
</dwr> 

 

三、dwr在服务端的使用

dwr的核心就是WebContext,在服务端我就是为了得到一个客户端的util它的获取步骤是:

 

WebContext context = WebContextFactory.get();
ServletContext application = ServerContextFactory.get(context.getServletContext);
Collection<ScriptSessions> scriptSessions = application.getScriptSessionByPage(context.getCurrentPage());
Util util = new Util(scriptSessions );
 

 

 

 

util可以使用util.setValue(id,value);来给客户端的div等赋值

 

util.removeAllOptions(ulId);
util.addOptions(ulId,userList,userId,username);//userList是一个user的list集合,uuserId和username是user的两个属性,将作为option中的value和text被添加。
 

 

 

还有种方法是在客户端定一个js的function demo,然后在服务端调用它。

 

ScriptBuffer buffer = new ScriptBuffer();
buffer.appendScript("demo(").appendData("你好").appendScript(");");
util.addScript(buffer);
 

或者:

 

for(ScriptSession session:pages){
         session.addScript(buffer);
  }
 

 

 

 

 

 

你可能感兴趣的:(DWR)