Java Web学习(六)HttpServletRequest(客户端请求)
一、定義
HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對象中,通過這個對象提供的方法,可以獲得客戶端請求的所有信息。
二、常用方法
/*** 通過request對象獲取客戶端請求信息*/ public class RequestDemo extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//客戶端是以UTF-8編碼提交表單數據的,所以需要設置服務器端以UTF-8的編碼進行接收,否則對于中文數據就會產生亂碼request.setCharacterEncoding("UTF-8");//設置接收數據時的編碼格式,要與被提交表單的編碼格式相同/*** 1.獲得客戶機信息*/String requestUrl = request.getRequestURL().toString();//得到請求的URL地址String requestUri = request.getRequestURI();//得到請求的資源String queryString = request.getQueryString();//得到請求的URL地址中附帶的參數String remoteAddr = request.getRemoteAddr();//得到來訪者的IP地址String remoteHost = request.getRemoteHost();//返回發出請求的客戶機的完整主機名。int remotePort = request.getRemotePort();//返回客戶機所使用的網絡端口號。String method = request.getMethod();//得到請求URL地址時使用的方法String localAddr = request.getLocalAddr();//獲取WEB服務器的IP地址String localName = request.getLocalName();//獲取WEB服務器的主機名/*** 2.獲得客戶機請求頭*/Enumeration<String> reqHeadInfos = request.getHeaderNames();//獲取所有的請求頭while (reqHeadInfos.hasMoreElements()) {String headName = reqHeadInfos.nextElement();//獲取請求頭的名稱String headValue = request.getHeader(headName);//根據請求頭的名字獲取對應的請求頭的值 }/*** 3.獲得客戶機請求參數(客戶端提交的數據)* PS:方法參數中,入參是表單里文本框的名字,對應input框中的name屬性*/String userid = request.getParameter("userid");//獲取單個屬性值String[] hobbies = request.getParameterValues("hobbies");//獲取多個屬性值Enumeration<String> parameterNames = request.getParameterNames();//獲取所有屬性名Map<String, String[]> parameterMap = request.getParameterMap();//獲取請求屬性的映射關系(map只讀)//設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器response.setCharacterEncoding("UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那么瀏覽器顯示的將是亂碼response.setHeader("content-type", "text/html;charset=UTF-8");}}三、交互亂碼解決
POST請求
如果提交方式為post,只需要在服務器端設置request對象的編碼即可,客戶端以哪種編碼提交的,服務器端的request對象就以對應的編碼接收。
比如客戶端是以UTF-8編碼提交的,那么服務器端request對象就以UTF-8編碼接收(request.setCharacterEncoding("UTF-8"))
GET請求
如果提交方式為get,設置request對象的編碼是無效的,request對象還是以默認的ISO8859-1編碼接收數據,因此要想不亂碼,只能在接收到數據后再手工轉換,步驟如下:
//1).獲取獲取客戶端提交上來的數據,得到的是亂碼字符串,data="???è?????" String data = request.getParameter("paramName");//2).查找ISO8859-1碼表,得到客戶機提交的原始數據的字節數組 byte[] source = data.getBytes("ISO8859-1");//3).通過字節數組以指定的編碼構建字符串,解決亂碼 data = new String(source, "UTF-8");通過字節數組以指定的編碼構建字符串,這里指定的編碼是根據客戶端那邊提交數據時使用的字符編碼來定的,如果是GB2312,那么就設置成data = new String(source, "GB2312"),如果是UTF-8,那么就設置成data = new String(source, "UTF-8")
四、請求轉發
定義:一個web資源收到客戶端請求后,通知服務器去調用另外一個web資源進行處理。
實例:在Servlet中實現請求轉發的兩種方式:
//1、通過ServletContext的getRequestDispatcher(String path)方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉發。 RequestDispatcher reqDispatcher =this.getServletContext().getRequestDispatcher("/test.jsp"); reqDispatcher.forward(request, response);//2、通過request對象提供的getRequestDispatche(String path)方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉發。 request.getRequestDispatcher("/test.jsp").forward(request, response);?五、request對象
定義:request對象是一個域對象(Map容器),開發人員通過request對象在實現轉發時,把數據通過request對象帶給其它web資源處理。(如請求controller后轉發到頁面去處理數據)
常用方法:request對象作為一個域對象(Map容器)使用時,主要是通過以下的四個方法來操作
-
-
- setAttribute(String name,Object o)方法,將數據作為request對象的一個屬性存放到request對象中,例如:request.setAttribute("data", data);
- getAttribute(String name)方法,獲取request對象的name屬性的屬性值,例如:request.getAttribute("data")
- removeAttribute(String name)方法,移除request對象的name屬性,例如:request.removeAttribute("data")
- getAttributeNames方法,獲取request對象的所有屬性名,返回的是一個,例如:Enumeration<String> attrNames = request.getAttributeNames();
-
六、請求重定向和請求轉發的區別
請求轉發(307):一個web資源收到客戶端請求后,通知服務器去調用另外一個web資源進行處理。
請求重定向(302):一個web資源收到客戶端請求后,通知瀏覽器去訪問另外一個web資源進行處理。
轉載于:https://www.cnblogs.com/riches/p/11409118.html
總結
以上是生活随笔為你收集整理的Java Web学习(六)HttpServletRequest(客户端请求)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AVL树(二叉平衡树)详解与实现
- 下一篇: Vue入门到TodoList练手