今天刚解决了dwr的问题,对于网络上的乱七八糟的问题回答比较无语,今天好好整理一下相关的内容,为自己记忆,也为方便大家使用
1、jar文件调用
添加DWR3.jar
2、.xml文件的内容添加:
(1)web.xml添加如下内容:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class> org.directwebremoting.servlet.DwrServlet</servlet-class>
<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>
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
<init-param>
<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>3000</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
(2)添加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>
<create creator="new" javascript="MessagePush">
<param name="class" value="com.fro.dwr.MessagePush" />
<include method="pageOnLoad" />
</create>
</allow>
</dwr>
3、.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/MessagePush.js">
</script>
<script type="text/javascript">
function showMessage(val){
alert(val);
}
</script>
<body onload="dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);onLoad();">
说明:上面的这些都是必须要有的引入文件以及调用方法,和body onload方法,具体就不详述的,需要的可以提问,或者查资料理解
4、java文件
新建一个dwr文件,存储一下的三个.java 文件:
(1)DwrScriptSessionManagerUtil .java
public class DwrScriptSessionManagerUtil extends DwrServlet{
private static final long serialVersionUID = 1L;
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();
ev.getSession().setAttribute("userId", "admin");
}
public void sessionDestroyed(ScriptSessionEvent ev) {
}
};
manager.addScriptSessionListener(listener);
}
}
(2)MessagePush .java
public class MessagePush {
public void pageOnLoad() {
ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
HttpSession session = WebContextFactory.get().getSession();
String userId = "admin";
scriptSession.setAttribute(userId, userId);
DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();
try {
dwrScriptSessionManagerUtil.init();
} catch (ServletException e) {
e.printStackTrace();
}
}
}
(3)SendMessage .java
public class SendMessage {
public void sendMessageAuto( String message) {
try {
System.out.println("message"+message);
final String autoMessage = message;
Browser.withAllSessionsFiltered(new ScriptSessionFilter(){
public boolean match(ScriptSession session) {
return true;
}
},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);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
5、调用dwr方法
SendMessage msgs = new SendMessage();
msgs.sendMessageAuto("helloword!");
Ok,就可以华丽丽的实现dwr的推送了,这是完整的一套代码,保证正常运行,不过要注意导入jsp的三个js,据说这些是dwr自带和自动生成的js,只需引入即可,路径则为webroot的根路径下,不同项目路径有偏差自己调整。写完了,这些当然还存在一些冗余代码,理解深的可自行删减,修改。