HttpServlet是javax.servlet.http包下的一個(gè)抽象類,這個(gè)包提供了用來擴(kuò)展基于http協(xié)議的Servlet。HttpServlet繼承與GenericServlet,不僅重寫了service(ServletRequest req,ServletResponse res)方法,還提供了很多與http協(xié)議有關(guān)的方法。
1.HttpServlet詳解
為了讓大家更加清晰的理解HttpServlet,下面我們通過一張圖來了解HttpServlet的相關(guān)方法,如圖1-1所示:
圖1-1 HttpServlet 方法
由圖1-1可知,HttpServlet中自帶的方法大多都是以“do”開頭,例如doGet、doPost等。我們知道GET和POST是Http協(xié)議中的請(qǐng)求方式,那么doGet,doPost方法其實(shí)是分別對(duì)get請(qǐng)求和post請(qǐng)求進(jìn)行處理的方法。其中,還有兩個(gè)service()方法,一個(gè)是重寫GenericServlet 類的service()方法,一個(gè)是自定義的service()方法,它們的參數(shù)類型也不一樣。 自定義的service(HttpServletRequest req,HttpServletResponse resp)方法,該方法中的參數(shù)都是javax.servlet.http包下的類,即都是基于Http協(xié)議的。ServletRequest與HttpServletRequest、ServletResponse與HttpServletResponse都是父子關(guān)系。
為了讓大家更好的理解HttpServlet,下面我們通過一張圖來描述其原理,如圖1-2所示:
圖1-2 HttpServlet 原理圖
圖1-2是HttpSerlvet類的工作原理,下面通過一張序列圖來理解當(dāng)客戶端訪問Servlet時(shí),底層的一些方法調(diào)用的順序,如圖1-3所示:
圖1-3 HttpServlet時(shí)序圖
我們自己創(chuàng)建的Servlet類繼承了HttpServlet,不需要重寫service()方法,只需要重寫doGet()和doPost()。因?yàn)樵谝院蟮拈_發(fā)中最常用的請(qǐng)求方式是get和post,所以一般重寫它們即可,如果不重寫就會(huì)調(diào)用父類的doGet()和doPost()方法,父類的這兩個(gè)方法是向客戶端響應(yīng)405狀態(tài)碼。
2.HttpServlet動(dòng)手體驗(yàn)
由于大多數(shù)客戶端的請(qǐng)求方式都是GET和POST,因此學(xué)習(xí)如何使用HttpServlet中的doGet()和doPost()方法變得相當(dāng)重要。接下來通過一個(gè)具體的案例,詳細(xì)了解這兩個(gè)方法的使用,雙擊此處
下載案例源代碼,詳細(xì)步驟請(qǐng)參考
HttpServlet案例詳解,具體如下:
(1)創(chuàng)建一個(gè)web應(yīng)用Example12,在【src】目錄下新建一個(gè)類TestServlet,該Servlet繼承HttpServlet。具體代碼如例1-1所示:
例1-1 TestServlet.java
public class TestServlet extends HttpServlet {
/*
* 重寫doPost方法
* */
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost() ...........");
}
}
(2)接著在web.xml對(duì)TestServlet 進(jìn)行配置,具體代碼如例1-2所示:
例1-2 web.xml配置TestServlet
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>cn.itcast.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
(3)將應(yīng)用發(fā)布到Tomcat服務(wù)器中,啟動(dòng)Tomcat服務(wù)器,在瀏覽器端地址欄上輸入http://localhost:8080/Example12/TestServlet,瀏覽器顯示結(jié)果如圖1-4所示:
圖1-4運(yùn)行結(jié)果
由圖1-4的可知,服務(wù)器端響應(yīng)給瀏覽器端405狀態(tài)碼,在
常用狀態(tài)碼中對(duì)405狀態(tài)碼進(jìn)行了介紹,出現(xiàn)這樣的結(jié)果是因?yàn)楫?dāng)前的請(qǐng)求方式?jīng)]有在服務(wù)器端進(jìn)行處理,我們?cè)诜?wù)器端只重寫了doPost()方法,并沒有重寫doGet()方法,而當(dāng)前請(qǐng)求是GET請(qǐng)求,所以這個(gè)時(shí)候會(huì)去調(diào)用父類HttpServlet的doGet()方法,HttpServlet的doGet()方法響應(yīng)給客戶端405狀態(tài)碼。
(5)對(duì)Example12應(yīng)用中的index.jsp頁(yè)面做修改,主要代碼如例1-3所示:
例1-3 index.jsp
<body>
<form action ="/Example12/TestServlet" method="post">
用戶名:<input type="text" name="username"/></br>
<input type="submit" value="提交"/>
</form>
</body>
例1-3中,index.jsp頁(yè)面中的表單,提交路徑是“/Example12/TestServlet”,請(qǐng)求方式是post請(qǐng)求。
(6)重新啟動(dòng)Tomcat服務(wù)器,在瀏覽器端地址欄上輸入http://localhost:8080/Example12,然后點(diǎn)擊表單的提交按鈕,控制臺(tái)打印結(jié)果如圖1-5所示:
圖1-5 運(yùn)行結(jié)果
由運(yùn)行結(jié)果得知doPost()方法被調(diào)用了,請(qǐng)求方式post請(qǐng)求,服務(wù)器調(diào)用service方法,service方法根據(jù)請(qǐng)求方式來調(diào)用相應(yīng)的方法進(jìn)行處理。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee