1、DWR简介
借用百度百科的原话--DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
这段话对于初学者来说有点难理解,按照我的理解是,这是一个可以在JavaScript上调用java方法的框架,并且还有更加强大的推送功能--在java语言里指定调用任何一个jsp/html页面里的任何js函数。从而实现精准推送。
2、开始准备DWR环境
(1)下载jar包
(2)配置工作环境
1、首先在myeclipse/eclipse新建web项目,在导入dwr.jar包后,还需导入另外一个必须的jar包,初学者容易在这里吃亏,如:,接着在web.xml文件里添加如下代码:
<!-- DWR服务器推技术 -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<description>调试DWR,发布系统时应将其设为false</description>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>使用服务器推技术(反转AJAX)</description>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>100</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping> /
2、第二步,在与web.xml文件同一级的目录下新建dwr.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
"http://getahead.org/dwr/dwr30.dtd">
<dwr>
<allow>
<!-- creator="new"指java的创建方法 ,在与spring融合后,这里配置为creator="spring"-->
<!-- javascript="dwrTest"指在javascript中调用java方法的变量名 -->
<!-- scope属性与servlet规范定义的scope属性基本相同,有"application", "session", "request", "page"(默认),还有一个"script" -->
<create creator="new" javascript="dwrTest" scope="application">
<!-- name属性在与spring融合后,值为beanName -->
<param name="class" value="com.jason.test.DwrTest"></param>
<!-- include指可使用的方法,另外还有exclude不可使用的方法 -->
<include method="getHello"/>
<include method="getStudent"/>
<exclude/>
</create>
</allow>
</dwr>
(3)新建一个 java类
这里新建的类用户演示dwr的基础功能--在JavaScript中调用java方法,上一步的第一个create的配置与之对应,其类的代码如下:
package com.jason.test;
import java.util.Date;
public class DwrTest {
public String getHello(){
System.out.println("已执行。。。。");
return "Hello World ,now it is "+new Date();
}
}
(4)在jsp页面配置
在页面上加上如下代码:
<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/dwrTest.js'></script>
前面两条是必须,最后一条是引用在dwr.xml配置的javascript="dwrTest"。
具体的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<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/dwrTest.js'></script>
</head>
<body>
<button name="testDwr" οnclick="testDwr()">DWR测试</button>
<input type="text" id="demo" size="40">
</body>
<script type="text/javascript">
function testDwr(){
dwrTest.getHello(callback); //调用java方法,其参数为回调函数,如是java带参的方法,则在回调函数前放参数值。
}
var callback = function mycall(data){
dwr.util.setValue("demo",data);
}
</script>
</html>
当DWR测试按钮点击后,其页面如下:
至此,dwr最基本的功能已实现。。。
3、DWR推送功能
(1)新建java类
引用上面的配置,首先新建一个DwrScriptSessionManagerUtil类,继承dwr的DwrServlet类,其作用可在页面创建打开时,记录当前用户,但这里只做展示
package com.jason.push;
import org.directwebremoting.Container;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.event.ScriptSessionEvent;
import org.directwebremoting.event.ScriptSessionListener;
import org.directwebremoting.extend.ScriptSessionManager;
import org.directwebremoting.servlet.DwrServlet;
/**
* 加载页面时,获取在线用户
* @author jason
*
*/
public class DwrScriptSessionManagerUtil extends DwrServlet{
private static final long serialVersionUID = 1L;
public void init(){
Container container = ServerContextFactory.get().getContainer();
ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);
ScriptSessionListener listener = new ScriptSessionListener() {
@Override
public void sessionDestroyed(ScriptSessionEvent ev) {
System.out.println("a ScriptSession sessionDestroyed!");
}
@Override
public void sessionCreated(ScriptSessionEvent ev) {
System.out.println("a ScriptSession sessionCreated");
//ev.getSession().setAttribute("userId", userId);
}
};
manager.addScriptSessionListener(listener);
}
}
接着再新建DemoTest类,用于实现主要功能
package com.jason.push;
import java.util.Collection;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;
import org.directwebremoting.WebContextFactory;
public class DemoTest {
public void onPageLoad(String userId){
ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
scriptSession.setAttribute("userId", userId); //记录登录用户
DwrScriptSessionManagerUtil dssm = new DwrScriptSessionManagerUtil();
dssm.init();
}
public void sendMsg(String userid, String message) {
final String userId = userid;
final String msg = message;
final String jsFunc = "receiveMsg"; //推送到页面的JavaScript函数名
System.out.println("sendMsg");
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(jsFunc,msg);
Collection<ScriptSession> sessions = Browser.getTargetSessions();
for (ScriptSession scriptSession : sessions) {
scriptSession.addScript(script);
}
}
});
}
}
(2)配置dwr.xml
加上如下代码即可
<create creator="new" javascript="DemoTest">
<param name="class" value="com.jason.push.DemoTest"></param>
</create>
(3)新建jsp页面
在这里我新建两个jsp页面进行演示,新建push.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'Push.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<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/DemoTest.js'></script>
</head>
<body>
消息:<input type="text" id="msg"/>
<button οnclick="send();">发送</button><br>
接收的消息:<div id="receive"></div>
</body>
<script type="text/javascript">
function init(){
dwr.engine.setActiveReverseAjax(true); //激活ajax反转
dwr.engine.setNotifyServerOnPageUnload(true);
DemoTest.onPageLoad("1");
}
window.onload = init;
function send(){
var msg = document.getElementById("msg").value;
DemoTest.sendMsg("2",msg);
}
var receiveMsg = function receiveMsg(msg){
document.getElementById("receive").innerText += msg+"\r\n";
}
</script>
</html>
新建receive.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'Push.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<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/DemoTest.js'></script>
</head>
<body>
消息:<input type="text" id="msg"/>
<button οnclick="send();">发送</button><br>
接收的消息:<div id="receive"></div>
</body>
<script type="text/javascript">
function init(){
dwr.engine.setActiveReverseAjax(true); //激活ajax反转
dwr.engine.setNotifyServerOnPageUnload(true);
DemoTest.onPageLoad("2");
}
window.onload = init;
function send(){
var msg = document.getElementById("msg").value;
DemoTest.sendMsg("1",msg);
}
var receiveMsg = function receiveMsg(msg){
document.getElementById("receive").innerText += msg+"\r\n";
}
</script>
</html>