上一篇我们讲到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的代码如下
<%@ 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;
}
最后修改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中数据的大小,不需要的数据不存储。

dwr引发的血案之四 内存溢出的更多相关文章

  1. vue项目运行或打包时,频繁内存溢出情况问题

    这篇文章主要介绍了vue项目运行或打包时,频繁内存溢出情况的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. 解决运行vue项目内存溢出问题

    这篇文章主要介绍了解决运行vue项目内存溢出问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. jsp dwr级联效果代码

    dwr实现级联代码

  4. 基于JQuery和DWR实现异步数据传递

    这篇文章主要介绍了基于JQuery和DWR实现异步数据传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  5. 一个JSP页面导致的tomcat内存溢出的解决方法

    每请求一次jsp页面就会生成一个对象,这篇文章主要介绍了一个JSP页面导致的tomcat内存溢出的解决方法,需要的朋友可以参考下

  6. DWR  util.js 学习笔记 整理

    util.js包含一些有用的函数function,用于在客户端页面调用,它可以和dwr分开,独立营用于你的系统中。

  7. Java服务假死后续之内存溢出的原因分析

    这篇文章主要介绍了Java服务假死后续之内存溢出,本文给大家分享原因排查和故障解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. dwr 自定义转换器

    到了这里大概就有一个思路就了,就在dwr在进行类型转换的时候抛的异常。希望这篇blog不仅是让你学会了替换dwr里面的参数转换器,还能够从我的解决问题的思考方式获得收获。

  9. bug-4-Ajax内存溢出(递归调用)?

    目录:1.Bug内容2.总结1.Bug内容网上答案说:递归调用,导致内存溢出,前端导致内存溢出,还是有点意思的呢!毫无疑问,是Ajax代码中递归调用了,但是究竟是哪里递归调用了呢?

  10. DWR第一篇之入门示例

    另外一个CoreServlet.js文件需要自己手动建立,其路径必须在dwr/interface,名称必须和dwr.xml配置文件里的javascript属性一致。下面的js脚本调用了CoreServlet里的方法。

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部