上一篇我们讲到dwr的hello world,但是在真实的应用的场景不是如此简单的,在真实的场景中我们需要做如下的事情,用户登录系统,然后给其他人发送信息,还有不同组的人不能通信,这时我们就需要辨别出不同组别,不同组别不能进行相互通信。所以我们要进行修改我们的代码,增加登录以及类别的判断。 在上一篇的基础上添加LoginInfo类,代码如下:
public class LoginInfo {
private int groupType;
private String userName;
public int getGroupType() {
return groupType;
}
public void setGroupType(int groupType) {
this.groupType = groupType;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public LoginInfo(int groupType, String userName) {
super();
this.groupType = groupType;
this.userName = userName;
}
public LoginInfo() {
super();
}
}
将index.jsp改成登录页,原来的index.jsp改成chat.jsp,DwrControler跳转到chat.jsp,index.jsp的代码如下
登陆
页面效果如下:

文章图片
然后chat.jsp修改为如下
欢迎${param.userName }来到
会议室一
会议室二
在dwr.js中修改代码,增加初始的时候写入session的功能
dwr.engine.setActiveReverseAjax(true);
// 启用dwr反向ajax
dwr.engine.setNotifyServerOnPageUnload(true);
// 刷新页面后销毁当前scriptsession
dwr.engine.setErrorHandler(function() {
//alert("错误");
});
// 自定义错误处理方式
window.οnlοad=function(){
//chat.jsp初始化完成登陆dwr写入session
dwrService.login(document.getElementById('userName').value,document.getElementById('groupType').value);
//绑定点击事件
document.getElementById("send").οnclick=function(){
dwrService.sendMessage(document.getElementById("message").value);
document.getElementById("message").value="";
};
};
function getMessage(message){
document.getElementById("text").value=https://www.it610.com/article/document.getElementById("text").value+"\n"+message;
}
最后修改dwrService的功能,添加登录的方法,修改发送的方法。代码如下:
package com.ww.service;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;
import org.directwebremoting.ScriptSessions;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import com.ww.model.LoginInfo;
public class DwrService {
public DwrService() {
System.out.println("DwrService Init");
}
public void login(String userName,int groupType){
LoginInfo info=new LoginInfo(groupType, userName);
WebContext wctx = WebContextFactory.get();
ScriptSession ss=wctx.getScriptSession();
ss.setAttribute("logininfo", info);
}
public String sendMessage(final String message) {
WebContext wctx = WebContextFactory.get();
ScriptSession ss=wctx.getScriptSession();
final LoginInfo info=(LoginInfo) ss.getAttribute("logininfo");
if(info==null){
return "对不起,你的信息有点问题,请重新登陆";
}
Browser.withPageFiltered(wctx.getContextPath() + "/DwrControler",
new ScriptSessionFilter() {
public boolean match(ScriptSession session) {
LoginInfo in=(LoginInfo) session.getAttribute("logininfo");
if(in==null){
//没有登录信息,则不发送信息过去
return false;
}
System.out.println(info.getGroupType()+":"+in.getGroupType());
if(info.getGroupType()!=in.getGroupType()){
//不是同一会议室的不发送信息
return false;
}
return true;
}
}, new Runnable() {
public void run() {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ScriptSessions.addFunctionCall("getMessage", info.getUserName()+""+sdf.format(new Date())+message );
}
});
return "";
}
}
最后实现的效果如下:

文章图片
在不同的会议室只能看到自己本会议室的消息,一个简单的业务场景demo就这样搭建起来了,但是在真实的业务的场景比这复杂还有很多其他模块组成,启动后就会出现各种各样的问题。其中有个一问题就是
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.ww.DwrControler.doPost(DwrControler.java:33)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
首先是百度上查找outofmemory,说是内存不足,为此专门配置了最大堆内存,但是没有作用。只要人数一上去以后还是会outofmemory,后来使用了jvisualVM查看了下,

文章图片
发现permGen内存满了,后来查找配置了 -XX:MaxPermSize=256m这样后,在dwr发送消息就不会溢出了。permGen在java中是永久代的意思,放置类信息、常量、静态变量等,然后再我们的dwr如果用户过多就会引发permGen oufofmemroy。因为session中设置的数据过多导致的。所以一个是增大我们的permGen大小,还有就是减小session中数据的大小,不需要的数据不存储。
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)