近日在使用DWR框架做一个网页即时推送消息的功能,遇到了两个问题
(1)推送后只有第一次是有用的,必须刷新一次页面之后才可继续用,然后继续刷新。。。(网上查了一些信息,说是用map管理scriptSession,避免新生成多余scriptiSession)
(2)我在推送信息时传了两个角色的ID,但是消息显示的时候不仅推送给那两个角色,我当前登录角色也会马上收到推送信息。
以上两点请帮忙想一下如何解决
下面是我的部分代码:
首先是java代码:
public class PublishMessage {
private UserService userService = AppCtxUtil.getBean(UserService.class);
private PrescriptionConfirmService prescriptionConfirmService = AppCtxUtil
.getBean(PrescriptionConfirmService.class);
// 总部药师向门店推送
public String publishMessageToStore(String message, String recordId) {
String applicant = "";
try {
// 取到所有角色为药师的ID
Conds conds = new Conds();
conds.equal("S_ID", recordId);
PrescriptionConfirm prescriptionConfirm = prescriptionConfirmService.fetchById(recordId);
if (prescriptionConfirm != null) {
applicant = prescriptionConfirm.getUserName() + ",";
String userOrgan = userService.fetchById(applicant.substring(0, applicant.length() - 1)).getOrgan();
Conds uConds = new Conds();
uConds.equal("U.S_ORGAN", userOrgan);
uConds.equal("r.s_rolename", "PHARM_STORE");
List<User> userList = userService.fetchUserRoleByPage(uConds, null, 0, 0);
if (userList != null) {
int userSum = userList.size();
if (userSum == 1) {
User user = userList.get(0);
applicant += user.getId() + ",";
}
}
applicant = applicant.substring(0, applicant.length() - 1);
}
// 推送网页脚本
WebContext wctx = WebContextFactory.get();
ScriptBuffer script = new ScriptBuffer();
script.appendScript("receiveMessagesFromHQ(" + "\"" + message + "\"," + "\"" + applicant + "\"" + ");");
ServerContext sctx = ServerContextFactory.get(wctx.getServletContext());
String contextPath = wctx.getHttpServletRequest().getContextPath();
Collection<ScriptSession> pages = sctx.getAllScriptSessions();
for (ScriptSession session : pages) {
session.addScript(script);
}
} catch (Exception e) {
return "fail";
}
return applicant;
}
}
其次是HTML代码(HTML代码有点多,就贴了部分哈):
$.ajax({
url : "/passPrescription" + "?time=" + $.now(),
type : "put",
data : {
id : id,
remark : remark
},
success : function(obj) {
if (null != obj) {
if (obj.result == 'OK') {
alert("审核通过");
$(".main_div").load(
"/prescriptionConfirmList/1" + "/" + "id" + "?time="
+ $.now());
//发布消息
var message = "处方申请:"+id+"已通过审核,请及时复核!";
var recordId = id;
messageAjax.publishMessageToStore(message,recordId,{callback:function(data){
//alert(data);
if(data=='fail'){
alert("消息发布失败!");
}else{
if(data==''){
alert("通知信息发送失败!");
}else{
alert("已通知申请门店进行复核!");
}
}
}});
} else {
alert(obj.body);
}
}
}
});
web.xml和dwr.xml是在网上照抄的,名字什么对应没问题,如果是这两个XML的问题我随后再附上内容
相关推荐
1. **Reverse AJAX(反向AJAX)**:DWR实现了反向AJAX,即服务器主动向客户端推送数据,而不是传统的客户端请求服务器数据的方式。这使得Web应用可以提供更流畅的用户体验,因为数据更新可以实时推送。 2. **Remote...
DWR3.0是其一个重要版本,提供了对现代浏览器的支持,包括新版的Opera,但同时也注意到在较旧的Internet Explorer(如IE6和IE7)上可能会遇到兼容性问题。 **1. DWR的基本概念与功能** DWR的核心功能是提供一种...
DWR就是服务器推送技术的一种实现,通过使用逆向Ajax,服务器可以在有新数据时即时推送到客户端,而无需用户刷新页面。 在提供的压缩包文件中,"资源"可能包含了这些库的源码文件。分析源码可以帮助开发者深入理解...
5. **实时更新**:DWR的Reverse Ajax特性可以实现服务器向客户端的实时推送,例如聊天应用或股票报价。 **实战应用** 1. **表单无刷新提交**:使用Ajax和DWR,可以在用户填写表单后即时验证数据,无需等待整个页面...
- **概念理解**:DWR不仅支持传统的请求/响应模式,还支持实时通信,即服务器主动向客户端推送数据。这种方式常用于聊天室、实时通知等场景。 - **实现方式**:利用DWR的“Reverse Ajax”特性,可以通过服务器端...