由于本人在实际项目开发中有涉及到流程跑批,每个节点顺序点击执行后必须刷新页面才能看到状态是否变更。从客户体验上来说,这点是非常差的,于是想到dwr和websocket实现实时消息推送浏览器,前者是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA方法,就像它就在浏览器里一样,但存在一定的java代码泄露风险,而后者是一种网络双工通讯TCP协议,长连接,需要客户端发起连接。两者实现起来都是相对比较简单的,下面来简单实现下dwr!
实现步骤如下:
1、maven引jar
<dependency> <groupId>org.directwebremoting</groupId> <artifactId>dwr</artifactId> <version>3.0.2-RELEASE</version> </dependency>
2、dwr无xml配置部分
package com.paic.commcc.support.dwr; import org.directwebremoting.Container; import org.directwebremoting.create.NewCreator; import org.directwebremoting.extend.Configurator; import org.directwebremoting.extend.CreatorManager; /** * @author * @Package com.paic.commcc.support.dwr * @Description: dwr的xml配置 * @date 2018/12/11 19:19 */ public class DwrXml implements Configurator { @Override public void configure(Container container) { CreatorManager creatorManager = container.getBean(CreatorManager.class); NewCreator creator = new NewCreator(); creator.setClass("com.paic.commcc.support.dwr.DwrPush"); creator.setJavascript("DwrPush"); creatorManager.addCreator(creator); } }
3、dwr核心配置,注意标色代码部分是第2点的配置类路径
package com.paic.commcc.support.dwr;
import org.directwebremoting.servlet.DwrListener;
import org.directwebremoting.servlet.DwrServlet;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* @author
* @Package com.paic.commcc.support.dwr
* @Description: 远程服务端ajax
* @date 2018/12/11 19:17
*/
@Configuration
public class DwrConfig {
@Bean
public ServletRegistrationBean dwr() {
ServletRegistrationBean servlet = new ServletRegistrationBean(new DwrServlet(), "/dwr/*");
Map<String, String> initParam = new HashMap<>();
initParam.put("crossDomainSessionSecurity", "false");
initParam.put("allowScriptTagRemoting", "true");
initParam.put("classes", "java.lang.Object");
initParam.put("activeReverseAjaxEnabled", "true");
initParam.put("initApplicationScopeCreatorsAtStartup", "true");
initParam.put("maxWaitAfterWrite", "60000");
initParam.put("debug", "true");
initParam.put("logLevel", "WARN");
//自定义配置,org.directwebremoting.impl.StartupUtil#configureFromInitParams name.equals("customConfigurator")
//DwrServlet#init 初始化this.container
initParam.put("customConfigurator", "com.paic.commcc.support.dwr.DwrXml");
servlet.setInitParameters(initParam);
return servlet;
}
@Bean
public ServletListenerRegistrationBean dwrListener() {
return new ServletListenerRegistrationBean(new DwrListener());
}
}
4、dwr推送消息类
package com.paic.commcc.support.dwr; import org.directwebremoting.Browser; import org.directwebremoting.ScriptSession; import org.directwebremoting.ScriptSessionFilter; import org.directwebremoting.ScriptSessions; /** * @author * @Package com.paic.commcc.support.dwr * @Description: dwr推送消息类 * @date 2018/12/11 19:23 */ public class DwrPush { public static void init(String msg) { DwrPush.sendMsgToPage("/dwr.html", msg); } /** * @Description: 推送消息至页面,默认onDwrData函数 * @Param: [html, msg] * @return: void * @Author: * @Date: 2018/12/12 */ public static void sendMsgToPage(final String html, final String msg) { sendMsgToPage(html, "onDwrData", msg); } public static void sendMsgToPage(final String html, final String function, final String msg) { Browser.withPage(html, new Runnable() { public void run() { ScriptSessions.addFunctionCall(function, msg); } }); } public static void sendMsgWithAllSessions(final String msg) { Browser.withAllSessions(new Runnable() { public void run() { ScriptSessions.addFunctionCall("onDwrData", msg); } }); } public static void sendMsgWithFilter(final String msg) { Browser.withAllSessionsFiltered(new ScriptSessionFilter() { @Override public boolean match(ScriptSession scriptSession) { // 可以在这里做一些session过滤 return true; } }, new Runnable() { public void run() { ScriptSessions.addFunctionCall("onDwrData", msg); } }); } }
5、dwr.html页面放static目录下,3个js,其中DwrPush.js的名字跟推送消息类一致,其他两个为框架本身的,必须要引用
<html> <head> <title>dwr html</title> <script type='text/javascript' src='/dwr/engine.js'></script> <script type='text/javascript' src='/dwr/interface/DwrPush.js'></script> <script type='text/javascript' src='/dwr/util.js'></script> <script> window.onload = function () { dwr.engine.setActiveReverseAjax(true);//开启反向ajax dwr.engine.setNotifyServerOnPageUnload(true);//页面关闭通知服务器销毁当前会话scriptsession dwr.engine.setErrorHandler(function(msg) { alert(msg); }); DwrPush.init("dwr hello"); } function onDwrData(data) { alert(data); } </script> </head> <body> dwr html </body> </html>
然后就可以实现后台有节点状态变更时,调用dwr消息推送类刷新浏览器节点状态了,怎么去刷新就看具体实现。
希望对你有所帮助,谢谢~