天天看點

Servlet學習

servlet,是運作在伺服器端的程式,它是被容器調用的(如tomcat),用于處理及響應用戶端的請求.

J2EE定義的是一系列的标準,沒有提供實作,沒有提供jar包。Tomcat中的servlet-api.jar實作了J2EE的API标準。

類結構圖:

GenericServlet是抽象類,其中定義了抽象方法service()。

HttpServlet也是抽象類,它沒有抽象方法,但它實作了service()方法,service()方法中又調用了doGet()和doPost()方法。doGet()和doPost()方法在HttpServlet類中都有預設的實作。而我們寫的servlet程式一般都繼承HttpServlet,重寫doGet和doPost方法。Service()方法被調用時會自動調用我們重寫的doGet或doPost方法,是以我們的Servlet程式主要任務就是重寫這兩個方法。

問題:我們的Servlet程式中重寫了doGet()和doPost()方法,service()方法是怎麼調用到我們寫的doGet()和doPost()方法的?

解答:這裡面用到了多态,重寫和繼承都有了,那麼父類引用指向子類對象是怎麼展現的呢?service方法是被容器中我們寫的Servlet類的執行個體調用的,而父類HttpServlet中又調用了this.doGet()和this.doPost()方法,這時就有了父類引用指向子類對象了:this(HttpServlet)->我們的Servlet執行個體。附上一個圖作為說明:

問題:service()方法什麼時候被調用?

解答:當用戶端送出請求的時候,容器調用service 方法并傳遞一個請求和響應對象。Servlet首先判斷該請求是GET 操作還是POST 操作。然後它調用下面的一個方法:doGet 或 doPost。如果請求是GET就調用doGet方法,如果請求是POST就調用doPost方法。

下面看看servlet的生命周期:

1、用戶端發送一個請求(也就是一個servlet的通路URL)

2、伺服器端解析請求(通過web.xml裡面的servlet配置解析)

3、servlet容器建立servlet的一個執行個體

  4、容器調用該執行個體的init()方法

  5、如果容器對該servlet有請求,則調用此執行個體的service()方法

6、傳回響應消息給servlet容器

7、傳回響應消息給用戶端

      8、容器在銷毀本執行個體前調用它的destroy()方法

  9、銷毀并标記該執行個體以供作為垃圾收集

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

HttpServletRequest req封裝了用戶端到伺服器端的請求,在伺服器端(即我們編寫的Servlet)中可以通過req擷取這些請求資訊。

HttpServletResponse resp從伺服器端傳回給用戶端的對象,也就是我們往resp中寫消息就可以放松給用戶端了。

問題:Servlet容器(如tomcat)怎樣調用我們寫的相應servlet?

解答:對了,在web.xml裡面配置。如:

<servlet> 

    <servlet-name>hw</servlet-name> 

    <servlet-class>com.dvnchina.test.HelloWorldServlet</servlet-class> 

    </servlet> 

    <servlet-mapping> 

    <url-pattern>/helloservlet</url-pattern> 

</servlet-mapping> 

本文轉自 yzzh9 51CTO部落格,原文連結:http://blog.51cto.com/java999/163704,如需轉載請自行聯系原作者

繼續閱讀