Servlet相關介面和Servlet的生命週期

來源:互聯網
上載者:User

標籤:des   style   blog   http   java   color   

建立一個Servlet類最直接的方式是實現javax.servlet.Servlet介面,Servlet介面的定義如下,其中定義了5個方法,Servlet的生命週期就是通過這幾個方法體現的:

 1 public interface Servlet { 2     public void init(ServletConfig config) throws ServletException; 3      4     public ServletConfig getServletConfig(); 5      6     public void service(ServletRequest req, ServletResponse res) 7             throws ServletException, IOException; 8              9     public String getServletInfo();10     11     public void destroy();12 }

1 . 載入和執行個體化

首先定義一個DemoServlet實現Servlet介面,覆寫介面中的方法,分別列印各自的方法名,在無參構造方法中也列印一句話:

 1 public class DemoServlet implements Servlet { 2  3     public DemoServlet() { 4         System.out.println("constructor…"); 5     } 6  7     @Override 8     public void destroy() { 9         System.out.println("DemoServlet.destroy()");10     }11 12     @Override13     public ServletConfig getServletConfig() {14         System.out.println("DemoServlet.getServletConfig()");15         return null;16     }17 18     @Override19     public String getServletInfo() {20         System.out.println("DemoServlet.getServletInfo()");21         return null;22     }23 24     @Override25     public void init(ServletConfig config) throws ServletException {26         System.out.println("DemoServlet.init()");27     }28 29     @Override30     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {31         System.out.println("DemoServlet.service()");32     }33 34 }

Servlet要被容器所管理,需要在web.xml中進行配置:

1 <servlet>                                           2     <servlet-name>demo</servlet-name>               3     <servlet-class>servlet.DemoServlet</servlet-classs>4 </servlet>                                          5 <servlet-mapping>                                   6     <servlet-name>demo</servlet-name>               7     <url-pattern>/demo</url-pattern>                8 </servlet-mapping>                                  

啟動伺服器,通過“http://localhost:8080/${contextpath}/demo”請求該Servlet,控制台列印輸出如下:

重新整理頁面,再次請求該Servlet,控制台列印如下,可以看到,第二次請求只執行了service(ServletRequest req, ServletResponse res)方法:

當伺服器接收到請求時,會通過web.xml中的配置尋找匹配的Servlet,找不到則報404錯誤;找到之後,根據配置的Servlet類的全限定名尋找伺服器中是否已經存在該Servlet類的執行個體,若存在則直接使用它來處理本次請求(上面的第二次請求,該Servlet執行個體已經存在,直接調用該執行個體的service(ServletRequest req, ServletResponse res)方法。);若不存在,則根據全限定名通過反射建立執行個體(調用公用無參的構造方法)。從這裡可以看出,若沒有提供可訪問的無參構造方法,會報錯:

1 //提供有參構造方法,覆蓋了預設的無參構造方法                     2 public DemoServlet(String s) {              3     System.out.println("constructor…");     4 }                                           

 

伺服器通過反射調用Class.newInstance()方法建立執行個體,找不到可訪問的無參構造方法,自然會報錯。

2 . 初始化

從上面可以看到,在第一次請求,建立Servlet執行個體的時候,調用了init(ServletConfig config)方法完成初始化。初始化只會在建立執行個體的時候進行,以後的請求不會再進行初始化,直接調用service()方法處理請求。伺服器在進行Servlet初始化的時候,會首先準備一個ServletConfig對象,通過該對象可以從應用程式的配置資訊中擷取初始化的參數資訊;資料庫連接的建立等任務通常也是在初始化階段完成。

ServletConfig介面中定義了4個方法,用來擷取初始化參數資訊:

 1 public interface ServletConfig { 2     //擷取Servlet的名字,即在web.xml中<servlet-name>demo</servlet-name>節點配置的資訊 3     public String getServletName(); 4  5     //擷取Servlet內容物件 6     public ServletContext getServletContext(); 7  8     //根據參數名擷取初始化參數值 9     public String getInitParameter(String name);10     11     //擷取所有初始化參數名12     public Enumeration<String> getInitParameterNames();13 }

初始化參數可以在web.xml中配置:

 1 <servlet>                                             2     <servlet-name>demo</servlet-name>                 3     <servlet-class>servlet.DemoServlet</servlet-class> 4     <init-param>                                      5         <param-name>username</param-name>             6         <param-value>admin</param-value>              7     </init-param>                                     8 </servlet>                                            9 <servlet-mapping>                                    10     <servlet-name>demo</servlet-name>                11     <url-pattern>/demo</url-pattern>                 12 </servlet-mapping>                                   

注意:如果在web.xml中配置了<load-on-startup>1</load-on-startup>,該Servlet會在伺服器啟動的時候就完成執行個體的建立和初始化,而不是在第一次請求的時候:

1 <servlet>                                                 2     <servlet-name>demo</servlet-name>                     3     <servlet-class>servlet.DemoServlet</servlet-class>    4     <load-on-startup>1</load-on-startup>                  5 </servlet>                                                6 <servlet-mapping>                                         7     <servlet-name>demo</servlet-name>                     8     <url-pattern>/demo</url-pattern>                      9 </servlet-mapping>                                        

3 . 處理請求

伺服器調用service(ServletRequest req, ServletResponse res)方法來處理請求。處理請求之前,init()方法必須成功執行。伺服器在調用service(ServletRequest req, ServletResponse res)方法之前,已經準備好了ServletRequest對象和ServletResponse對象,並作為參數傳給service(ServletRequest req, ServletResponse res)方法。

ServletRequest介面和ServletResponse介面中定義了用來處理請求和響應的相關方法:

4 . 銷毀

當容器檢測到一個Servlet執行個體應該從服務中被移除的時候,容器就會調用執行個體的destroy()方法,以便讓該執行個體可以釋放它所使用的資源,儲存資料到持久存放裝置中。當需要釋放記憶體或者容器關閉時,容器就會調用Servlet執行個體的destroy()方法。在destroy()方法調用之後,容器會釋放這個Servlet執行個體,該執行個體隨後會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會建立一個新的Servlet執行個體。

destroy()方法跟init()方法一樣,在Servlet的生命週期中只會被執行一次,但destroy()方法不會總是被執行,如伺服器被異常終止時,destroy()方法就不能被執行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.