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
.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。
(六)重點
6.1.servlet的生命週期。
1)init(ServletConfig config)
初始化方法
其中引數:ServletConfig ---- Servlet物件的配置資訊物件 該物件內部封裝著該 servlet物件一些配置資訊
ServletConfig 的作用:
1、獲得該servlet的物件的初始化引數
2、獲得Servlet的名稱
<servlet-name>QuickStartServlet1</servlet-name>
3、獲得Servletcontext物件
2)service(ServletRequest request,ServletResponse response)
service方法每次訪問都會執行
其中引數:
ServletRequest :代表請求 該物件內部封裝的是http請求的資訊
ServletResponse :代表響應 該物件內部封裝的是響應的資訊
3)destroy()
6.2.servlet的上下文(ServletContext)
1.什麼是ServletContext物件
直譯:Servlet上下文
ServletContext代表一個web應用。
ServletContext物件的生命週期?
伺服器啟動建立ServletContext物件,伺服器關閉銷燬該物件
2.怎樣獲得ServletContext物件
1)ServletContext context = config.getServletContext();
2)ServletContext context = getServletContext();
3.ServletContext的作用
(1)獲得web應用的全域性的初始化引數
(2)獲得web應用中任何資源的絕對路徑
它的相對路徑是tomcat,也就是整個部署到伺服器上的,
this.getServletContext().getRealPath(“相對與web的路徑”);
類載入器相對路徑是classes,在開發中,經常用類載入器來載入classes路徑下的內容
類名.class.getClassLoader().getResource(“相對於classes的路徑”).getPath();
(3)ServletContext是一個域物件
域物件:儲存資料的區域物件
域物件可以存取資料:(所有的域物件 都有如下三個方法)
域物件.setAttribute(name,value);
域物件.getAtrribute(name);
域物件.removeAttribute(name);