閱讀593 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Servlet、JSP和Spring MVC初學指南》——1.9 Http Servlets

本節書摘來自異步社區《Servlet、JSP和Spring MVC初學指南》一書中的第1章,第1.9節,作者:【加】Budi Kurniawan(克尼亞萬) , 【美】Paul Deck著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

1.9 Http Servlets

不說全部,至少大多數應用程序都要與HTTP結合起來使用。這意味著可以利用HTTP提供的特性。javax.servlet.http包是Servlet API中的第二個包,其中包含了用於編寫Servlet應用程序的類和接口。javax.servlet.http中的許多類型都覆蓋了javax.servlet中的類型。

圖1.5展示了javax.servlet.http中的主要類型。

screenshot

圖1.5 javax.servlet.http中的主要類型

1.9.1 HttpServlet
HttpServlet類覆蓋了javax.servlet.GenericServlet類。使用HttpServlet時,還要借助分別代表Servlet請求和Servlet響應的HttpServletRequest和HttpServletResponse對象。HttpServletRequest接口擴展javax.servlet.ServletRequest,HttpServletResponse擴展javax.servlet.ServletResponse。

HttpServlet覆蓋GenericServlet中的Service方法,並通過下列簽名再添加一個Service方法:

protected void service(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, java.io.IOException

新Service方法和javax.servlet.Servlet中Service方法之間的區別在於,前者接受HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。

像往常一樣,Servlet容器調用javax.servlet.Servlet中原始的Service方法。HttpServlet中的編寫方法如下:

public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException {
    HttpServletRequest request;
    HttpServletResponse response;
    try {
        request = (HttpServletRequest) req;
        response = (HttpServletResponse) res;
    } catch (ClassCastException e) {
        throw new ServletException("non-HTTP request or response");
    }
    service(request, response);
}

原始的Service方法將Servlet容器的request和response對象分別轉換成HttpServletRequest和HttpServletResponse,並調用新的Service方法。這種轉換總是會成功的,因為在調用Servlet的Service方法時,Servlet容器總會傳入一個HttpServletRequest和一個HttpServletResponse,預備使用HTTP。即便正在實現javax.servlet.Servlet,或者擴展javax.servlet.GenericServlet,也可以將傳給Service方法的servlet request和servlet response分別轉換成HttpServletRequest和HttpServletResponse。

然後,HttpServlet中的Service方法會檢驗用來發送請求的HTTP方法(通過調用request.getMethod),並調用以下方法之一:doGet、doPost、doHead、doPut、doTrace、doOptions和doDelete。這7種方法中,每一種方法都表示一個HTTP方法。doGet和doPost是最常用的。因此,不再需要覆蓋Service方法了,隻要覆蓋doGet或者doPost,或者覆蓋doGet和doPost即可。

總之,HttpServlet有兩個特性是GenericServlet所不具備的:

不用覆蓋Service方法,而是覆蓋doGet或者doPost,或者覆蓋doGet和doPost。在少數情況下,還會覆蓋以下任意方法:doHead、doPut、doTrace、doOptions和doDelete。
使用HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。
1.9.2 HttpServletRequest
HttpServletRequest表示HTTP環境中的Servlet請求。它擴展javax.servlet.ServletRequest接口,並添加了幾個方法。新增的部分方法如下:

java.lang.String getContextPath()
返回表示請求上下文的請求URI部分。

Cookie[] getCookies()
返回一個Cookie對象數組。

java.lang.String getHeader(java.lang.String name)
返回指定HTTP標題的值。

java.lang.String getMethod()
返回生成這個請求的HTTP方法名稱。

java.lang.String getQueryString()
返回請求URL中的查詢字符串。

HttpSession getSession()
返回與這個請求相關的會話對象。如果沒有,將創建一個新的會話對象。

HttpSession getSession(boolean create)
返回與這個請求相關的會話對象。如果有,並且create參數為True,將創建一個新的會話對象。

1.9.3 HttpServletResponse
HttpServletResponse表示HTTP環境中的Servlet響應。下麵是它裏麵定義的部分方法:

void addCookie(Cookie cookie)
給這個響應對象添加一個cookie。

void addHeader(java.lang.String name, java.lang.String value)
給這個響應對象添加一個header。

void sendRedirect(java.lang.String location)
發送一條響應碼,將瀏覽器跳轉到指定的位置。

下麵的章節將進一步學習這些方法。

最後更新:2017-05-27 17:31:26

  上一篇:go  《Servlet、JSP和Spring MVC初學指南》——1.10 處理HTML表單
  下一篇:go  《Servlet、JSP和Spring MVC初學指南》——1.8 GenericServlet