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