《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中的主要類型。
圖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