HttpServletRequest: 封裝了Http請求內(nèi)容(請求行, 請求頭, 請求體)
1.HTTP請求行和請求頭
1.HTTP請求行
GET /lifeWeb/lifeServlet?name=life HTTP/1.1
request.getMethod() 獲取Http請求行的方法 GET
request.getRequestURI() 獲取Http請求行的URL /lifeWeb/lifeServlet
request.getQueryString() 獲取Http請求行的參數(shù) name=life
request.getScheme() 獲取Http請求行的協(xié)議 http
request.getRequestURL() 獲取Http請求完整URL http://lioil.win/lifeWeb/lifeServlet
request.getContextPath() 獲取WEB應(yīng)用的訪問路徑 /lifeWeb
request.getServletPath() 獲取Servlet的訪問路徑 /lifeServlet
2.HTTP請求頭
request.getHeader(name) 獲取指定名稱的請求頭的值
request.getHeaders(String name) 獲取指定名稱的請求頭值集合(請求頭可重復(fù))
request.getHeaderNames() 獲取所有請求頭名稱
request.getIntHeader(name) 獲取int類型的請求頭的值
request.getDateHeader(name) 獲取日期對應(yīng)毫秒(long類型)
request.getContentLength() 獲取請求正文長度 <=> request.getHeader("Content-Length")
request.getContentType() 獲取請求正文類型 <=> request.getHeader("Content-Type")
request.getHeader("Host") 獲取服務(wù)器域名(IP) + 端口
request.getServerName() 獲取服務(wù)器域名(IP)
request.getServerPort() 獲取服務(wù)器端口
request.getRemoteHost() 獲取客戶端主機(jī)名(域名),獲取失敗,就返回IP
request.getRemoteAddr() 獲取客戶端IP
request.getRemotePort() 獲取客戶端端口
// Referer請求頭 防盜鏈
String ref = request.getHeader("Referer");
if (ref == null || !ref.startsWith("http://lioil.win"))
response.sendRedirect(request.getContextPath() + "/index.html"); // 請求重定向
else
getServletContext().getRequestDispatcher("/index.html").forward(request, response); // 請求轉(zhuǎn)發(fā)
2.HTTP請求參數(shù)(GET/POST)和請求體(POST)
1.HTTP請求參數(shù)(GET/POST)
request.getParameter(name) 通過name獲取單個(gè)值
request.getParameterValues(name)通過name獲取多個(gè)值(數(shù)組), checkbox
request.getParameterNames 獲得所有請求參數(shù)名
request.getParameterMap 獲取所有請求參數(shù)Map<String,String[]>
* HTTP請求參數(shù)亂碼
在Tomcat8.0以下: 默認(rèn)以"ISO8859-1"解碼HTTP請求,該編碼不包含有中文,有中文參數(shù)必定出現(xiàn)亂碼
從Tomcat8.0開始: 默認(rèn)以"UTF-8"解碼HTTP請求,該編碼包含有中文,可以解碼中文字符(客戶端也是"UTF-8")
參數(shù)亂碼-解決方法:
1.GET/POST請求: 先將字符串按"ISO8859-1"獲取字節(jié),再將字節(jié)轉(zhuǎn)碼為"UTF-8"
// 從Tomcat8開始默認(rèn)編碼是"UTF-8",所以不需要用該方法
String par = request.getParameter("par");
par = new String(par.getBytes("ISO8859-1"),"UTF-8");
2.僅限POST請求: 指定服務(wù)器以"UTF-8"解碼HTTP請求體
request.setCharacterEncoding("UTF-8");
3.在tomcat的server.xml中配置默認(rèn)編碼
<Connector URIEncoding="UTF-8" /> 指定HTTP請求行URI的編碼
或
<Connector useBodyEncodingForURI="true" /> 指定HTTP請求行URI使用HTTP請求體的編碼
2.HTTP請求體(POST)
request.getReader() 獲取字符流
request.getInputStream() 獲取字節(jié)流
3.請求轉(zhuǎn)發(fā)/包含(forward/include)
請求轉(zhuǎn)發(fā)/包含: 在同一個(gè)WEB應(yīng)用下, 一個(gè)Servlet/JSP把HTTP請求和響應(yīng)傳給下一個(gè)Servlet/JSP處理
1.forward()
原Servlet將request和response轉(zhuǎn)發(fā)給其它Servlet后, 原Servlet不能再操作request和response(也不能再次轉(zhuǎn)發(fā))
在轉(zhuǎn)發(fā)前把數(shù)據(jù)寫入HTTP響應(yīng)體, 但沒發(fā)出去, 轉(zhuǎn)發(fā)可以執(zhí)行,但響應(yīng)體被清空(響應(yīng)頭不清空);
在轉(zhuǎn)發(fā)前把數(shù)據(jù)寫入HTTP響應(yīng)體, 發(fā)到瀏覽器, 轉(zhuǎn)發(fā)失敗拋異常(IllegalStateException: Cannot forward after response has been committed)
response.getWriter().write("hello");
response.getWriter().flush(); //刷新緩沖區(qū),發(fā)到瀏覽器
request.getRequestDispatcher("/s2").forward(request, response); // 失敗拋異常
2.include()
原Servlet將request和response發(fā)給其它Servlet后, 原Servlet還能繼續(xù)操作request和response(可以再次轉(zhuǎn)發(fā)),
其它Servlet只能操作response響應(yīng)體,不能改變r(jià)esponse狀態(tài)碼和響應(yīng)頭(存在這樣的語句也會被忽略),
所以原Servlet和其它Servlet可以合并輸出響應(yīng)體
response.getWriter().write("頭部");
request.getRequestDispatcher("/s2").include(request,response);
response.getWriter().write("中間");
request.getRequestDispatcher("/s3").include(request,response);
response.getWriter().write("結(jié)尾");
多個(gè)頁面有重復(fù)內(nèi)容,可以把重復(fù)內(nèi)容封裝到一個(gè)Servlet/jsp,
當(dāng)需要顯示這段重復(fù)內(nèi)容時(shí),只需要把封裝的Servlet/jsp包含include即可.
3.請求域(request)
請求域: 封裝在request對象中的Map變量(鍵值對)
生存期: HTTP請求到達(dá)時(shí)創(chuàng)建, HTTP響應(yīng)發(fā)送完后銷毀
作用域: 只有一個(gè)request對象, 在整個(gè)請求鏈共享數(shù)據(jù)
request.setAttribute(key, value);
request.getAttribute(key);
request.removeAttribute(key);
request.getAttributeNames();
// 在Servlet中把數(shù)據(jù)存入request對象, request請求轉(zhuǎn)發(fā)到life.jsp展現(xiàn)數(shù)據(jù)
request.setAttribute("name", "value");
request.getRequestDispatcher("/life.jsp").forward(request, response);
簡書: http://www.reibang.com/p/7cedab4b09ef
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54628764
GitHub博客:http://lioil.win/2017/01/20/HttpServletRequest.html
Coding博客:http://c.lioil.win/2017/01/20/HttpServletRequest.html