當瀏覽器向服務器發送請求時,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。