zoukankan      html  css  js  c++  java
  • 监听器Listener

    一、监听器

    监听器是web应用程序事件模型的一部分,当web应用中的某些状态发生改变时,会产生相应的事件,监听器可以接收这些事件,并可以在事件发生时做相应的处理。

    二、监听器常用的接口

    2.1、javax.servlet.ServletContextListener

    实现该接口可以在servlet上下文对象初始化或者销毁时得到通知

    2.2、javax.servlet.ServletContextAttributeListener

    实现该接口,可以 在servlet上下文的属性列表发生变化时得到通知

    2.3、javax.servlet.http.HttpSessionListener

    实现该接口可以在创建session后或者失效前得到通知

    2.4、javax.servlet.http.HttpSessionActivationListener

    实现该接口的对象,如果绑定到session中,当serssion被钝化或者激活时,servlet容器将通知该对象。

    2.5、javax.servlet.http.HttpSessionAttributeListener

    实现该接口,可以 在servlet上下文的属性列表发生变化时得到通知

    2.6、javax.servlethttp.HttpSessionBindListener

    实现该接口,可以使一个对象在绑定serssion或者从serssion中删除时得到通知。

    2.7、javax.servlet.servletRequest

    实现该接口,可以在请求对象初始化时或者被销毁时得到通知。

    2.8、javax.servlet.ServletRequestAttributeListener

    实现该接口,可以在请求对象中的属性发生变化是得到通知。

    三、监听器的应用

    3.1、HttpSessionBindingListener接口

     定义实现HttpSessionBindingListener接口,当有session创建是在线人数+1,当session销毁时在线人数-1.

    package demo.web.listener;
    
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionBindingListener;
    
    public class UserListener implements HttpSessionBindingListener {
    
    	public void valueBound(HttpSessionBindingEvent arg0) {
    		Constants.ONLINE_USER_COUNT ++;
    
    	}
    
    	public void valueUnbound(HttpSessionBindingEvent arg0) {
    		Constants.ONLINE_USER_COUNT --;
    
    	}
    
    }
    

    在web.xml中的简单配置

    <listener>
      	<listener-class>demo.web.listener.UserListener</listener-class>
      </listener>
    

    3.2、利用servletContextListener接口

    在系统服务启动时,加载DataSource对象,获取数据库连接。

    1. 编写监听器,实现实用JNDI查找数据源。
    2. 将查找到的数据源保存在servletContext上下文中。
    3. 编写一个servlet,读取上下文,并从中查找到数据源。
    4. 在web.xml文件中配置监听器及servlet
    public class DataSourceListener implements ServletContextListener{
      public void ContextInitialized(ServletContextEnvent e){
        ServletContext sc = e.getServletContext();
           Context cxt = new InitialContext();// 初始化上下文
           // 获取与逻辑名相关的数据源对象
           DataSource ds  =(DtaSource)cxt.lookup("java:comp/env/jdbc/news");  
            // 将dataSource保存到servletContext上下文中
           sc.serAttribute("DS",ds);
        }
    }    
    

      servlet相关代码:

    package demo.web.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyServlet3 extends HttpServlet {
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    	   DataSource ds = (DataSource)getServletContext().getAttribute("DS");
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		super.doPost(req, resp);
    	}
    
    	@Override
    	protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
    			throws ServletException, IOException {
    		super.service(arg0, arg1);
    	}
    }
    

      web.xml中的配置:

    <servlet>
      	<servlet-name>myServlet</servlet-name>
      	<servlet-class>demo.web.servlet.MyServlet3</servlet-class>
      	<init-param>
      		<param-name>charSerContent</param-name>
      		<param-value>utf-8</param-value>
      	</init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>myServlet</servlet-name>
      	<url-pattern>/demo/myServlet</url-pattern>
      </servlet-mapping>
    <listener>
      	<listener-class>demo.web.listener.UserListener</listener-class>
    </listener>
    

      

  • 相关阅读:
    Lodash 严重安全漏洞背后 你不得不知道的 JavaScript 知识
    SQL Server和C#中无法将小数字符串直接转换为整数类型
    Is default(CancellationToken) equivalent to CancellationToken.None?(转载)
    Stored Procedures: OUTPUT vs OUT?(转载)
    关于TransactionScope.Complete方法(链接)
    Do I need to dispose of Tasks?(链接)
    EF Core 3.0 Keyless Entity Types (链接)
    为什么C#接口中不能声明async异步函数(转载)
    How does SqlDataReader handle really large queries?(转载)
    ASP.NET Core MVC中的Filter如果不实现IFilterFactory接口,那么Filter默认情况下在ASP.NET Core生命周期内是单例的,会被重用
  • 原文地址:https://www.cnblogs.com/ablejava/p/5635820.html
Copyright © 2011-2022 走看看