Servlet--HttpServletRequest獲取請求信息(請求頭、請求行、參數)詳解

在Servlet API中,定義了一個HttpServletRequest接口,它繼承自ServletReauest接口,專門用來封裝HTTP請求消息。由於HTTP請求消息分爲請求行、請求消息頭和請求消息體三部分,因此,在HttpServletRequest接口中定義了獲取請求行、請求頭和請求消息體的相關方法。

我們在創建Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲代表請求的request和代表響應response。
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大,今天我們學習HttpServletRequest。

當訪問Servlet時,會在請求消息的請求行中,包含請求方法、請求資源名、請求路徑等信息,爲了獲取這些信息,在HTTPServletRequest接口中,定義了一系列用於獲取請求行的方法,如下表:

示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //獲取請求行的相關信息
        out.println("getMethod:" + request.getMethod() + "<br/>");
        out.println("getQueryString:" + request.getQueryString() + "<br/>");
        out.println("getProtocol:" + request.getProtocol() + "<br/>");
        out.println("getContextPath" + request.getContextPath() + "<br/>");
        out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
        out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
        out.println("getServletPath:" + request.getServletPath() + "<br/>");
        out.println("getRemoteAddr:" + request.getRemoteAddr() + "<br/>");
        out.println("getRemoteHost:" + request.getRemoteHost() + "<br/>");
        out.println("getRemotePort:" + request.getRemotePort() + "<br/>");
        out.println("getLocalAddr:" + request.getLocalAddr() + "<br/>");
        out.println("getLocalName:" + request.getLocalName() + "<br/>");
        out.println("getLocalPort:" + request.getLocalPort() + "<br/>");
        out.println("getServerName:" + request.getServerName() + "<br/>");
        out.println("getServerPort:" + request.getServerPort() + "<br/>");
        out.println("getScheme:" + request.getScheme() + "<br/>");
        out.println("getRequestURL:" + request.getRequestURL() + "<br/>");

通過request獲得請求頭

當請求Servlet時,需要通過請求頭向服務器傳遞附加信息,例如,客戶端可以接收的數據類型,壓縮方式,語言等。爲此,在HttpServletRequest接口中,定義了一系列用於獲取HTTP請求頭字段的方法,如下表:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //獲取請求頭信息
        Enumeration headerNames = request.getHeaderNames();
        //使用循環遍歷請求頭,並通過getHeader()方法獲取一個指定名稱的頭字段
        while (headerNames.hasMoreElements()){
            String headerName = (String) headerNames.nextElement();
            out.println(headerName + " : " + request.getHeader(headerName) + "<br/>");
        }
    }

通過request獲得請求體(請求參數)

在實際開發中,經常需要獲取用戶提交的表單數據,例如,用戶名,密碼、電子郵件等,爲了方便獲取表單中的請求參數,在HttpServletRequest接口總,定義了一些列獲取請求參數的方法,如下表所示:

示例:
創建一個帶有表單的jsp頁面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表單</title>
</head>
<body>
    <form action="/JavaEEDemo/request" method="post">
        用戶名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;碼:<input type="password" name="password"><br/>
        愛&nbsp;&nbsp;好:
        <input type="checkbox" name="hobby" value="sing">唱歌
        <input type="checkbox" name="hobby" value="dance">跳舞
        <input type="checkbox" name="hobby" value="football">足球
        <input type="submit" value="提交">

    </form>
</body>
</html>

編寫Servlet的doPost方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用戶名:" + username);
        System.out.println("密碼:" + password);

        //獲取參數名爲hobby的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.println("愛好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.println(hobbys[i] + ", ");
        }
    }

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