背景:用到DWR主要是做服务器推技术;项目以及架构完成,基于SSH的;因为要做推,所以我还得从新把DWR添加进来。
我的项目应用配置如下:
web.xml (其中的调试的初始参数的含义我都写清楚了,就不进行累赘的描述了)
<!-- dwr框架配置文件 -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<!-- 默认的servlet -->
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<!-- 调试DWR,发布系统时应将其设为false -->
<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>org.directwebremoting.extend.ServerLoadMonitor</param-name>
<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>
</init-param>
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>500</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
<!-- 跨域调用配置信息,不是必须的 -->
<!--
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
-->
<!-- 在WEB启动时是否创建范围为application的creator -->
<!--
<init-param>
<description>在WEB启动时是否创建范围为application的creator</description>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
-->
<!-- DWR默认采用piggyback(客户端请求)方式 -->
<!-- comet(长连接)方式 -->
<!-- 在2.0.4之后可以设置长连接的时间通过maxwaitAfterwrite参数进行设置 -->
<!--
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>500</param-value>
</init-param>
-->
<!-- polling(轮询)方式:在comet方式的基础之上,再配置以下参数 -->
<!--
<init-param>
<param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>
<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>
</init-param>
-->
<!-- 设定轮询求情的时间,参数是毫秒。页面默认的请求间隔时间是5秒 -->
<!-- 貌似2.0.2之前的版本的disconnecedTime存在错误,需要添加timeToNextPoll参数(未测试) -->
<!--
<init-param>
<param-name>disconnectedTime</param-name>
<param-value>6000</param-value>
</init-param>
<init-param>
<param-name>timeToNextPoll</param-name>
<param-value>6000</param-value>
</init-param>
-->
<!-- 使用polling和comet的方式 -->
<!--
<init-param>
<param-name>pollAndCometEnabled</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 javascript="DWRService" creator="spring" >
<param name="beanName" value="DWRService"/>
</create>
</allow>
</dwr>
applicaltionContext.xml
先引入命名空间:
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xsi:schemaLocation="
http://www.directwebremoting.org/schema/spring-dwr
http://www.directwebremoting.org/schema/spring-dwr/spring-dwr-3.0.xsd">
再设置做推技术的bean文件 <!-- 配置dwr -->
<bean id="DWRService" class="com.wenice.web.dwr.DWRService">
<dwr:remote javascript="DWRService">
<dwr:include method="send" />
</dwr:remote>
</bean>
java代码:
/**
* 处理发送信息相关
*
* @author 张阳
*
*/
public class DWRService {
/** 保存当前在线scriptSession列表 */
public static HashMap<String, ScriptSession> scriptSessions = new HashMap<String, ScriptSession>();
/**
* 更新scriptSession列表
*
* @param username 用户名
* @param flag 是否存入map中
* @param request 请求
* @return
*/
public String updateUsersList(String username, boolean flag, HttpServletRequest request) {
// 这里取会话(HttpSession)的id为用户id
String httpSessionId = request.getSession().getId();
if (flag) {
this.setScriptSessionFlag(username);
//将HttpSessionid和页面脚本session绑定
scriptSessions.put(httpSessionId, WebContextFactory.get().getScriptSession());
}else{
return null;
}
return httpSessionId;
}
/**
* 将用户id和页面脚本session绑定
* @param userid
*/
public void setScriptSessionFlag(String username) {
WebContextFactory.get().getScriptSession().setAttribute("username", username);
}
/**
* 根据用户id获得指定用户的页面脚本session
* @param userid
* @param request
* @return
*/
@SuppressWarnings("unchecked")
public List<ScriptSession> getScriptSession(String userid, HttpServletRequest request,String server) {
List<ScriptSession> scriptSessionlist = new ArrayList<ScriptSession>();
ScriptSession scriptSessions = null;
java.util.Iterator it = this.scriptSessions.entrySet().iterator();
while(it.hasNext()){
java.util.Map.Entry entry = (java.util.Map.Entry)it.next();
ScriptSession session = (ScriptSession) entry.getValue();
String xuserid = (String) session.getAttribute("username");
if (xuserid != null && xuserid.equals(userid)) {
scriptSessionlist.add(session);
}
}
return scriptSessionlist;
}
/**
* 发送消息
* @param sender 发送者
* @param receiverid 接收者id
* @param msg 消息内容
* @param request
*/
public void send(String sender,String receiverid,String msg,String server,HttpServletRequest request){
List<ScriptSession> sessions = this.getScriptSession(receiverid, request,server);
for (ScriptSession scriptSession : sessions) {
if(null!=scriptSession){
Util util = new Util(scriptSession);
util.setStyle("messageImage", "display", "");
}
}
}
}
java的实现代码其实没有什么重要的;主要就是配置文件的设置。
其中遇到了许多问题;有一些也已经忘记了。都是有问题,就去百度google;
一:大概还记得就是找不到bean这个就是你dwr.xml配置的问题;如果你选用spring进行注入bean;如下:
<create javascript="DWRService" creator="spring" >
<param name="beanName" value="DWRService"/>
</create>
那么param中的name一定要等于:beanName;value是你spring中已经初始化的bean的名称<bean id="DWRService" class="com.wenice.web.dwr.DWRService">
<dwr:remote javascript="DWRService">
<dwr:include method="send" />
</dwr:remote>
</bean>
第二个就是ie没有响应的问题。
二:发现进入ie的时候,后台会报failed to find parameter: batchId;这个问题纠结了我两天
今天发现是我配置文件写的有问题。我将之前写的dwr.xml中的
<convert converter="bean" match="com.wenice.domain.user"/>还有applicationContext.xml中的
<dwr:configuration> <dwr:convert type="bean" class="com.wenice.domain.user" /> </dwr:configuration>删除了。
三:还有就是回调函数的问题;
这个问题你可以百度google就可以解决了。上面的两个问题是我找了很多帖子都没解决的。最后重新抽出项目才发现的问题。
下面上传一下我的小测试用例。大家互相学习学习