JavaWeb监听器学习笔记

来源:互联网 发布:趋势操盘软件 编辑:程序博客网 时间:2024/05/20 10:16

1、监听域对象自身的创建和销毁时间的监听器,对应方法createdestroy

ServletContextapplication:一个web应用只有一个)HttpSession   ServletRequest

对应接口:在后面加上Listener

 

ServletContextListener主要用途:定时器、全局属性对象、全局数据库链接、加载缓存信息等。

Web-xml中只能配置一个

创建:启动服务器

销毁:关闭服务器

可以通过event获取servletContext,通过它可以调用getInitParametername)获得web.xmlcontext paramnamevalue)配置的参数;还可以调用setapplication中设置属性

 

HttpSessionListener主要用途:统计在线人数、记录访问日志

Web-xml中可配置多个

创建:启动服务器并访问web应用的一个页面

销毁:1、关闭服务器 2、关闭浏览器直到session过期(时间不可量化)3、不关闭浏览器,session超时(可在web.xml中配置session-configsession-timeout单位为分钟   但该设置并不准确)

 

ServletRequestListener主要用途:读取地址栏参数、记录访问历史

也可在web.xml中配置多个

在接收请求时创建后自动销毁  访问后即销毁

 

2、监听域对象中的属性的增加和删除的事件监听器,对应方法addedremovedreplaced

ServletContextAttributeListenerrequestsession

Event.getName()

Request.getContextPath()获得项目名称

<button onclick=”location.href=’<%=request.getContextPath()%>/init.jsp’;”>init<button>

 

3、监听绑定到HttpSession域中的某个对象的状态的事件监听器

  HttpSession中的对象状态:绑定(setAttribute)——>解除绑定(remove)   钝化(将session持久到存储器上)——>活化(将存储器上恢复session

正常情况下session是存在于服务器内存中的,但当访问人数过大时会占用极大内存,这时有个机制就是将不经常使用的session暂时序列化到系统文件系统或是数据库系统中,当被使用时反序列化到内存中,整个过程由服务器自动完成

 

Tomcat中两种Session钝化管理器

Session钝化机制由SessionManager管理

OrgApcheCatalinaSessionStandardManager

A、Tomcat服务器被关闭或重启时,tomcat服务器会将当前内存中的Session对象钝化到服务器文件系统中;

B、另一种情况是web应用程序被重新加载(reload)时,内存中的Session对象也会被钝化到服务器的文件系统中。

C、钝化后的文件被保存到:Tomcat安装路径

/work/Catalina/hostname/applicationname/SESSION.ser

Org.apche.catalina.session.Persistentmanager

A、首先在钝化的基础上进行了扩张。第一种情况如上面1,第二种如上2,第三种情况,可以配置主流内存的Session对象数目,将不长使用的Session对象保存到文件系统或数据库,当用时再重新加载

B、默认情况下,Tomcat提供两个钝化驱动类

Org.apche.Catalina.FileStoreorg.apche.Catalina.JDBCStore

 

两种接口:(不需要在web.xml中注册)

创建的实现类是一个javabean

HttpSessionBindingListene

绑定:valueBound方法

解除绑定:valueUnbound方法  event.getName

HttpSessionActivationListener

钝化:sessionWillPassivate方法

活化:sessionDidActivate   event.getSource

在钝化活化时还务必要实现Serializable

 

Servlet3.0下监听器的使用

1、jre1.6   j2ee6.0  web.xml version=3.0

@WebListener(“This is my demo listener”)

该注解用于将类声明为监听器,被其标注的类必须实现至少实现上文12中的六个接口之一,这样就不用在web.xml中配置<listener>

 

项目实战 在线用户(session数)和人数(IP数)统计

创建一个HttpSessionListener实现类,int变量保存session创建个数,每次创建(++)或销毁(--)后都将该变量重新设置到servletContext中。因为request方法可以获取IP地址(getRemoteAddr(),实现统计IP地址数(一个IP地址可以通过不同浏览器访问增加session数目)

 

代码示例:

User :  sessionId  ip  firstAccessTime

public class JudgeSessionId {

public static User getUserBySessionId(ArrayList<User> userList,String sessionId){

if(userList != null){

for(int i = 0 ; i < userList.size() ; i++){

User user = (User)userList.get(i);

if(user.getSessionId().equals(sessionId)){

return user;

}

}

}

return null;

}

}

 

public class RequestListenerDemoimplements ServletRequestListener {

 

ArrayList<User>  userList = null;

@Override

public void requestDestroyed(ServletRequestEvent arg0) {

// TODO Auto-generated method stub

 

}

 

@Override

public void requestInitialized(ServletRequestEvent arg0) {

HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest();

String sessionId = request.getSession().getId();

userList = (ArrayList<User>) request.getServletContext().getAttribute("userList");

if(userList ==null){

userList = new ArrayList<User>();

}

if(JudgeSessionId.getUserBySessionId(userList,sessionId) ==null){

User user = new User();

user.setFirstAccessTime(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date()));

user.setIp(request.getRemoteAddr());IP地址

user.setSessionId(sessionId);

userList.add(user);

}

request.getServletContext().setAttribute("userList",userList);

}

 

}

 

public class SessionListenerDemoimplements HttpSessionListener {

 

private int sessionNumber = 0;

@Override

public void sessionCreated(HttpSessionEvent arg0) {

this.sessionNumber++;

System.out.println(arg0.getSession().getId());

arg0.getSession().getServletContext().setAttribute("sessionNumber",this.sessionNumber);

}

 

@Override

public void sessionDestroyed(HttpSessionEvent arg0) {

this.sessionNumber--;

System.out.println("sessiondestroy");

arg0.getSession().getServletContext().setAttribute("sessionNumber",this.sessionNumber);

ArrayList<User> userList = (ArrayList<User>) arg0.getSession().getServletContext().getAttribute("userList");

String sessionId = arg0.getSession().getId();

User user = JudgeSessionId.getUserBySessionId(userList, sessionId);//集合为空或集合中没有该session就返回null

If(userList != null){

userList.remove(user);

}

}

}