HttpServletRequest對象


    當瀏覽器向服務器發送請求時,web容器會把瀏覽器的請求信息封裝到一個HttpServletRequest對象中去,用戶可以通過這個對象獲取請求的頭信息,請求提交的參數,請求的路徑,獲取客戶端的信息和請求的轉發等。

    一、獲取客戶端信息

    (1)getRequestURL():返回客戶端發出請求時完整的URL地址。

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

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

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

    (5)getRemoteAddr():返回客戶端的ip地址。

    (6)getRemoteHost():返回客戶端的完整的主機名。

    (7)getLocalAddr():獲取web服務器的ip地址。

    (8)getLocalName():獲取web服務器的主機名。

public class TestRequestServlet extends HttpServlet{

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setHeader("content-type","text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String requestURL = request.getRequestURL().toString();
        String requestURI =  request.getRequestURI();
        String queryString = request.getQueryString();
        String pathInfo = request.getPathInfo();
        String remoteAddr = request.getRemoteAddr();
        int remotePort = request.getRemotePort();
        String remoteHost = request.getRemoteHost();
        String localAddr = request.getLocalAddr();
        String localName = request.getLocalName();
        int localPort = request.getLocalPort();
        writer.println("requestURL:"+requestURL);
        writer.println("<br/>");
        writer.println("requestURI:"+requestURI);
        writer.println("<br/>");
        writer.println("queryString:"+queryString);
        writer.println("<br/>");
        writer.println("pathInfo:"+pathInfo);
        writer.println("<br/>");
        writer.println("remoteAddr:"+remoteAddr);
        writer.println("<br/>");
        writer.println("remoteHost:"+remoteHost);
        writer.println("<br/>");
        writer.println("localAddr:"+localAddr);
        writer.println("<br/>");
        writer.println("localName:"+localName);
        writer.println("<br/>");
        writer.println("remotePort:"+remotePort);
        writer.println("<br/>");
        writer.println("localPort:"+localPort);
        writer.flush();
        writer.close();
    }

}

在瀏覽器上輸入地址:http://test.manager.com:8080/web/request?id=12

 

     二、獲取客戶機的請求頭信息

    (1)getHeader(string name):獲取請求頭中name對應的值

    (2)getHeaderNames():獲取請求中的所有的name,返回一個Enumeration<String>

    (3)getHeaders(String name):獲取請求頭中name對應的所有值,返回一個Enumeration<String>

public class TestRequestHeader extends HttpServlet{

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setHeader("content-type","text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        Enumeration<String> enums =  request.getHeaderNames();
        writer.println("獲取請求頭信息如下:<br/>");
        while(enums.hasMoreElements()){
            String name = enums.nextElement();
            String value = request.getHeader(name);
            writer.println(name+":"+value+"<br/>");
        }
        writer.flush();
        writer.close();
    }
}

在瀏覽器中輸入:http://test.manager.com:8080/web/requestheader

 

     三、獲取客戶機請求參數

    (1)getParameter(String name):根據name獲取請求參數的值。

    (2)getParameterValues(String name):根據name獲取請求的參數列表。

    (3)getParameterMap():返回的是一個Map類型的值,該返回值記錄着前端(如jsp頁面)所提交請求中的請求參數和請求參數值的映射關系。(編寫框架時常用)

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; utf-8">
<title>Insert title here</title>
</head>
<body>
    <form action="<%=request.getContextPath()%>/getParameterRequest" method="post">
        <div>
           <span>名字:</span>
           <input type="text" name="name" placeholder="請輸入名字">
        </div>
        <div>
           <span>密碼:</span>
           <input type="password" name="password" placeholder="請輸入密碼">    
        </div>
        <div>
           <span>性別:</span>
            <input type="radio" name="sex" value="男" checked><input type="radio" name="sex" value="女"></div>
        <div>
           <span>愛好:</span>
            <input type="checkbox" name="hobby" value="唱歌">唱歌
            <input type="checkbox" name="hobby" value="上網">上網
            <input type="checkbox" name="hobby" value="打游戲">打游戲
            <input type="checkbox" name="hobby" value="游泳">游泳
            <input type="checkbox" name="hobby" value="睡覺">睡覺
        </div>
        <div>
           <span>所在城市:</span>
           <select name="city">
              <option value="北京">北京</option>
              <option value="上海">上海</option>
              <option value="廣州">廣州</option>
              <option value="深圳">深圳</option>
           </select>
        </div>
        
         <dir>
             <input type="submit" value="提交" />     
        </dir>
    </form>
</body>
</html>

 

編寫一個servlet通過HttpServletRequest對象獲取參數:

public class TestRequestParam  extends HttpServlet{

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setHeader("content-type","text/html;charset=UTF-8");
        request.setCharacterEncoding("utf-8"); //解決post方式提交request接收中文亂碼問題
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        String sex = request.getParameter("sex");
        String city = request.getParameter("city");
        String[] hobbys= request.getParameterValues("hobby");
        String hobbyStr = String.join(",", hobbys);
        PrintWriter writer =  response.getWriter();
        writer.print("name參數為:"+name+"<br/>");
        writer.print("password參數為:"+password+"<br/>");
        writer.print("sex參數為:"+sex+"<br/>");
        writer.print("city參數為:"+city+"<br/>");
        writer.print("hobbyStr參數為:"+hobbyStr+"<br/>");
        writer.flush();
        writer.close();
    }

}

瀏覽器輸出:

    三、請求的轉發

    請求轉發指一個web資源收到客戶端請求后,通知服務器去調用另外一個web資源進行處理。在Servlet中我們可以使用兩種方式實現請求的轉發:1、使用ServletContext對象的getRequestDispatcher(path)或者使用HttpServletRequest對象的getRequestDispatcher(path)方法獲取RequestDispatcher對象,然后調用RequestDispatcher對象的forward(request,response)方法。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; utf-8">
<title>Insert title here</title>
</head>
<body>
    <form action="<%=request.getContextPath()%>/testReqestForwar1" method="post">
        <div>
           <span>用戶名:</span>
           <input type="text" name="name" placeholder="請輸入名字">
        </div>
         <div>
             <input type="submit" value="提交" />     
        </div>
    </form>
</body>
</html>

TestReqestForward1:

public class TestReqestForward1 extends HttpServlet{

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.getRequestDispatcher("/testReqestForwar2").forward(request, response);
    }
    
   
}

TestReqestForward2:

public class TestReqestForward2 extends HttpServlet{

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setHeader("content-type","text/html;charset=UTF-8");
        request.setCharacterEncoding("utf-8"); //解決post方式提交request接收中文亂碼問題
        String name = request.getParameter("name");
        PrintWriter writer =  response.getWriter();
        writer.print("name參數為:"+name+"<br/>");
    }
    
   
}

請求到了TestReqestForward1中的doPost方法后被重定向到了TestReqestForward2。

 

 這里我找到了一幅時序圖可以很清楚的展示出請求是如何轉發到TestReqestForward2。

 

 轉載圖片地址:https://img-blog.csdn.net/20160427164748927?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast。

 

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM