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); }