web成長之路(第一篇)ServletContextListener和ServletContext

web開發中,每個人都必須要深刻掌握的技能——servlet,學習servlet,就必然要理解ServletContext(javax.servle.ServletContext)接口。

先讓我們看下Servlet的實現機制,創建一個servlet,必須要extends javax.servlet.http.HttpServlet類,那些神祕的ServletContext,ServletConfig接口都是怎麼來的呢?讓我們來看下他們的層次關係:


畫圖工具沒選好,畫不出那種上下級效果...我來大致將下吧。上圖中,最下面那個absract class HttpServlet就是我們創建一個servlet必須繼承的父類,由圖可見,HttpServlet又繼承自GenericServlet,這個類我們接觸比較少,因爲它做的操作比較少,重要的是,GenericServlet實現了兩個重要的接口:javax.servlet.Servlet、javax.servlet.ServletConfig。很熟悉吧,沒錯,我們servlet的生命週期中重要的幾個方法正是來自與Servlet接口中的init()、service()、destroy()。再看ServletConfig接口,hey,man,那不就是我們熟悉的getServletContext()方法嗎。現在,爲什麼我們的servlet中能直接調用getServletContext()等方法,一切是不是沒那麼神祕了?

接下來,我們繼續揭開Servlet的神祕面紗。

Web容器(如tomcat)在啓動的時候,它會爲每個應用程序都創建一個對應的ServletContext對象,記住哦,是每個應用對應一個。上圖中看到,ServletConfig中有一個getServletContext()的方法可以獲得ServletContext對象,那是因爲ServletConfig持有ServletContext對象的引用,所以在我們自己的servlet中,可以直接通過getServletContext()方法來獲取ServletContext。

由於一個web應用只有一個ServletContext,所有的servlet都要共享他,所以servlet對象之間可以通過ServletContext對象來實現通訊。

示例:

在AServlet中通過以下代碼存入共享數據:

ServletContext context = this.getServletContext();

context.setAttribute("name","hello");

在其他Servlet中通過如下代碼獲取共享數據:

ServletContext context = this.getServletContext();

String name = (String)context.getAttibute("name");

通過上述例子,相信大家對ServletContext應該有一定的認識了,那接下來看下servletContext的getInitParameter()方法,此方法用於獲取在web.xml中配置的servlet的啓動參數,直接來個例子吧。

web.xml文件:

<context-param>
  <param-name>name</param-name>
  <param-value>zhangsan</param-value>
</context-param>

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>com.MyServlet</servlet-class>
    <init-param>
      <param-name>sex</param-name>
      <param-value>male</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>


MyServlet.java:

ServletContext context=getServletConfig().getServletContext();

String num=context.getInitParameter("name");// <context-param> 獲取得到值

String count=context.getInitParameter("sex");//<init-param> 獲取不到值


System.out.println("num:"+getServletConfig().getInitParameter("name"));//null獲取不到值

System.out.println("count:"+getServletConfig().getInitParameter("sex"));//male獲取到值


ServletContext的getInitParameter()方法是用於獲取全局參數的,ServletConfig的getInitParameter()方法是用於獲取當前servlet的參數。其原因正是因爲ServletContext只有一份,ServletConfig卻有多份。

ServletContextListener,顧名思義,它能監聽ServletContext的生命週期,當Servlet 容器啓動或終止Web 應用時,會觸發ServletContextEvent 事件,該事件由 ServletContextListener 來處理,此接口兩個方法:

contextDestroyed(ServletContextEvent sce):處理容器銷燬,web應用生命週期中最晚執行

contextInitialized(ServletContextEvent sce):處理容器初始化,web應用生命週期中最早調用

實現該接口的Listener還需要在web.xml中加上相應配置:

<listener>
<listener-class>
<!-- ServletContextListener的具體實現類 -->
</listener-class>
</listener>


終...不周之處,還望廣大博友多多指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章