目錄
一、http請求格式
二、獲取經常使用信息
三、獲取HTTP請求頭信息
四、獲取請求URL
五、獲取請求參數
六、請求轉發和請求包含
七、request域
八、請求轉發 和 響應重定向 的區別
===============================================================================================
一、request --> 封裝了客戶端全部的請求數據!
請求格式:
--------------------------------------------------------------------------------------------
| * 請求首行: 例如:GET /hello/index.jsp HTTP/1.1
| * 請求頭: 例如:Host:localhost
| * 空行:
| * 請求體: (GET沒體,POST纔有請求體)
---------------------------------------------------------------------------------------------
截取的請求信息:
--------------------- 請求信息以下 -----------------------------------------------------------
| GET /hello/index.jsp HTTP/1.1
| Host: localhost
| User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
| Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
| Accept-Language: zh-cn,zh;q=0.5
| Accept-Encoding: gzip, deflate
| Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
| Connection: keep-alive
| Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98[請求頭,請求頭由key/value組成。]
| [這個位置是空行,雖然沒有東西,但很重要。若是有請求體,那麼請求體在空行的下面]
--------------------- GET請求沒有請求體,結束 -------------------------------------------------html
請求協議中的數據均可以經過request對象來獲取!
二、獲取經常使用信息
> 獲取客戶端IP:request.getRemoteAddr() --> 192.168.18.8 案例:封鎖IP
> 請求方式:request.getMethod() --> GET 或 POST
三、獲取HTTP請求頭信息
> String getHeader(String name),適用於單值頭 (經常使用)
> Enumeration<String> getHeaders(String name),適用於多值請求頭 (瞭解)
> int getIntHeader(String name),適用於單值int類型的請求頭 (瞭解)
> long getDateHeader(String name),適用於單值毫秒類型的請求頭 (瞭解)
案例:
> 經過User-Agent識別用戶瀏覽器類型
> 防盜鏈:若是請求不是經過本站的超連接發出的,發送錯誤狀態碼404。Referer這個請求頭,表示請求的來源!瀏覽器
四、獲取請求URL
例如: http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy
> String getScheme():獲取協議,http
> String getServerName():獲取服務器名,localhost
> String getServerPort():獲取服務器端口,8080
> String getContextPath():獲取項目名,/day10_2 (經常使用)
> String getServletPath():獲取Servlet路徑,/AServlet
> String getQueryString():獲取參數部分,即問號後面的部分。username=xxx&password=yyy
> String getRequestURL():獲取請求URL,等於不包含參數的整個請求路徑。http://localhost:8080/day10_2/AServlet
> String getRequestURI():獲取請求URI,等於項目名+Servlet路徑。/day10_2/AServlet服務器
五、獲取請求參數
請求參數是由客戶端發送給服務器的!有多是在請求體中(POST),也多是在URL以後(GET)
請求參數:有一個參數一個值的,還有一個參數多個值!
> String getParameter(String name):獲取指定名稱的請求參數值,適用於單值請求參數。(經常使用)
> String[] getParameterValues(String name):獲取指定名稱的請求參數值,適用於多值請求參數
> Enumeration<String> getParameterNames():獲取全部請求參數名稱
> Map<String,String[]> getParameterMap():獲取全部請求參數,其中key爲參數名,value爲參數值。(經常使用)
案例:超連接參數
案例:表單數據session
六、請求轉發和請求包含
RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
使用request獲取RequestDispatcher對象,方法的參數是被轉發或包含的Servlet的Servlet路徑
請求轉發:rd.forward(request,response);(經常使用)
請求包含:rd.include(request,response);(瞭解)
有時一個請求須要多個Servlet協做才能完成,因此須要在一個Servlet跳到另外一個Servlet,須要使用轉發或包含。
* 請求轉發:由下一個Servlet完成響應體!當前Servlet能夠設置響應頭!(留頭不留體)
* 請求包含:由兩個Servlet共同未完成響應體!(都留)
不管是請求轉發仍是請求包含,都在一個請求範圍內!使用同一個request和response!
app
七、request域
Servlet中三大域對象:request(ServletRequest)、session(HttpSession)、application(ServletContext),
都有以下三個方法:
* void setAttribute(String name, Object value)
* Object getAttribute(String name)
* void removeAttribute(String name);
同一請求範圍內使用 request.setAttribute()、request.getAttribute()來傳值!
前一個Servlet調用setAttribute()保存值,後一個Servlet調用getAttribute()獲取值。(轉發時)
八、請求轉發 和 響應重定向 的區別。
> 請求轉發是一個請求一次響應,而響應重定向是兩次請求兩次響應
> 請求轉發地址欄不變化,而響應重定向會顯示後一個請求的地址
> 請求轉發只能轉發到本項目其餘Servlet,而響應重定向不僅能重定向到本項目的其餘Servlet,還能定向到其餘項目
> 請求轉發是服務器端行爲,只需給出轉發的Servlet路徑,而響應重定向須要給出requestURI,即包含項目名!
> 請求轉發 和 響應重定向 效率是轉發高!由於是一個請求!
<> 須要在下一個Servlet中獲取request域中的數據,必需要使用轉發!
<> 須要地址欄發生變化,那麼必須使用響應重定向! jsp
302,響應重定向spa