一、概述
servlet是在伺服器端執行的java程式,運行在伺服器端的Servlet容器中。要編寫一個Servlet,需要實現javax.servlet.Servlet介面。 JSP是servlet的擴充,jsp第一次運行時要先翻譯成JAVA代碼,在編譯成class檔案 而那個JAVA代碼就是servlet 。在TOMCAT的LIB目錄下有servlet-api.jar,jsp-api.jar。
1、Servle生命週期事件
| 對象 |
事件 |
監聽器介面和事件類別 |
| Web上下文 (見訪問Web上下文) |
初始化和銷毀 |
javax.servlet. ServletContextListener 和 ServletContextEvent |
| 屬性的添加、刪除或替代 |
javax.servlet. ServletContextAttributeListener 和 ServletContextAttributeEvent |
| 會話 (見維護客戶給狀態) |
建立、失效和逾時 |
javax.servlet.http. HttpSessionListener 和 HttpSessionEvent |
| 屬性的添加、刪除或替代 |
javax.servlet.http. HttpSessionAttributeListener 和 HttpSessionBindingEvent |
2、範圍對象
| 範圍對象 |
類 |
哪些組件可以對其進行訪問 |
| 網路內容 |
javax.servlet. ServletContext |
Web上下文中的Web組件。見訪問Web上下文 |
| 會話 |
javax.servlet. http.HttpSession |
處理屬於會話的請求的Web組件。見維護用戶端狀態。 |
| 請求 |
javax.servlet. ServletRequest 的子類型 |
處理請求的Web組件。 |
| 頁 |
javax.servlet. jsp.PageContext |
建立對象的JSP頁。 |
二、 jsp內建對象
1、request , HttpServletRequest,它包含了有關瀏覽器請求的資訊,並且提供了幾個用於擷取cookie,
header, 和session資料的有用的方法。
2、response, HttpServletResponse對象,並提供了幾個用於設定送回 瀏覽器的響應的方法(如cookies,頭資訊等)
3、out對象是javax.jsp.JspWriter的一個執行個體,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。
4、pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各種範圍的名字空間、servlet相關的對象的API,並且封裝了通用的servlet相關功能的方法。
5、session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯使用者的狀態資訊
6、applicaton 表示一個javax.servle.ServletContext對象。這有助於尋找有關servlet引擎和servlet環境的資訊
7、config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet執行個體的初始化參數。
8、page表示javax.servlet.jsp.HttpJspPage,從該頁面產生的一個servlet執行個體。
三、ServletContext、ServletContextListener、ServletContextEvent
ServletContextListener介面,它能夠監聽ServletContext對象的生命週期,實際上就是監聽Web應用的生命週期。當Servlet容器啟動或終止Web應用時,會觸發ServletContextEvent事件,該事件由 ServletContextListener 來處理。在ServletContextListener 介面中定義了處理ServletContextEvent事件的兩個方法。contextInitialized(ServletContextEvent sce):當Servlet容器啟動Web應用時調用該方法。在調用完該方法之後,容器再對Filter初始化,並且對那些在Web應用啟動時就需要被初始化的Servlet進行初始化。 contextDestroyed(ServletContextEvent sce):當Servlet容器終止Web應用時調用該方法。在調用該方法之前,容器會先銷毀所有的Servlet和Filter過濾器。
下面通過一個例子來介紹ServletContextListener的用法。CounterServlet類只能統計當Web應用啟動後,網頁被用戶端訪問的次數。如果重新啟動Web應用,計數器又會重新從1開始統計訪問次數。在實際應用中,往往需要統計自Web應用被發布後網頁被用戶端訪問的次數,這就要求當Web應用被終止時,計數器的數值被永久儲存在一個檔案中或者資料庫中,等到Web應用重新啟動時,先從檔案或資料庫中讀取計數器的初始值,然後在此基礎上繼續計數。
向檔案中寫入或讀取計數器的數值的功能可以由自訂的 MyServletContextListener類(參見常式4-11)來完成,它具有以下功能:
在 Web 應用程式啟動時從檔案中讀取計數器的數值,並把表示計數器的 Counter對象存放到 Web 應用程式範圍內。存放計數器的檔案的路徑為helloapp/count/count.txt。
在Web應用終止時把Web應用範圍內的計數器的數值儲存到count.txt檔案中。
常式4-11 MyServletContextListener.java
public class MyServletContextListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce){ System.out.println("helloapp application is Initialized."); //擷取ServletContext對象 ServletContext context=sce.getServletContext(); try{ //從檔案中讀取計數器的數值 BufferedReader reader=new BufferedReader( new InputStreamReader(context. getResourceAsStream("/count/count.txt"))); int count=Integer.parseInt(reader.readLine()); reader.close(); //建立計數器對象 Counter counter=new Counter(count); //把計數器對象儲存到Web應用範圍 context.setAttribute("counter",counter); }catch(IOException e){e.printStackTrace();} } public void contextDestroyed(ServletContextEvent sce){ System.out.println("helloapp application is Destroyed."); //擷取ServletContext對象 ServletContext context=sce.getServletContext(); //從Web應用範圍獲得計數器對象 Counter counter=(Counter)context.getAttribute("counter"); if(counter!=null){ try{ //把計數器的數值寫到count.txt檔案中 String filepath=context.getRealPath("/count"); filepath=filepath+"/count.txt"; PrintWriter pw=new PrintWriter(filepath); pw.println(counter.getCount()); pw.close(); }catch(IOException e){e.printStackTrace();} } } } |
使用者自訂的MyServletContextListener監聽器只有先向Servlet容器註冊,Servlet容器在啟動或終止Web應用時,才會調用該監聽器的相關方法。在web.xml檔案中,<listener>元素用於向容器註冊監聽器:
<listener> <listener-class>mypack.MyServletContextListener<listener-class /> </listener> |
下面按如下步驟示範MyServletContextListener監聽器的作用。
(1)在helloapp/count目錄下建立count.txt檔案,在該檔案中存放了一個數字“5”。
(2)啟動 Tomcat。在瀏覽器中通過 http://localhost:8080/helloapp/counter 訪問CounterServlet,在第一次訪問該Servlet時,瀏覽器端顯示計數器的值為5。
(3)重新整理上述訪問 CounterServlet 的頁面,會看到每重新整理一次,計數器的值增加1,假定最後一次重新整理後的計數器的值為10。
(4)手工終止helloapp應用。查看helloapp/count/count.txt檔案,會發現在該檔案中存放的數字變為10。
(5)手工重新啟動 helloapp 應用。在瀏覽器中再次訪問 CounterServlet,當第一次訪問該Servlet時,瀏覽器端顯示計數器的值為10。
從上述實驗中可以看出,MyServletContextListener 監聽器與 CounterServlet 共用Web應用範圍內的代表計數器的Counter對象。監聽器在Web應用啟動或終止時會操縱Counter對象,而Servlet在每次響應客戶請求時會操縱Counter對象。
觀察MyServletContextListener及名為lifeInit的 LifeServlet在 Tomcat 控制台的列印結果的先後順序,會發現當 Web 應用程式啟動時,Servlet容器先調用MyServletContextListener的contextInitialized()方法,再調用lifeInit的init()方法;當Web應用終止時,Servlet容器先調用lifeInit的destroy()方法,再調用MyServletContextListener的contextDestroyed()方法。由此可見,在Web應用的生命週期中,ServletContext對象最早被建立,最晚被銷毀。