Servlet监听器简介
Servlet监听器的作用是监听Web容器的有效事件,由容器管理。利用Listener接口监听在容器中的某个执行程序,并更具应用程序的需求做出适当的响应。
监听Servlet上下文
Servlet上下文监听可以监听ServletContext对象的创建、删除和添加属性,以及删除和修改操作,该监听器需要用到下面两个接口。
class myServletContextListener implements ServletContextListener{
//通知正在收听的对象应用程序已经被加载及初始化
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
}
//通知正在收听的对象应用程序已经被载出,即关闭
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
class myServletAttributeListener implements ServletContextAttributeListener{
//若有对象加入Application范围,通知正在收听的对象
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
}
//若有对象从Application范围移除,通知正在收听的对象
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
}
//若有对象在Application范围内的一个对象被另一个对象替换,通知正在收听的对象
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
}
}
class myServletAttributeListener2 implements ServletRequestAttributeListener{
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
}
监听HTTP会话
class myHttpSessionListener implements HttpSessionListener{
//通知正在收听的对象,session已经被加载及初始化
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
//通知正在收听的对象,session被载出
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
class myHttpSessionActivationListener implements HttpSessionActivationListener{
//通知正在收听的对象,其session状态变为有效状态
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
}
//通知正在收听的对象,其session状态变为无效状态
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
}
}
class myHttpBindingListener implements HttpSessionBindingListener{
//当有对象加入session的范围时,会被自动调用
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
}
//当有对象从session的范围移除时,会被自动取消调用
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
}
}
class myHttpSessionAttributeListener implements HttpSessionAttributeListener {
//若有对象加入Session范围,通知正在收听的对象
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
}
//若有对象从Session范围移除,通知正在收听的对象
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
}
//若有对象在Session范围内的一个对象被另一个对象替换,通知正在收听的对象
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
}
}
监听Servlet请求
class myServletRequestListener implements ServletRequestListener{
//通知正在收听的对象,ServletRequest已经被加载及初始化
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
}
//通知正在收听的对象,ServletRequest已经被载出,即关闭
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
}
}
class myServletRequestAttributeListener implements ServletRequestAttributeListener{
//若有对象加入Request范围,通知正在收听的对象
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
//若有对象从Request范围移除,通知正在收听的对象
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
//若有对象在Request范围内的一个对象被另一个对象替换,通知正在收听的对象
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
}
下面使用一个小例子:使用监听器查看在线用户
UserInfoList类:
package com.java.model;
import java.util.ArrayList;
/** * Created with IntelliJ IDEA. * Created by YEN on 2016/7/10 and 22:05. */
public class UserInfoList {
private static UserInfoList userInfoList=new UserInfoList();
private ArrayList arrayList=null;
public UserInfoList(){
this.arrayList=new ArrayList();
}
public static UserInfoList getInstance(){
return userInfoList;
}
//增加用户
public boolean addUserInfo(String username){
if(username!=null){
this.arrayList.add(username);
return true;
}else return false;
}
//获取用户列表
public ArrayList getUserList(){
return arrayList;
}
//移除用户
public void removeUserInfo(String username){
if(username!=null){
arrayList.remove(username);
}
}
}
UserInfoTrace类:
package com.java.model;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/** * Created with IntelliJ IDEA. * Created by YEN on 2016/7/10 and 22:12. */
public class UserInfoTrace implements HttpSessionBindingListener{
private String username;
private UserInfoList container=UserInfoList.getInstance();
public UserInfoTrace(){
this.username="";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("上线................"+this.username);
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("下线................"+this.username);
if(username!=""){
container.removeUserInfo(username);
}
}
}
login.jsp页面
<%-- Created by IntelliJ IDEA. User: YEN Date: 2016/7/9 Time: 16:29 To change this template use File | Settings | File Templates. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script> function checkForm() { if(document.getElementById("username").value==null || document.getElementById("username").value==""){ alert("用户名不能为空!"); return false; } if(document.getElementById("password").value==null || document.getElementById("password").value==""){ alert("密码不能为空!"); return false; } return true; } </script>
</head>
<body>
<form name="form1" action="<%=request.getContextPath()%>/showUserInfo.jsp" method="get" onsubmit="return checkForm()">
username:<input type="text" name="username" id="username"> <br>
password:<input type="password" name="password" id="password"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
showUserInfo.jsp页面
<%-- Created by IntelliJ IDEA. User: YEN Date: 2016/7/10 Time: 22:16 To change this template use File | Settings | File Templates. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="com.java.model.UserInfoList" language="java" %>
<%@page import="com.java.model.UserInfoTrace" language="java" %>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
<title>UserInfoPage</title>
</head>
<body>
<% UserInfoList userInfoList=UserInfoList.getInstance(); //获得UserInfoList类的对象 UserInfoTrace userInfoTrace=new UserInfoTrace(); //创建UserInfoTrace类的对象 request.setCharacterEncoding("UTF-8"); String username=request.getParameter("username"); userInfoTrace.setUsername(username); session.setAttribute("list",userInfoTrace); userInfoList.addUserInfo(username); session.setMaxInactiveInterval(30); //session过期时间为30s %>
<textarea rows="8" cols="20">
<% ArrayList arrayList=userInfoList.getUserList(); if(arrayList!=null && arrayList.size()>0 ){ for (int i = 0; i < arrayList.size(); i++) { out.print(arrayList.get(i)); } } %>
</textarea>
</body>
</html>