1. 程式人生 > >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 logicdoGet(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 lessmaybeSetLastModified(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);