JSP&Servlet 學習筆記(二)

5,從容器到HttpServlet

請求過程:

當請求來到HTTP服務器,而HTTP服務器轉交請求給容器時,容器會創建一個代表當次請求的HttpServletRequest對象,

並將請求相關信息設置給該對象。同時,容器會創建一個HttpServletResponse對象,作爲稍後要對客戶端進行響應的

Java對象。

接着容器會根據讀取的@WebServlet標註或web.xml的設置,找出處理該請求的Servlet,調用它的service()方法,將創建的HttpServiceRequest對象,

HttpServletResponse對象傳入作爲參數,service()方法中會根據HTTP請求的方式,調用對應的doXXX()方法。

例如,若爲GET,則調用doGet()方法,接着在doGet()方法中,可以使用HttpServletRequest對象,HttpServletResponse對象。完成各種操作後容器將HttpServletRequest對象,

HttpServletResponse對象銷燬回收,該次請求相應結束。

web容器管理對象的生命週期,負責請求/響應對象的創建與銷燬。

6,doXXX()方法

Svervlet接口的service()方法簽名其實接受的是ServletRequest,ServletResponse;

public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException;

定義Servlet期待Servlet不僅僅應用於HTTP故與HTTP相關的行爲分別由ServletRequest,ServletResponse,的子接口定義。

Web容器確實創建的是HttpServletRequest,HttpServletResponse的實現對象,然後調用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(request,response),其實是HttpServlet新定義的方法:

Protected void service(ServletRequest req,ServletResponse res) throws ServletException,IOException{
String method=req.getMethod();
if(method.equals(METHOD_GET)){
long lastModified=getLastModified(req);/緩存頁面的最新更新時間
if(lastModified==-1){
doGet(req,resp);
}else{
long ifModifiedSince=req.getDateHeader(HEADER_IFMODSINCE);///網頁的最後修改時間
if(ifModifiedSince<(lastModified/1000*1000)){
maybeSetLastModified(resp,lastModified);
doGet(req,resp);
}else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
}else if(method.equals(METHOD_HEAD)){
long lastModified=getLastModified(req);
maybeSetLastModified(resp,lastModified);
doHead(req,resp);
}else if(method.equals(METHOD_POST)){
doPost(req,resp);
}else if(method.equals(METHOD_PUT)){
......

}
}

如果網頁的最後修改時間比最新更新時間指定的時間早的話,web服務器就會請求的頁面,如果自If-modified-Since指定的時間以來,網頁內容沒有被修改的話,服務器就會返回一個304響應頭,一次告訴瀏覽器繼續使用已緩存的頁面。

這也是爲什麼在繼承HttpServlet之後,必須實現與HTTP方法對應的doXXX()方法來處理請求。HTTP中定義了GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE

等請求方式,而HttpServlet中對應的方法:

doGet():處理HTTP GET 請求

doPost()處理HTTP POST 請求:

doPut():處理HTTP PUT 請求

doDelete():處理HTTP DELETE 請求

doHead():處理HTTP HEAD 請求

doOptions():處理HTTP OPTIONS 請求

doTrace():處理HTTP TRACE 請求

假若客戶端發出沒有實現的請求:(HttpServlet的doGet()):

protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
String protocol=req.getProtocol();
String msg=lStrings.getString("http.method_get_not_supported");
if(protocol.endsWith("1.1")){
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,msg);
}else{
resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);
}
}

當沒有重新定義doGet方法客戶端發出GET請求其會收到錯誤信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章