1. 程式人生 > >ServletContextListener使用詳解以及web容器中獲取spring容器

ServletContextListener使用詳解以及web容器中獲取spring容器

ServletContextListener 介面是servlet的一個介面,它能夠監聽 ServletContext 物件的生命週期,實際上就是監聽 Web 應用的生命週期(Tomcat的啟動與關閉)。

伺服器啟動時,ServletContextListener 的 contextInitialized()方法被呼叫,伺服器將要關閉時,ServletContextListener 的 contextDestroyed()方法被呼叫,用 ServletContext.setAttribute()方法將快取類儲存在 ServletContext 的例項中,用 ServletContext.getAttribute()讀取ServletContext中的內容。

具體使用示例:

第一步:public class MyInitDataListener implements ServletContextListener{

/**

  1. * 當Servlet 容器啟動Web 應用時呼叫該方法
  2.  * 並且對那些在Web 應用啟動時就需要被初始化的Servlet 進行初始化。 
  3.  */
  4. contextInitialized(ServletContextEvent sce)  
  5. /** 
  6.  * 當Servlet 容器終止Web 應用時呼叫該方法。
  7.  */
  8. contextDestroyed(ServletContextEvent sce)

}

第二步:部署ServletContextListener

實現了ServletContextListener 編譯後,把它放在正確的WEB-INF/classes目錄下,更改WEB-INF目錄下的 web.xml檔案,在web-app節點裡新增:

<listener>
    <listener-class>MyInitDataListener類的全路徑</listener-class>
</listener>
ApplicationContext是Spring的核心,Context我們通常解釋為上下文環境,我想用“容器”來表述它更容易理解一些,ApplicationContext則是“應用的容器”了Spring把Bean放在這個容器中,在需要的時候,用getBean方法取出,

在Web應用中,我們會用到WebApplicationContext,WebApplicationContext繼承自ApplicationContext,

Spring把WebApplicationContext(XmlWebApplicationContext是預設實現類)放在了ServletContext中,ServletContext也是一個“容器”,也是一個類似Map的結構,而WebApplicationContext在ServletContext中的KEY就是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,我們如果要使用WebApplicationContext則需要從ServletContext取出,Spring提供了一個WebApplicationContextUtils類,可以方便的取出WebApplicationContext,只要把ServletContext傳入就可以了。

方法一:

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");

說明:這種方式適用於採用Spring框架的獨立應用程式,需要程式通過配置檔案手工初始化Spring的情況。

方法二:通過Spring提供的工具類獲取ApplicationContext物件

ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");

說明:這種方式適合於採用Spring框架的B/S系統,通過ServletContext物件獲取ApplicationContext物件,然後在通過它獲取需要的類例項。

上面兩個工具方式的區別是,前者在獲取失敗時丟擲異常,後者返回null。

其中 servletContext sc 可以具體 換成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外,由於spring是注入的物件放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 物件: WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

web容器中獲取spring容器例項:

1.在application.xml中配置:

<bean name="schoolParamBean" class="com.csn.my.config.ParamInfo">

        <property name="schoolCode" value="000001"/>
<property name="dataURL" value="http://www.aa.com/E/Service/" />
        <property name="Count" value="1000" />
        <property name="Days" value="15" />
    </bean>

2.建立實體類實現ServletContextListener

public class MyInitDataListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent  arg0) {
        
         ServletContext servletContext = arg0.getServletContext();
                 
           WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
          SchoolParam param = (SchoolParam) ctx.getBean("schoolParamBean");

          aa=param.getSchoolCode();
    }

}