Servlet中的request對象概述及相關API

Request和Response生成過程

回顧一下Servlet的調用過程,我們創建一個MyServlet類,並且定義了相關方法處理最初來自客戶端瀏覽器的http請求,在方法中將"hello"寫入response中,代碼如下:

@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("hello");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

最終我們打開瀏覽器,輸入http://localhost:8080/demo/myServlet就可以在頁面上看到可愛的hello。

在這裏插入圖片描述

事實上,當我們輸入網址,到看到頁面的hello,短短的時間內,瀏覽器,服務器以及Servlet三者之間的交互如下

在這裏插入圖片描述
這張圖網上有,因爲字體太小了,我就想把裏面的字畫大個一些,並結合這個例子分析一下。

我們之前分析過:服務器生成req和res對象,調用HttpServlet的service方法時,將會轉化成HttpServletRequest和HttpServletResponse對象,處理數據之後,response對象返回給服務器,服務器將response對象作爲響應返回給瀏覽器。


因此,request和response是啥,也就一目瞭然了,一個代表請求,一個代表響應,他們與HTTP協議都有着密不可分的協議。當然這兩個對象也會有相關的方法,去設置響應的內容,或者獲取請求的內容。

繼承結構

ServletRequest:request頂級接口,定義了request應該具有的基本方法。

HttpServletRequest:繼承於ServletRequest的接口,增加了關於http協議相關的API

常用方法

瀏覽器輸入:http://localhost/demo/requestDemo1?username=summerday&gender=male

一、和客戶端相關的信息

/**
 * @auther Summerday
 *
 * 請求客戶端參數API
 */
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取客戶端發出請求的完整URL:http://localhost/demo/requestDemo1
        StringBuffer requestURL = request.getRequestURL();
        System.out.println("請求完整URL:"+requestURL.toString());

        //獲取資源名URI :/demo/requestDemo1
        String requestURI = request.getRequestURI();
        System.out.println("請求資源URI:"+requestURI);

        //返回請求行中的參數部分:username=summerday&gender=male
        String queryString = request.getQueryString();
        System.out.println("請求參數:"+queryString);

        //返回發出請求的客戶機IP地址:ipv6地址 0:0:0:0:0:0:0:1
        String remoteAddr = request.getRemoteAddr();
        System.out.println("客戶機IP:"+remoteAddr);

        //獲取客戶端的請求方式:GET
        String method = request.getMethod();
        System.out.println("請求方式:"+method);

        //獲取當前web應用虛擬目錄的名稱:/demo
        String contextPath = request.getContextPath();
        System.out.println("虛擬目錄:"+contextPath);//畫個重點!
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

二、獲取請求頭信息

/**
 * @auther Summerday
 *
 * 獲取請求頭信息
 */
@WebServlet("/RequestDemo2")
public class RequestDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //getHeader(name) 根據傳入的name獲取對應的值
        String header = request.getHeader("Host");
        System.out.println("Host的值爲:"+header);

        //getHerders(String name) 根據傳入的name,獲取所有的值
        Enumeration<String> hosts = request.getHeaders("Host");
        while (hosts.hasMoreElements()){
            String s = hosts.nextElement();
            System.out.println("host:"+s);
        }
        //getHeaderNames() --- Enumeration<String> 獲取所有HeaderNames
        Enumeration<String> headerNames = request.getHeaderNames();

        while(headerNames.hasMoreElements()){
            String s = headerNames.nextElement();
            System.out.println("headerNames:"+s);
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

三、獲取請求參數

/**
 * @auther Summerday
 *
 * 獲取請求參數
 */
@WebServlet("/RequestDemo3")
public class RequestDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置POST方式提交解碼方式
        request.setCharacterEncoding("utf-8");

        //獲取參數名爲"username"的值
        String username = request.getParameter("username");
        String nickname = request.getParameter("nickname");
        System.out.println("username:"+username+", nickname:"+nickname);

        //獲取名爲hobby的多個值(多選框的應用,一個name,多個value)
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));

        //獲取全部請求參數的名稱
        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.println("names:"+s);
        }

        //將全部參數名及參數值傳入map  String name:String[] values
        Map<String, String[]> map = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : map.entrySet()) {
            System.out.println(entry.getKey()+":"+ Arrays.toString(entry.getValue()));
        }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

可以發現,這些獲取請求參數的方法,離不開form表單中各項的name屬性。

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