Easy for ajax
需求:结合EasyUI实现实时数据动态刷新
目的:使用dwr反向ajax原理,减少前端主动请求连接,由后台定时推送数据刷新,减少服务器请求压力
1.使用环境及jar包依赖
-
pom.xml 添加
<dependency>
<groupId>org.directwebremoting</groupId>
<artifactId>dwr</artifactId>
<version>3.0.2-RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
- WEB-INFO 下创建 dwr.xml
<?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="new" javascript="NodeInfoDWR" scope="session"> //对应前端使用的 LogManager.js
<param name="class" value="com.oss.dwr.NodeInfoDWR.java"/> //LogManager为调用类
</create>
</allow>
</dwr>
- 添加dwr访问路径至web.xml
<servlet>
<description>Direct Web Remoter Servlet</description>
<display-name>DWR Servlet</display-name>
<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>pollAndCometEnabled</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>
目录结构如下:
-
NodeInfoDWR类
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import com.oss.model.NodeInfo;
public class NodeInfoDWR {
private FreshNodeInfo fresh;
//结束线程
public void stop() {
if (fresh != null) {
fresh.halt();
}
}
//开启刷新数据线程
public void init(String str){
Map map = JsonKit.parse(str,Map.class);
stop();
WebContext wctx = WebContextFactory.get();
ScriptSession scriptSession = wctx.getScriptSession();
fresh = new FreshNodeInfo(scriptSession,map);
fresh.start();
}
}
class FreshNodeInfo extends Thread{
private boolean active = true;
private ScriptSession scriptSession;
private Map map;
public FreshNodeInfo(ScriptSession scriptSession,Map map) {
this.scriptSession = scriptSession;
this.map = map;
}
@Override
public void run() {
while(active){
List<NodeInfo> list = NodeInfo.dao.findAll();
ScriptBuffer scriptBuffer = new ScriptBuffer();
scriptBuffer.appendCall("freshNodeInfo", list);
scriptSession.addScript(scriptBuffer);
try {
TimeUnit.SECONDS.sleep(5); // 定时5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void halt(){
this.active = false;
}
}
-
前端界面引入相关js
<script type="text/javascript" src="/dwr/engine.js"></script>
<script type="text/javascript" src="/dwr/util.js"></script>
<script type="text/javascript" src="/dwr/interface/NodeInfoDWR.js"></script>
<script type="text/javascript">
function freshNodeInfo(infoJson){
$('#grid').datagrid('loadData',$.parseJSON(infoJson));
}
//按钮开关事件
var eova_btn_${button.id} = function(){
if(dwr.engine._activeReverseAjax){
NodeInfoDWR.stop();
dwr.engine.setActiveReverseAjax(false);
console.log('关闭dwr自动刷新');
$.slideMsg($.I18N('关闭自动刷新成功'));
}else{
dwr.engine.setActiveReverseAjax(true);
NodeInfoDWR.init("{}");
console.log('开启dwr自动刷新');
$.slideMsg($.I18N('开启自动刷新成功'));
}
};
</script>
PS:如有雷同,纯属巧合