JavaWeb(五)Servlet-2

1、HTTP簡介

WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循一定的規則,這個規則就是HTTP協議。

HTTP是 hypertext transfer protocol(超文本傳輸協議)的簡寫,它是 TCP/IP 協議集中的一個應用層協議,用於定義WEB瀏覽器與WEB服務器之間交換數據的過程以及數據本身的格式。

HTTP協議的版本 HTTP/1.0、HTTP/1.1、HTTP-NG、HTTP/2.0。

2、HTTP 的會話方式

四個步驟:


瀏覽器與WEB服務器的連接過程是短暫的,每次連接只處理一個請求和響應。對每一個頁面的訪問,瀏覽器與WEB服務器都要建立一次單獨的連接。

瀏覽器到WEB服務器之間的所有通訊都是完全獨立分開的請求和響應對。

3、HTTP請求消息和響應消息

請求消息和響應消息的結構都是一個請求行、若干消息頭、以及實體內容,其中的一些消息頭和實體內容都是可選的,消息頭和實體內容之間要用空行隔開。

響應消息的實體內容就是網頁文件的內容,也就是在瀏覽器中使用查看源文件的方式所看到的內容。

一個使用GET方式的請求消息中不能包含實體內容,只有使用POST、PUT和DELETE方式的請求消息中才可以包含實體內容。

4、使用GET和POST方式傳遞參數

4.1 使用GET方式傳遞參數

在瀏覽器地址欄中輸入某個URL地址或單擊網頁上的一個超鏈接時,瀏覽器發出的HTTP請求消息的請求方式爲GET。 如果網頁中的表單元素的method屬性被設置爲了“GET”,瀏覽器提交這個FORM表單時生成的HTTP請求消息的請求方式也爲GET。

使用GET請求方式給WEB服務器傳遞參數的格式:

http://localhost:8080/JavaWeb01/loginServlet?user=188xxxx6527&password=257257

使用GET方式傳送的數據量一般限制在1KB以下。


4.2 使用POST方式傳遞參數

POST請求方式主要用於向WEB服務器端程序提交FORM表單中的數據。POST方式將各個表單字段元素及其數據作爲HTTP消息的實體內容發送給WEB服務器,傳送的數據量要比使用GET方式傳送的數據量大得多。


5、ServletRequest

Servlet API 中定義的 ServletRequest 接口類用於封裝請求消息。

HttpServletRequest 是專用於HTTP協議的ServletRequest 子接口,它用於封裝 HTTP 請求消息。

在 service() 方法內部調用 HttpServletRequest 對象的各種方法來獲取請求消息。

(1)獲取請求行的相關信息

HTTP請求消息的請求行包括請求方式、資源路徑和HTTP協議版本:

getMethod:返回HTTP請求消息中的請求方式。

getRequestURI:返回請求行中的資源名部分。

getQueryString :返回請求行中的參數部分。

getProtocol:返回請求行中的協議名和版本。

getContextPath:返回請求資源所屬於的WEB應用程序的路徑。

getPathInfo:返回請求URL中的額外路徑信息。額外路徑信息是請求URL中的位於Servlet的路徑之後和查詢參數之前的內容,它以“/”開頭。

getPathTranslated:返回URL中的額外路徑信息所對應的資源的真實路徑。

getServletPath方法:Servlet的名稱或Servlet所映射的路徑。

(2)獲取網絡連接信息

getRemoteAddr方法返回發出請求的客戶機的IP地址,其格式爲“192.168.0.3”這種形式的字符文本。 (*)

getRemoteHost方法返回發出請求的客戶機的完整主機名,即“pc1.atguigu.com”這種格式。

getRemotePort方法返回發出請求的客戶機所使用的網絡接口的端口號。

getLocalAddr方法返回WEB服務器上接收當前請求的網絡接口的IP地址。

getLocalName方法返回WEB服務器上接收當前請求的網絡接口的IP地址所對應的主機名。

getLocalPort方法返回WEB服務器上接收當前請求的網絡接口的端口號。

getServerName方法返回當前請求所指向的主機名。

getServerPort方法返回當前請求所連接的服務器端口號。

getScheme方法返回請求的協議名,例如http、https或ftp。

getRequestURL方法返回客戶端發出請求時的完整URL。

(3)獲取請求頭信息

getHeader方法

getHeaders方法

getHeaderNames方法

getIntHeader方法

getDateHeader方法

getContentType方法

getContentLength方法

getCharacterEncoding方法

(4)獲取請求參數

getParameter方法

getParameterValues方法

getParameterNames方法

getParameterMap方法

(5)請求域屬性

存儲在ServletRequest對象中的對象稱之爲請求域屬性,屬於同一個請求的多個處理模塊之間可以通過請求域屬性來傳遞對象數據。

與請求域屬性相關的方法:

setAttribute方法

getAttribute方法 

removeAttribute方法

getAttributeNames方法


6、ServletResponse簡介

Servlet API中定義的ServletResponse接口類用於創建響應消息。

HttpServletResponse是專用於HTTP協議的ServletResponse子接口,它用於封裝HTTP響應消息。

(1)getWriter(): 返回 PrintWriter 對象. 調用該對象的 print() 方法, 將把 print() 中的參數直接打印到客戶的瀏覽器上。


(2)設置響應的內容類型: response.setContentType("application/msword");

7、GenericServlet

(1)是一個 Serlvet,是 Servlet 接口和 ServletConfig 接口的實現類,但是一個抽象類,其中的 service 方法爲抽象方法。

(2)如果新建的 Servlet 程序直接繼承 GenericSerlvet 會使開發更簡潔。

(3)具體實現:

①. 在 GenericServlet 中聲明瞭一個 SerlvetConfig 類型的成員變量, 在 init(ServletConfig) 方法中對其進行了初始化

②. 利用 servletConfig 成員變量的方法實現了 ServletConfig 接口的方法

③. 還定義了一個 init() 方法, 在 init(SerlvetConfig) 方法中對其進行調用, 子類可以直接覆蓋 init() 在其中實現對 Servlet 的初始化.

④. 不建議直接覆蓋 init(ServletConfig), 因爲如果忘記編寫 super.init(config); 而還是用了 SerlvetConfig 接口的方法,則會出現空指針異常.

⑤. 新建的 init(){} 並非 Serlvet 的生命週期方法. 而 init(ServletConfig) 是生命週期相關的方法.

源碼:

public abstract class GenericServlet implements Servlet, ServletConfig,        java.io.Serializable {    private static final long serialVersionUID = 1L;    private transient ServletConfig config;    public GenericServlet() {    }    @Override    public void destroy() {    }    @Override    public String getInitParameter(String name) {        return getServletConfig().getInitParameter(name);    }    @Override    public Enumeration getInitParameterNames() {        return getServletConfig().getInitParameterNames();    }    @Override    public ServletConfig getServletConfig() {        return config;    }    @Override    public ServletContext getServletContext() {        return getServletConfig().getServletContext();    }    @Override    public String getServletInfo() {        return "";    }    @Override    public void init(ServletConfig config) throws ServletException {        this.config = config;        this.init();    }    public void init() throws ServletException {    }    public void log(String msg) {        getServletContext().log(getServletName() + ": " + msg);    }    public void log(String message, Throwable t) {        getServletContext().log(getServletName() + ": " + message, t);    }    @Override    public abstract void service(ServletRequest req, ServletResponse res)            throws ServletException, IOException;    @Override    public String getServletName() {        return config.getServletName();    }}


8、HttpServlet

(1)是一個 Servlet,繼承自 GenericServlet,針對於 HTTP 協議所定製。

(2)在 service() 方法中直接把 ServletReuqest 和  ServletResponse 轉爲 HttpServletRequest 和 HttpServletResponse;並調用了重載的 service(HttpServletRequest, HttpServletResponse);在 service(HttpServletRequest,HttpServletResponse) 獲取了請求方式: request.getMethod();根據請求方式有創建了doXxx() 方法(xxx 爲具體的請求方式,比如 doGet, doPost)。

(3)實際開發中,直接繼承 HttpServlet,並根據請求方式複寫 doXxx() 方法即可。

(4)好處:直接由針對性的覆蓋 doXxx() 方法,直接使用 HttpServletRequest 和  HttpServletResponse,不再需要強轉。

源碼:

public abstract class HttpServlet extends GenericServlet {    private static final long serialVersionUID = 1L;    private static final String METHOD_GET = "GET";    private static final String METHOD_POST = "POST";    public HttpServlet() {    }    @Override    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);    }    protected void service(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException {        String method = req.getMethod();        if (method.equals(METHOD_GET)) {            doGet(req, resp);        } else if (method.equals(METHOD_POST)) {            doPost(req, resp);        } else {        }    }    protected void doGet(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException{    }    protected void doPost(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException {    }}


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