上一篇我们讲到dwr的hello world,但是在真实的应用的场景不是如此简单的,在真实的场景中我们需要做如下的事情,用户登录系统,然后给其他人发送信息,还有不同组的人不能通信,这时我们就需要辨别出不同组别,不同组别不能进行相互通信。所以我们要进行修改我们的代码,增加登录以及类别的判断。
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(); } }
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <head> <base href="<%=basePath%>"> </head> <body> <h2>登陆</h2> <form action="DwrControler" method="post"> <table> <tr> <td>用户名</td> <td><input type="text" name="userName" /></td> </tr> <tr> <td>选择会议室</td> <td><select name="groupType"> <option value="1">会议室一</option> <option value="2">会议室二</option> </select></td> </tr> <tr> <td colspan="2"><input type="submit" value="登陆" /></td> </tr> </table> </form> </body> </html>
然后chat.jsp修改为如下
<%@ page language="java" pageEncoding="UTF-8" isELIgnored="false" contentType="text/html; charset=UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <body> <h2> 欢迎${param.userName }来到 <c:if test="${param.groupType==1}"> 会议室一 </c:if> <c:if test="${param.groupType==2}"> 会议室二 </c:if> </h2> <textarea id="text" rows="20" cols="50"></textarea> <input type="text" id="message" /> <input type="button" id="send" value="发送消息"/> <input type="hidden" id="userName" value="${param.userName }" /> <input type="hidden" id="groupType" value="${param.groupType }" /> </body> <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/dwrService.js'></script> <script type='text/javascript' src='scripts/dwr.js?1'></script> </html> 在dwr.js中修改代码,增加初始的时候写入session的功能 dwr.engine.setActiveReverseAjax(true); // 启用dwr反向ajax dwr.engine.setNotifyServerOnPageUnload(true);// 刷新页面后销毁当前scriptsession dwr.engine.setErrorHandler(function() { //alert("错误"); }); // 自定义错误处理方式 window.onload=function(){ //chat.jsp初始化完成登陆dwr写入session dwrService.login(document.getElementById('userName').value,document.getElementById('groupType').value); //绑定点击事件 document.getElementById("send").onclick=function(){ dwrService.sendMessage(document.getElementById("message").value); document.getElementById("message").value=""; }; }; function getMessage(message){ document.getElementById("text").value=document.getElementById("text").value+"\n"+message; }
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中数据的大小,不需要的数据不存储。
原文链接:https://www.f2er.com/ajax/162866.html