zoukankan      html  css  js  c++  java
  • spring项目中监听器作用-ContextLoaderListener

    附加链接:http://blog.csdn.net/zjw10wei321/article/details/40145241

    作用:在启动Web 容器时,自动装配Spring applicationContext.xml 的配置信息。

    因为它实现了ServletContextListener 这个接口,在web.xml 配置这个监听器,启动容器时,就会默认执行它实现的方法。在ContextLoaderListener 中关联了ContextLoader 这个类,所以整个加载配置过程由ContextLoader 来完成

     

    pring 在 web 下的入口在配置文件 web.xml 的监听器中

    < listener >

            < listener-class >

               org.springframework.web.context.ContextLoaderListener

            </ listener-class >

    </ listener >

    <context-param>

         <param-name>contextConfigLocation</param-name>

          <param-value>classpath:conf/spring/applicationContext.xml</param-value>

    </context-param>

    上述是在web.xml 中的配置信息。

    // 实现了接口 ServletContextListener, 也就是说他必须实现 contextDestroyed, contextInitialized 这两个方法

    public class ContextLoaderListener implements ServletContextListener {

           private ContextLoader contextLoader;

           /**

           * Initialize the root web application context.

           */

    //Spring 框架由此启动 , contextInitialized 也就是监听器类的 main 入口函数

           public void contextInitialized (ServletContextEvent event) {

                  this.contextLoader = createContextLoader();

                  this.contextLoader.initWebApplicationContext(event.getServletContext());

           }

           /**

           * Create the ContextLoader to use. Can be overridden in subclasses.

           * @return the new ContextLoader

           */                                            

           protected ContextLoader createContextLoader() {

                  return new ContextLoader();

           }

           /**

           * Return the ContextLoader used by this listener.

           * @return the current ContextLoader

           */

           public ContextLoader getContextLoader() {

                  return this.contextLoader;

           }

           /**

           * Close the root web application context.

           */

           public void contextDestroyed (ServletContextEvent event) {

                  if (this.contextLoader != null) {

                         this.contextLoader.closeWebApplicationContext(event.getServletContext());

                  }

           }

    }

    总的来说这个入口非常简单 , 所有实现都隐藏在 ContextLoader 类里 , 我们在下一篇的内容中讨论ContextLoader, 如果你不知道为什么这里是程序的入口 , 那么复习一下 ServletContextListener 接口和监听器的相关知识吧

       ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context ,被Web 应用内的各个程序共享。因为Context 可以用来保存资源并且共享,所以我所知道的ServletContext 的最大应用是Web 缓存---- 把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O 了。

       ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

           在JSP 文件中,application 是 ServletContext 的实例,由JSP 容器默认创建。Servlet 中调用getServletContext() 方法得到 ServletContext 的实例。

    我们使用缓存的思路大概是:

           1. 服务器启动时,ServletContextListener 的 contextInitialized() 方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute() 方法将缓存类保存在ServletContext 的实例中。

           2. 程序使用 ServletContext.getAttribute() 读取缓存。如果是 JSP ,使用a pplication.getAttribute() 。如果是Servlet ,使用 getServletContext().getAttribute() 。如果缓存发生变化( 如访问计数) ,你可以同时更改缓存和文件/ 数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。

           3. 服务器将要关闭时,ServletContextListener 的 contextDestroyed() 方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。

    Java 代码  

    1. import User; //my own   
    2. classimport DatabaseManager; // my own class  
    3. import javax.servlet.ServletContext;  
    4. import javax.servlet.ServletContextListener;  
    5. public class MyContextListener  implements ServletContextListener {      
    6.       private ServletContext context = null;      
    7.       public void contextInitialized(ServletContextEvent event) {     
    8.                 context = event.getServletContext();          
    9.                 User user = DatabaseManager.getUserById(1);       
    10.                 context.setAttribute("user1", user);      
    11.       }   
    12.       public void contextDestroyed(ServletContextEvent event) {   
    13.                  User user = (User)context.getAttribute("user1");         
    14.                  DatabaseManager.updateUserData(user);        
    15.                  this.context = null;     
    16.       }  
    17. }  

    import User; //my own

    classimport DatabaseManager; // my own class

    import javax.servlet.ServletContext;

    import javax.servlet.ServletContextListener;

    public class MyContextListener  implements ServletContextListener {   

          private ServletContext context = null;

          public void contextInitialized(ServletContextEvent event) {

                    context = event.getServletContext(); 

                    User user = DatabaseManager.getUserById(1); 

                    context.setAttribute("user1", user);

          }

          public void contextDestroyed(ServletContextEvent event) {

                     User user = (User)context.getAttribute("user1"); 

                     DatabaseManager.updateUserData(user); 

                     this.context = null;

          }

    }

    布署 ServletContextListener

          你实现(implements) 了 ServletContextListener 编译后,把它放在正确的WEB-INF/classes 目录下,更改WEB-INF 目录下的 web.xml 文件,在web-app 节点里添加

    <listener>

            <listener-class>MyServletContextListener</listener-class>

    </listener>

  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/keyi/p/7884482.html
Copyright © 2011-2022 走看看