javaWeb中servlet开发——监听器

Posted 小企鹅ITgo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaWeb中servlet开发——监听器相关的知识,希望对你有一定的参考价值。

监听的定义

对application的监听

application是servletContext接口的对象,表示的是整个上下文环境,如果要想实现对application监听则可以使用如下两个接口:

servletContextListener:是对整个上下文环境的监听

servletContextAttrubiteListener:是对属性的监听。

import javax.servlet.* ;
public class ServletContextListenerDemo implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event){
        System.out.println("** 容器初始化 --> " + event.getServletContext().getContextPath()) ;
    }
    public void contextDestroyed(ServletContextEvent event){
        System.out.println("** 容器销毁 --> " + event.getServletContext().getContextPath()) ;
        try{
            Thread.sleep(300) ;
        }catch(Exception e){}
    }
}

在web.xml中配置<listener>

如果在web.xml中有servlet、filter、listener,则配置顺序如下

<filter>

<filter-mapping>

<listener>

<servlet>

<servlet-mapping>

使用servletContextAttributeListener操作属性

import javax.servlet.* ;
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {
    public void attributeAdded(ServletContextAttributeEvent scab){
        System.out.println("** 增加属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
    }
    public void attributeRemoved(ServletContextAttributeEvent scab){
        System.out.println("** 删除属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
    }
    public void attributeReplaced(ServletContextAttributeEvent scab){
        System.out.println("** 替换属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
    }
}

web.xml中配置

<listener>
		<listener-class>
			org.lxh.listenerdemo.ServletContextAttributeListenerDemo
		</listener-class>
	</listener>

  jsp中显示:

<%
	request.setAttribute("info","www.MLDNJAVA.cn") ;
%>

  对session的监听

 

注意:session是属于http协议范畴,所以这些接口是在javax.servlet.http中定义的。

在servlet中,要想取得session依靠的是httpServletRequest接口中的getSession()方法。

import javax.servlet.http.* ;
public class HttpSessionListenerDemo implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se){
        System.out.println("** SESSION创建,SESSION ID = " +se.getSession().getId() ) ;
    }
    public void sessionDestroyed(HttpSessionEvent se){
        System.out.println("** SESSION销毁,SESSION ID = " +se.getSession().getId() ) ;
    }
}

之后进行web.xml配置,启动服务器

当客户端第一次连接到服务器时,服务器会自动为用户创建一个session,同时分配一个sessionId。

session已经被创建,在第一次访问时触发事件,但什么时候被注销?

如果要想session被注销,有两种方法,但这两种方法都不是关闭页面可以实现的。

方法1:session注销---invaldate();

方法2:超时时间设置——在tomcat中一般时间设置为30min,也可以自己在web.xml中修改

<%    // 手工注销
    session.invalidate() ;
%>

当调用invalidate()方法时session就被销毁了。

当然,时间越长,占用内存越大。

web.xml中设置

<session-config>
   <session-timeout>1</session-timeout>
</session-config>

对session中的属性进行监听

import javax.servlet.http.* ;
public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener {
    public void attributeAdded(HttpSessionBindingEvent se){
        System.out.println(se.getSession().getId() + ",增加属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
    }
    public void attributeRemoved(HttpSessionBindingEvent se){
        System.out.println(se.getSession().getId() + ",删除属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
    }
    public void attributeReplaced(HttpSessionBindingEvent se){
        System.out.println(se.getSession().getId() + ",替换属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
    }
}
<%
    session.setAttribute("info","www.MLDNJAVA.cn") ;
%>

到此为止,都与servletContext非常相似,之前所有的的监听都要在web.xml中进行配置,但是在session中有一个HttpSessionBindingListener也是实现监听的接口,但是这个接口不需要配置,可以直接使用。

import javax.servlet.http.* ;
public class LoginUser implements HttpSessionBindingListener {
    private String name ;
    public LoginUser(String name){
        this.setName(name) ;
    }
    public void valueBound(HttpSessionBindingEvent event){
        System.out.println("** 在session中保存LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
    }
    public void valueUnbound(HttpSessionBindingEvent event){
        System.out.println("** 从session中移出LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
    }
    public String getName(){
        return this.name ;
    }
    public void setName(String name){
        this.name = name ;
    }
}

此时不需要配置web.xml,但是jsp中就比较麻烦。

<%
    LoginUser user = new LoginUser("MLDN") ;
    session.setAttribute("info",user) ;    // 直接保存LoginUser对象
%>

对request监听

import javax.servlet.* ;
public class ServletRequestListenerDemo implements ServletRequestListener {
    public void requestInitialized(ServletRequestEvent sre){
        System.out.println("** request初始化。http://" + 
            sre.getServletRequest().getRemoteAddr() + 
            sre.getServletContext().getContextPath()) ;
    }
    public void requestDestroyed(ServletRequestEvent sre){
        System.out.println("** request销毁。http://" + 
            sre.getServletRequest().getRemoteAddr() + 
            sre.getServletContext().getContextPath()) ;
    }
}

在web.xml中进行配置

<listener>
        <listener-class>
            org.lxh.listenerdemo.ServletRequestListenerDemo
        </listen

对request中属性操作

import javax.servlet.* ;
public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener {
    public void attributeAdded(ServletRequestAttributeEvent srae){
        System.out.println("** 增加request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
    }
    public void attributeRemoved(ServletRequestAttributeEvent srae){
        System.out.println("** 删除request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
    }
    public void attributeReplaced(ServletRequestAttributeEvent srae){
        System.out.println("** 替换request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
    }
}

从实际来说,对request监听用的不多,用的最多的是对servletContext 和httpSession的监听。

监听实例

 

 

 

 

import java.util.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class OnlineUserList implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener {
    private ServletContext app = null ;
    public void contextInitialized(ServletContextEvent sce){
        this.app = sce.getServletContext() ;
        this.app.setAttribute("online",new TreeSet()) ;    // 准备集合
    }
    public void contextDestroyed(ServletContextEvent sce){
    }
    public void attributeAdded(HttpSessionBindingEvent se){
        Set all = (Set) this.app.getAttribute("online") ;
        all.add(se.getValue()) ;
        this.app.setAttribute("online",all) ;
    }
    public void attributeRemoved(HttpSessionBindingEvent se){
        Set all = (Set) this.app.getAttribute("online") ;
        all.remove(se.getSession().getAttribute("userid")) ;
        this.app.setAttribute("online",all) ;
    }
    public void attributeReplaced(HttpSessionBindingEvent se){}
    public void sessionCreated(HttpSessionEvent se){}
    public void sessionDestroyed(HttpSessionEvent se){
        Set all = (Set) this.app.getAttribute("online") ;
        all.remove(se.getSession().getAttribute("userid")) ;
        this.app.setAttribute("online",all) ;
    }
    
}
<form action="login.jsp" method="post">
    用户ID:<input type="text" name="userid">
    <input type="submit" value="登陆">
</form>
<%
    String userid = request.getParameter("userid") ;
    if(!(userid==null || "".equals(userid))){
        session.setAttribute("userid",userid) ;
        response.sendRedirect("list.jsp") ;
    }
%>



<%
    Set all = (Set) this.getServletContext().getAttribute("online") ;
    Iterator iter = all.iterator() ;
    while(iter.hasNext()){
%>
        <h3><%=iter.next()%></h3>
<%
    }
%>

 

以上是关于javaWeb中servlet开发——监听器的主要内容,如果未能解决你的问题,请参考以下文章

javaWeb中servlet开发——过滤器

JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

05-JavaWeb的三大组件:小程序Servlet+过滤器Filter+监听器Listener

javaweb学习总结(四十七)——监听器(Listener)在开发中的应用

JavaWeb核心之Servlet

JavaWeb-Servlet笔记--- 监听器接口;应用监听器接口 优化在线考试管理系统