使用dwr实现精准发送消息到页面
帮朋友实现的一个demo,github:git@github.com:frentso/dwrPro.git https://github.com/frentso/dwrPro
使用到的技术::
https://yq.aliyun.com/articles/58187
DWR框架简单实例
DWR:搜索百度百科解释--DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
原因:是因为Javascript无法直接调用java函数,但是为了达到AJAX异步特性(部分刷新页面,减少数据库传输大小)。DWR可以根据java函数产生相应的js(含有函数相应的方法),从而在网页上可以直接通过js调用java函数中的方法类,达到异步效果。
具体方法如下:
[list]
原因:是因为Javascript无法直接调用java函数,但是为了达到AJAX异步特性(部分刷新页面,减少数据库传输大小)。DWR可以根据java函数产生相应的js(含有函数相应的方法),从而在网页上可以直接通过js调用java函数中的方法类,达到异步效果。
具体方法如下:
[list]
- 导包:将dwr.jar文件放到你的webapp的WEB-INF/lib目录下;
- web.xml的配置:
- <servlet>
- <servlet-name>dwr-invoker</servlet-name>
- <display-name>DWR Servlet</display-name>
- <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
- <init-param>
- <param-name>debug</param-name>
- <param-value>true</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>dwr-invoker</servlet-name>
- <url-pattern>/dwr/*</url-pattern>
- </servlet-mapping>
- dwr.xml的配置:
- <dwr>
- <allow>
- <create creator="new" javascript="TestDwr">//-->产生的Js的名称,与jsp中调用名称一致
- <param name="class" value="com.edr.dwr.TestDwr"/>
- </create>
- </allow>
- </dwr>
- jsp上调用产生的js:
- <!-- 导入dwr的JS引擎 -->
- <script type="text/javascript" src="dwr/interface/TestDwr.js"></script>
- <script type="text/javascript" src="dwr/engine.js"></script>
- <script type="text/javascript" src="dwr/util.js"></script>
- <!-- 调用后台类 -->
- <script type="text/javascript">
- //删除一条数据
- function do_delete(name){
- alert("确定要删除?\r\n"+name);
- TestDwr.doDelete(name);//具体方法类
- }
- </script>
http://blog.csdn.net/pangliang_csdn/article/details/68945872
版权声明:本文为博主原创文章,未经博主允许不得转载。
关于dwr具体概念本文不做赘述,只谈实现。在参考了好几篇网上的博文后,把dwr整合到我的项目里面了,跑起来也没有问题。java推送有许多实现方式,诸如comet4j,websocket等等,还有一些收费的比如goeasy等,有兴趣朋友可以看看,废话不多说开始实现。
一:项目的应用场景
在项目里面有一个审批流程,上级领导把一个线索分配给下级实现,中途还可以变更下级,这样一来就会出现原来的下级正在对线索进行操作,而该线索已经不属于他,这时候我们需要一个消息实时推送给原来的下级,告诉他线索不属于你你甭干了,乖乖去玩吧!
二:实现
1:maven项目引入jar包,非maven项目去dwr官网下载
- <dependency>
- <groupId>org.directwebremoting</groupId>
- <artifactId>dwr</artifactId>
- <version>3.0.2-RELEASE</version>
- </dependency>
2:在web.xml配置
- <!-- dwr的配置 -->
- <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>
- <init-param>
- <param-name>activeReverseAjaxEnabled</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>pollAndCometEnabled</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>crossDomainSessionSecurity</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>allowScriptTagRemoting</param-name>
- <param-value>true</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>
3:编写一个java类,用于要通知的页面把用户id传入保存session,这样服务端才能知道给谁发
- public class MessagePush {
- public void onPageLoad(String userId) {
- ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
- scriptSession.setAttribute("userId", userId); //把前台传入的id保存
- DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();
- try {
- dwrScriptSessionManagerUtil.init();
- } catch (ServletException e) {
- e.printStackTrace();
- }
- }
- }
还需要一个DwrScriptSessionManagerUtil工具类
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpSession;
- import org.directwebremoting.Container;
- import org.directwebremoting.ServerContextFactory;
- import org.directwebremoting.WebContextFactory;
- import org.directwebremoting.event.ScriptSessionEvent;
- import org.directwebremoting.event.ScriptSessionListener;
- import org.directwebremoting.extend.ScriptSessionManager;
- import org.directwebremoting.servlet.DwrServlet;
- /**
- * @author Administrator
- *
- */
- public class DwrScriptSessionManagerUtil extends DwrServlet{
- public void init() throws ServletException {
- Container container = ServerContextFactory.get().getContainer();
- ScriptSessionManager manager = container .getBean(ScriptSessionManager.class);
- ScriptSessionListener listener = new ScriptSessionListener() {
- public void sessionCreated(ScriptSessionEvent ev) {
- HttpSession session = WebContextFactory.get().getSession();
- String userId = (String) session.getAttribute("userId");
- System.out.println(">>>>>>>>>a ScriptSession is created!");
- ev.getSession().setAttribute("userId", userId);
- }
- public void sessionDestroyed(ScriptSessionEvent ev) {
- System.out.println(">>>>>>>>a ScriptSession is distroyed");
- }
- };
- manager.addScriptSessionListener(listener);
- }
- }
4:在与web.xml同级的目录下新建一个dwr.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE dwr PUBLIC
- "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
- "http://directwebremoting.org/schema/dwr30.dtd">
- <dwr>
- <allow>
- <create javascript="MessagePush" creator="new">
- <param name="class" value="com.gtcity.web.util.MessagePush"></param>
- </create>
- </allow>
- </dwr>
value="com.gtcity.web.util.MessagePush"代表对应的java类,javascript="MessagePush"代表页面引用的js名称,dwr目的就是要让js调用java方法
5:需要通知的页面
- <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/engine.js"></script>
- <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/util.js"></script>
- <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/interface/MessagePush.js"></script>
- <body style="overflow-x:hidden;" onload="dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);onPageLoad();">
这几个也是必须的
- function onPageLoad(){
- var userId = '${user.userId}';
- MessagePush.onPageLoad(userId);
- }
- //推送信息
- function showMessage(autoMessage){
- alert(autoMessage);
- }
6:具体写消息推送的类,结合自身项目情景,我这里是在上级更改了下级后写的
A:给一个人发
- //修改成功给张三发消息
- final String userId = "2"; //这个我写死张三userId=2
- final String autoMessage = "上级已经更改了这条线索的归属人了!";
- Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
- public boolean match(ScriptSession session){ //验证符合条件的发送人
- if (session.getAttribute("userId") == null){
- return false;
- }else {
- return (session.getAttribute("userId")).equals(userId);
- }
- }
- }, new Runnable(){
- private ScriptBuffer script = new ScriptBuffer();
- public void run(){
- script.appendCall("showMessage", autoMessage);
- Collection<ScriptSession> sessions = Browser
- .getTargetSessions();
- for (ScriptSession scriptSession : sessions){
- scriptSession.addScript(script);
- }
- }
- });
B:给多个人
- //修改成功给张三,李四发消息
- final String userId = "2,3,***";
- final String autoMessage = "上级已经更改了这条线索的归属人了!";
- Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
- public boolean match(ScriptSession session){
- if (session.getAttribute("userId") == null){
- return false;
- }else {
- String attribute = (String) session.getAttribute("userId");
- return (userId.contains(attribute));
- }
- }
- }, new Runnable(){
- private ScriptBuffer script = new ScriptBuffer();
- public void run(){
- script.appendCall("showMessage", autoMessage);
- Collection<ScriptSession> sessions = Browser
- .getTargetSessions();
- for (ScriptSession scriptSession : sessions){
- scriptSession.addScript(script);
- }
- }
- });