您的位置:首页 > 其它

八大监听器

2015-08-14 13:47 351 查看
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中添加

<listener>

<listener-class>com.listener.MyContentListener</listener-class>

</listener>

为了更加的了解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)结果显示页面代码如下:

<body>

<%

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);

%>

<textarea rows="8" cols="20">

<%

Vector vector = list.getList();

if(vector!=null && vector.size()>0){

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

out.println(vector.elementAt(i));

}

}

%>

</textarea>

</body>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: