Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255049
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 961
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-11 17:19
个人简介

没有最好的语言,只有最适合的语言。

文章分类

全部博文(34)

文章存档

2016年(2)

2013年(32)

我的朋友

分类: Web开发

2013-07-11 19:09:08

Servlet监听器的作用是监听Web容器的有效期事件,可以监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。其中提供的LIstener接口有这些:

(1)ServletContextListener;         Servlet的上下文监听,它主要实现监听ServletContext的创建和删除。该接口提供了两种方法

                  1.contextInitialized(ServletContextEvent event);   通知正在收听的对象,应用程序已经被加载和初始化。

                  2.contextDestroyed(ServletCotextEvent event);   通知正在收听的对象,应用程序已经被载出,即关闭。

(2)ServletAttributeListener;      主要实现监听ServletContext属性的增加,删除和修改。该接口提供了一下3个方法

                1.attributeAdded(ServletContextAttributeEvent event);    当有对象加入Application的范围时,通知正在收听的对象

                2.attributeReplaced(ServletContextAttributeEvent event); 当在application的范围有对象取代另一个对象的时,通知正在收听的对象

                3.attributeRemoved(ServletContextAttributeEvent event);   当有对象从application的范围移除时,通知正在收听的对象

(3)HttpSessionListener;            HTTP会话监听,该接口实现监听HTTP会话创建、销毁。该接口提供了一下两种方法

                   1.sessionCreated(HttpSessionEvent event);        通知正在收听的对象,session已经被加载及初始化

                   2. sessionDestoryed(HttpSessionEvent event)l          通知正在收听的对象,session已经被载出(HttpSessionEvent类的主要方法是getSession(),可以使用该方法回传一个 session对象)

(4)HttpSessionActivationListener;          该接口实现监听HTTP会话active和passivate。 该接口提供了一下3个方法 

                   1.attributeAdded(HttpSessionBindingEvent event);         当有对象加入session的范围时,通知正在收听的对象

                   2.attributeReplaced(HttpSessionBindingEvent event);       当在session的范围有对象取代另一个对象时,通知正在收听的对象。

                   3.attributeRemoved(HttpSessionBindingEvent event);            当有对象从session的范围有对象取代另一个对象时,通知正在收听的对象 其中HttpSessionBindingEvent类主要有三个方法:getName()、getSession()和getValue()

(5)HttpBindingListener;                        接口实现监听HTTP会话中对象的绑定信息。它是唯一不需要在web.xml中设定Listener的。该接口提供了以下2个方法

                  1.valueBound(HttpSessionBindingEvent event);                       当有对象加入session的范围时会被自动调用

                  2.valueUnBound(HttpSessionBindingEvent event);                      当有对象从session的范围内移除时会被自动调用

(6)HttpSessionAttributeListener;               该接口实现监听HTTP会话中属性的设置请求。该接口提供了以下两个方法。

                 1.sessionDidActivate(HttpSessionEvent event);            通知正在收听的对象,它的session已经变为有效状态。

                 2.sessionWillPassivate(HttpSessionEvent event);            通知正在收听的对象,它的session已经变为无效状态

(7)ServletRequestListener;                     该接口提供了以下两个方法。

                   1.requestInitalized(ServletRequestEvent event)              通知正在收听的对象,ServletRequest已经被加载及初始化

                   2.requestDestroyed(ServletRequestEvent event)           通知正在收听的对象,ServletRequest已经被载出,即关闭
(8)ServletRequestAttributeListener                 该接口提供了一下三种方法

                    1.attributeAdded(ServletRequestAttributeEvent event);        当有对象加入request的范围时,通知正在收听的对象

                    2.attributeReplaced(ServletRequestAttributeEvent event);         当在request的范围内有对象取代两一个对象时,通知正在收听的对象

                   3.attributeRemoved(ServletRequestAttributeEvent event);      当有对象从request的范围移除时,通知正在收听的对象

其中除了HttpBindingListener是不用在web.xml中设定Listener的。

配置Listener如下,在web.xml中添加

       com.listener.MyContentListener

 

为了更加的了解Servlet监听器的作用,练习了一下用监听器统计在线人数

(1)创建UserInfoList.java类文件,主要是用来存储在线用户和对在线用户进行具体操作。完整代码如下:

package com.SerListener;

import java.util.Vector;

public class UserInfoList {
 private static UserInfoList user = new UserInfoList();
 private Vector vector=null;
 public UserInfoList(){
  this.vector = new Vector();
 }
 //外界使用的instance对象
 public static UserInfoList getInstance(){
  return user;
 }
 public boolean addUserInfo(String user){
  if(user!=null){
   this.vector.add(user);
   return true;
  }else{
   return false;
  }
  
 }
 //获取用户列表
 public Vector getList(){
  return vector;
 }
 
 //移除用户
 public void removeUserInfo(String user){
  if(user!=null){
   vector.removeElement(user);
  }
 }
}

(2)创建UserInfoTrace类文件,该类实现了HttpSessionBindingListener接口,主要监控对象从session中移除和加入时,要进行的操作,完整代码如下:

package com.SerListener;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class UserInfoTrace implements HttpSessionBindingListener {
 private String user;
 private UserInfoList container = UserInfoList.getInstance();
 public UserInfoTrace(){
  user="";
 }
 public void setUser(String user){
  this.user = user;
 }
 
 public String getUser(){
  return user;
 }
 public void valueBound(HttpSessionBindingEvent event) {
  System.out.println("上线"+this.user);

 }

 public void valueUnbound(HttpSessionBindingEvent event) {
  System.out.println("下线"+this.user);
  if(user!=""){
   container.removeUserInfo(user);
  }
 }

}
(3)创建字符串编码过滤器,以免出现中文乱码(此是为了再次巩固servlet的过滤器的学习),过滤器代码如下:

package com.SerListener;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharactorFilter implements Filter {
 String encoding=null;
 public void destroy() {
 }

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  if(encoding!=null){
   request.setCharacterEncoding(encoding);
   response.setContentType("text/html;charset="+encoding);//设置响应的字符编码
  }
  chain.doFilter(request, response);
  
 }

 public void init(FilterConfig filterConfig) throws ServletException {
  encoding = filterConfig.getInitParameter("encoding");
 }

}
(4)结果显示页面代码如下:


   <%
   UserInfoList list = UserInfoList.getInstance();
   UserInfoTrace ut = new UserInfoTrace();
   String name=request.getParameter("user");
   ut.setUser(name);
   session.setAttribute("list", ut);
   list.addUserInfo(ut.getUser());
   session.setMaxInactiveInterval(10);
    %>
   
 

 

运行结果如下:

输入麟后运行如下:
阅读(2943) | 评论(1) | 转发(0) |
0

上一篇:PPT的学习记录

下一篇:Servlet过滤器的学习

给主人留下些什么吧!~~

鱼门客栈2013-07-12 09:15:15

. 学习了