1.HttpServletRequest概述
我們在創建Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個為代表請求的request和代表響應response。
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大。
2.request的運行流程
3.通過抓包工具抓取Http請求
因為request代表請求,所以我們可以通過該對象分別獲得Http請求的請求行,請 求頭和請求體
4.通過request獲得請求行
獲得請求的資源:
String
getContextPath()
---web
應用的名稱
String
getQueryString()
---- get
提交
url
地址后的參數字符串
username=zhangsan&password=123
注意:request獲得客戶機(客戶端)的一些信息
request.getRemoteAddr() --- 獲得訪問的客戶端IP地址
5.通過request獲得請求頭
long
getDateHeader(
String name)
Enumeration
getHeaders(
String name)
int
getIntHeader(
String name)
referer頭的作用:執行該此訪問的的來源
做防盜鏈
6.通過request獲得請求體
請求體中的內容是通過post提交的請求參數,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username [zhangsan]
password [123]
hobby [football,basketball]
以上面參數為例,通過一下方法獲得請求參數:
String
getParameter(
String name)
String[]
getParameterValues(
String name)
Enumeration
getParameterNames()
Map<String,String[]>
getParameterMap()
注意:get請求方式的請求參數 上述的方法一樣可以獲得
解決post提交方式的亂碼:request.setCharacterEncoding("UTF-8");
解決get提交的方式的亂碼:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
7.request的其他功能
(1)request是一個域對象
request對象也是一個存儲數據的區域對象,所以也具有如下方法:
setAttribute(
String name,
Object o)
getAttribute(
String name)
removeAttribute(
String name)
注意:request域的作用范圍:一次請求中
(2)request完成請求轉發
獲得請求轉發器----path
是轉發的地址
RequestDispatcher
getRequestDispatcher(
String path)
通過轉發器對象轉發
requestDispathcer.forward(
ServletRequest request,
ServletResponse response)
注意:ServletContext域與Request域的生命周期比較?
ServletContext
:
創建:服務器啟動
銷毀:服務器關閉
域的作用范圍:整個
web
應用
request
:
創建:訪問時創建
request
銷毀:響應結束
request
銷毀
域的作用范圍:一次請求中
注意:轉發與重定向的區別?
1
)重定向兩次請求,轉發一次請求
2
)重定向地址欄的地址變化,轉發地址不變
3
)重新定向可以訪問外部網站
轉發只能訪問內部資源
4
)轉發的性能要優於重定向