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>
終...不周之處,還望廣大博友多多指出。