標籤:des style blog http io ar color os 使用
Servlet總結01——servlet的主要介面、類
(一)servlet類
Servlet主要類、介面的結構如所示:
要編寫一個Servlet需要實現javax.servlet.Servlet介面,該介面定義了5個方法。如下:
1.init(),初始化servlet對象,完成一些初始化工作。
它是由servlet容器控制的,該方法只能被調用一次,初始化過程如下:
2.service(),接受用戶端請求對象,執行業務操作,利用響應對象響應用戶端請求。
3.destroy(),當容器監測到一個servlet從服務中被移除時,容器調用該方法,釋放資源。
4.getServletConfig(),ServletConfig是容器向servlet傳遞參數的載體。
5.getServletInfo(),擷取servlet相關資訊。
(二)與servlet相關的介面
從servlet僅有的5個方法當中,我們知道其涉及3個介面,分別是:
ServletConfig
ServletRequest
ServletResponse
2.1. ServletConfig
主要方法:
重點關注getServletContext,之前說servletConfig是容器向servlet傳遞參數的載體,那麼它也可以讓Servlet擷取其在容器中的上下文。
ServletContext是針對一個web應用,jdk中具體描述——
There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server‘s URL namespace such as /catalog and possibly installed via a .war file.)
2.2.ServletRequest
擷取用戶端發來的請求資料。(查看api)
note:注意getAttribute和getParameter的區別。
getAttribute( String name )可以得到由setAttribute()設定的參數值,相當於是使用getAttribute()得到一
個自己定義的參數,而不是從用戶端得到的參數。
getParameter( String name )它用來擷取用戶端通過get或post方法等傳遞過來的值,是從用戶端傳遞過來的,
一般指的是用戶端提交的表單組件的值。
note:setCharacterEncoding在什麼時候使用才有效?
它可以覆蓋請求本文中所使用的字元編碼,但是它必須在讀取parameters之前設定,否則無效。
2.3.ServletResponse
響應用戶端請求。(查看api)
(三)GenericServlet抽象類別
為了簡化serlvet的編寫,在javax.servlet包中提供了一個抽象類別GenericServlet,它給出了除service()方法以外的簡單實現。
GenericServlet定義了一個通用的,不依賴具體協議的Servlet,它實現了Servlet介面和ServletConfig介面。
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
(四)HttpServlet抽象類別
HttpServlet主要是應用於HTTP協議的請求和響應,為了快速開發HTTP協議的serlvet,sun提供了一個繼承自GenericServlet的抽象類別HttpServlet,
用於建立適合Web網站的HTTP Servlet。
public abstract class HttpServlet extends GenericServlet implements java.io.Serializable
重點關注HttpServlet中的一個私人方法service。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn‘t support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less 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)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } } |
而它實現Servlet介面的service方法,是將ServletResponse對象和ServletRequest對象轉化成httpServletResponse對象和HttpservletRequest對象,
然後再調用私人方法service。它根據request擷取Http method(get、post等)的名稱,根據http method調用不同的方法執行操作。
(五)HttpServletRequest、HttpServletResponse
由於HttpServletRequest和HttpServletResponse都是基於Http協議“升級改造”的,所以這兩個對象較之ServletRequest和ServletResponse多出的方法主要和
Http協議相關。
例如:Cookie、request(response)headers、Session、URL等。
具體請查看api。
Servlet總結——servlet的主要介面、類