Servlet總結——servlet的主要介面、類

來源:互聯網
上載者:User

標籤: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的主要介面、類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.