在Servlet API 章節,我們已經談到了一部分關於H他Http Servvlet 的一部分。在本篇文章中,我們更加細緻地討論Http Servlet.
不像GenericServlet, Http Servlet 不會重載service()方法,而是重載doGet(),doPost()方法,或者同時重載這兩個方法。doGet()方法用於從服務器獲取信息,doPost()方法發送信息到服務器。
在Http Servlet中,沒有必要重載service()方法,因爲這個方法分發http 請求的哦呵對應的處理方法中,例如,如果接收到Http Get請求,就分發此請求到doGet()方法。
Http Servlet 如何工作的?
正如你看到的下面的這張圖,客戶端(用戶的瀏覽器)製造請求,這個請求可以是任意類型,例如是Get請求,Post請求,Head請求等,服務分發這些請求到servlet的service()方法。此方法分發這些請求到對應的處理者上,例如接收到Get請求,它就會分發請求到doGet()方法。
Http Servlet的繼承關係
java.lang.Object
|_extended by javax.servlet.GenericServlet
|_extended by javax.servlet.http.HttpServlet
我已經在Generic Servlet 章節說過了總是應該使用HttpServlet而不是GenericServlet。HttpServlet 是很容易使用的,比GenericServlet有更多的方法。
Http Servlet 例子
我們創建一個html文件,它將在我們點擊這個頁面上的鏈接時調用一次servlet.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Http Servlet Demo</title>
</head>
<body>
<a href="welcome">Click to call Servlet</a>
</body>
</html>
ExampleHttpServlet.java
現在我們通過繼承HttpServlet類創建了Http Servlet.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Creating Http Servlet by Extending HttpServlet class
public class ExampleHttpServlet extends HttpServlet
{
private String mymsg;
public void init() throws ServletException
{
mymsg = "Http Servlet Demo";
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException
{
// Setting up the content type of web page
response.setContentType("text/html");
// Writing the message on the web page
PrintWriter out = response.getWriter();
out.println("<h1>" + mymsg + "</h1>");
out.println("<p>" + "Hello Friends!" + "</p>");
}
public void destroy()
{
// Leaving empty. Use this if you want to perform
//something at the end of Servlet life cycle.
}
}
web.xml
<web-app>
<display-name>BeginnersBookServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>MyHttpServlet</servlet-name>
<servlet-class>ExampleHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyHttpServlet</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
</web-app>
現在,我們的目錄結構看起來像這個樣子:
HttpServlet
├── index.html
└── WEB-INF
├── classes
│ └── ExampleHttpServlet.java
└── web.xml
放到tomcat webapps目錄器,
在classes編譯java文件
啓動tomcat
HttpServlet類中的方法
1) protected void doGet(HttpServletRequest req, HttpServletResponse resp): 這個方法被servlet的service()方法調用處理Http GET請求。當重載這個方法,讀取請求數據,寫響應頭信息,獲取response的writer或者輸出流對象,最終寫響應數據。
2) protected long getlastModified(HttpServletRequest res): 返回一個長整形指明HttpServletRequest對象最後修改時間。格林尼治時間1970年1月1日午夜後的毫秒,如果不知道時間,則爲-1。
3) protected void doHead(HttpServletRequest req, HttpServletResponse resp): servlet服務方法調用此方法來處理來自客戶端的HTTP頭請求。當客戶只希望查看響應的頭信息(如內容類型或內容長度)時,就發送HEAD請求
4) protected void doPost(HttpServletRequest req, HttpServletResponse resp): servlet服務方法調用此方法來處理來自客戶機的POST請求。HTTP POST方法允許客戶端一次性向Web服務器發送無限長度的數據(但是瀏覽器實際上是做了限制),在向服務器發送信息時非常有用。與我們從服務器獲取信息的doGet不同,當我們將信息從客戶端傳輸到服務器時,將使用此方法。
5) protected void doPut(HttpServletRequest req, HttpServletResponse resp): servlet服務方法調用此方法來處理來自客戶機的PUT請求。此方法與doPost方法類似,但與我們將信息發送到服務器的doPost方法不同,此方法將文件發送到服務器,這類似於從客戶機到服務器的FTP操作。
6) protected void doDelete(HttpServletRequest req, HttpServletResponse resp): 由servlet service()方法調用來處理來自客戶機的刪除請求,該請求允許客戶機從服務器刪除文檔、網頁或信息。
7) protected void doOptions(HttpServletRequest req, HttpServletResponse resp): 由service()方法調用,以允許servlet處理選項請求。OPTIONS請求確定服務器支持哪些HTTP方法,並返回適當的標頭。
8) protected void doTrace(HttpServletRequest req, HttpServletResponse resp): 此方法由service()方法調用,用於處理跟蹤請求。用於調試目的。
9) rotected void service(HttpServletRequest req, HttpServletResponse resp): 不需要覆蓋此方法,此方法從客戶端接收HTTP請求並將其轉發給相應的doXXX方法,如doGet()、doPost()、doHEAD()等。
10) public void service(ServletRequest req, ServletResponse res): 將客戶端請求轉發到受保護的service()方法。也沒有必要重寫這個方法。