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

    在Servlet API中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。

    当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由 ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理     ServletContextEvent事件的两个方法。

    contextInitialized(ServletContextEvent sce):当Servlet容器启动Web应用时调用该方法。在调用完该方法之后,容器再对Filter初始化,并且对那些在Web应用启动时就需要    被初始化的Servlet进行初始化

    contextDestroyed(ServletContextEvent sce):当Servlet容器终止Web应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet和Filter过滤器

    1.spring监听器

    ContextLoaderListener

    public class org.springframework.web.context.ContextLoaderListener extends org.springframework.web.context.ContextLoader implements 

    javax.servlet.ServletContextListener {

    }

    2.servlet监听器

    ServletContextListener

    public abstract interface javax.servlet.ServletContextListener extends java.util.EventListener {

    }

    3.ContextLoader

    public class org.springframework.web.context.ContextLoader {

    }

    web项目启动tomcat成功执行某个操作(比如缓存加载/日志记录/加载配置数据/)或者tomcat关掉后执行某个操作(比如资源释放/日志记录),都可以依靠监听器实现

    No1.实现ServletContextListener接口,自定义一个监听器

    public class MyListerner implements ServletContextListener{

    @Override

    public void contextDestroyed(ServletContextEvent sce) {

    System.out.println("tomcat注销");

    }

    @Override

    public void contextInitialized(ServletContextEvent sce) {

    System.out.println("tomcat初始化");

    }

    }

    No2.在web.xml中配置此监听器

    <listener>

        <listener-class>demo.MyListerner</listener-class>

    </listener>

    No3.启动tomcat并关闭,控制台会输出

    tomcat初始化

    tomcat注销

    上述代码功能同样可以使用servlet实现

    No1.创建一个普通的Servlet类

    public class ContextLoaderServlet extends HttpServlet{

    public ContextLoaderServlet() {

    super();

    }

    @Override

    public void destroy() {

    super.destroy();

    System.out.println("Servlet销毁");

    }

    @Override

    protected void service(HttpServletRequest req, HttpServletResponse resp)

    throws ServletException, IOException {

    super.service(req, resp);

    }

    @Override

    public void init() throws ServletException {

    super.init();

    System.out.println("Servlet初始化");

    }

    }

    No2.在web.xml中配置servlet随容器加载而初始化

    <servlet>

    <servlet-name>ContextLoaderServlet</servlet-name>

    <servlet-class>com.ttpod.common.view.servlet.ContextLoaderServlet</servlet-class>

    <!-- 多个servlet值越小,加载优先级越大,销毁优先级越小 -->

    <load-on-startup>2</load-on-startup>

    </servlet>

    <servlet-mapping>

    <servlet-name>ContextLoaderServlet</servlet-name>

    <url-pattern>/servlet/ContextLoaderServlet</url-pattern>

    </servlet-mapping>

    No3.启动tomcat并关闭,控制台会输出

    Servlet初始化

    Servlet销毁

    <load-on-startup>2</load-on-startup>节点配置使Servlet的生命周期和容器生命周期绑定到了一起,所以效果等同于

    tomcat初始化

    tomcat注销

    如果同时配置了listener和servlet的监听器,listener优先级高于servlet,启动tomcat并关闭,控制台会输出

    tomcat初始化

    Servlet初始化

    Servlet销毁

    tomcat注销

    虽然servlet可以充当监听器,但servlet的主要功能不是监听器,所以监听器的实现最好使用listener

    使用listener可以通过ServletContextEvent获得ServletContext对象,对于容器的控制更方便灵活有效

    备注:

    No1.web.xml中监听器、过滤器、Servlet顺序问题

    配置顺序:

    ServletContext(ContextParam)-> filter -> listener -> servlet

    加载顺序:

    ServletContext(ContextParam) -> listener -> filter -> servlet

    No2.web项目启动就加载servlet,需要配置<load-on-startup>2</load-on-startup>,如有多个servlet配置,其值越小,优先级越高,此时会初始化此servlet,也就是执行inite()方法

    <load-on-startup>2</load-on-startup>节点不存在情况下,servlet被请求时才被初始化

    No3.使用servlet作为监听器,好处在于可以在监听器里面使用spring mvc的功能

    无论是配置还是注解实例化bean,都可以使用以下方式获得有状态的Bean实例:

    //从xml中加载spring应用上下文(spring-servlet.xml含注解配置)

    ApplicationContext ac = (ApplicationContext) new ClassPathXmlApplicationContext(new String[]{"/config/spring/applicationContext.xml","/config/spring/spring-servlet.xml"});

    //从xml配置文件里获取SessionFactory对象

    SessionFactory factory = (SessionFactory)ac.getBean("sessionFactory");

    //从注解里获取IHeadService接口

    IHeadService headService = (IHeadService)ac.getBean("headService");

    AdvertController advertController = (AdvertController)ac.getBean("advertController");

  • 相关阅读:
    信息学奥赛一本通(c++版) 1003:对齐输出
    读书笔记(华科曹计昌 《c语言与程序设计》)
    使用request对象实现注册示例,get/post的编码问题
    Eclipse中开发第一个web(jsp)项目
    Eclipse恢复默认布局
    手工在tomcat目录中建立个人项目
    通过ServletContext获得工程根目录路径、读取文件以及获得classpath目录下的文件
    ServletContext设置全局变量实现统计站点访问次数
    servlet全局参数的设置
    Eclipse关联Servlet源码详细步骤
  • 原文地址:https://www.cnblogs.com/azhqiang/p/4040235.html
Copyright © 2011-2022 走看看