本文對 request、 response 簡單描述,未涉及到具體的瀏覽器緩存、重定向、請求轉發等代碼部分。java
在看 response、request 對象以前,先來了解一下 Web服務器,瀏覽器,代理服務器 三者之間的關係。web
當咱們打開瀏覽器,在地址欄中輸入URL,而後咱們就看到了網頁。 原理是怎樣的呢?瀏覽器
實際上咱們輸入 URL 後,咱們的瀏覽器給Web服務器發送了一個 Request, Web 服務器接到Request 後進行處理,生成相應的 Response,而後發送給瀏覽器, 瀏覽器解析 Response 中的 HTML,這樣咱們就看到了網頁,過程以下圖所示:緩存
咱們的 Request 有多是通過了代理服務器,最後纔到達 Web 服務器的。服務器
過程以下圖所示:微信
代理服務器就是網絡信息的中轉站,有什麼功能呢?cookie
提升訪問速度, 大多數的代理服務器都有緩存功能。網絡
突破限制, 也就是FQ了app
隱藏身份。url
Tomcat(Web應用服務器) 收到客戶端的 http 請求,會針對每一次請求,分別建立一個表明請求的 request 對象、和表明響應的 response 對象。
如上,咱們想拿到用戶發送過來的數據,只須要找到 request 對象;而響應用戶請求,則找 response 對象。
咱們在程序中常常看到以下兩個對象,這就是咱們要找的 request、response
HttpServletResponse 封裝了 response 對象,經過該對象實現向瀏覽器輸出數據,實現交互。
addCookie(Cookie cookie) 向客戶端寫入Cookie
addHeader(Java.lang.String name, java.lang.String value) 寫入給定的響應頭
encodeURL(java.lang.Stringurl) 默認cookie中包含Session ID,若是客戶端不支持 Cookie,就在參數 url 中加入 Session ID 信息,能夠解決用戶禁用cookie的問題。
setStatus(intsc) 設置響應的狀態碼。
HttpServletResponse 實現向用戶輸出數據的方法:getOutputStream 和 getWriter方法
getOutputStream 和 getWriter 方法分別用於獲得輸出二進制數據、輸出文本數據的ServletOuputStream、Printwriter對象。
getOutputStream 和 getWriter 這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另外一方法。
getOutputStream() 方法例子:
調用 getOutputStream() 方法得到 ServletOutputStream 流,再使用 print() 或 write() 向瀏覽器輸出數據。試驗一下:
//獲取到OutputStream流
ServletOutputStream servletOutputStream = response.getOutputStream();
//向瀏覽器輸出數據
servletOutputStream.print("niceyoo");
效果以下:
getWriter() 方法例子:
//獲取到printWriter對象
PrintWriter printWriter = response.getWriter();
printWriter.write("niceyoo-getWriter");
效果以下:
重定向指的是一個web資源收到客戶端請求後,web服務器通知客戶端去訪問另一個web資源,這稱之爲請求重定向。實現方式是調用response.sendRedirect()方法。實現的原理就是給客戶端返回了302狀態碼和location頭。
HttpServletRequest 封裝了 request對象,當客戶端經過HTTP協議訪問服務器時,HTTP請求頭中的全部信息都封裝在這個對象中。
得到客戶端的信息:
getRequestURL 方法返回客戶端發出請求時的完整URL。
getRequestURI 方法返回請求行中的資源名部分,去掉主機名的部分。
getRemoteAddr 方法返回發出請求的客戶機的IP地址
getRemoteHost 方法返回發出請求的客戶機的完整主機名
getRemotePort 方法返回客戶機所使用的端口號
getLocalAddr 方法返回WEB服務器的IP地址。
getLocalName 方法返回WEB服務器的主機名
getMethod 獲得客戶機請求方式,如GET,POST
--
得到請求頭的方法:
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
--
得到請求參數:
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
請求轉發指一個 web 資源收到客戶端請求後,通知服務器去調用另一個web資源進行處理。request 對象提供了一個 getRequestDispatcher 方法,該方法返回一個RequestDispatcher 對象,調用這個對象的 forward 方法能夠實現請求轉發。
request 對象同時也是一個域對象,咱們經過 request 對象在實現轉發時,能夠把數據經過request 對象帶給其它web資源處理。
下面是經常使用的一些對域中的屬性的操做的方法:
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
因爲 request 也是一個域對象,因此既能夠從它得到參數,即 Parameter。也能夠得到域中的屬性。可是他們的意義是徹底不同的。
getParameter(String name):得到客戶端傳送給服務器的參數值,該參數是由 name 指定的,一般是表單中的參數。並且參數只能是字符串形式的鍵值對。
getAttribute(String name):返回有name 指定的屬性值,若是指定的屬性值不存在,則會返回一個null值。這裏存放的也是一個鍵值對,不一樣的是,這裏的值能夠是任意的類型。
Web 服務器收到客戶端的 http 請求,會針對每一次請求,分別建立一個用於表明請求的 request 對象、和表明響應的 response 對象。
也就是一次請求生成一個 request 和 response,若是客戶端和服務器握手結束,request 和 response 則是一塊兒隨着握手的消失而消失。
在程序中,與瀏覽器交互是經過 request、response 這連個對象進行的,request 封裝了用戶的請求數據,response 則用於向瀏覽器輸出數據。
若是文章有錯的地方歡迎指正,你們互相留言交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:niceyoo