當服務器收到一次瀏覽器的Http(http底層是基於TCP傳輸協議)請求後在服務器同時會產生一個Request對象和一個Response對象
經過request請求對象得到客戶端向服務器提交的數據,在經過響應生成數據由服務器把數據發送到客戶端 。html
HttpServletResponse:
setStatus(int) 設置響應的狀態碼
setHeader(String,String) 設置響應頭信息java
其中,addHeader()與setHeader()區別:
addHeader 用於一個key多個value 狀況 ------- key:value,value,value ... 在原有值添加新值
setHeader 用於 一個key一個value 狀況 ------- 用新的value 覆蓋以前value web
getWriter() 得到響應體字符輸出流,也就是往瀏覽器些數據
getOutputStream() 得到響應體字節輸出流,一樣是往瀏覽器寫數據
setContentType("text/html;charset=utf-8") 設置服務器返回的數據是什麼類型的而且是以什麼編碼打開
setCharacterEncoding("utf-8") 服務器是以什麼編碼解釋瀏覽器提交的數據
注意:(1)writer 和 getOutputStream 生成的內容是Http協議響應體數據,它不可以生成狀態行和頭信息
(2)ServletResponse 接口不提供與協議相關的API 可是HttpServletResponse是面向Http協議,因此提供協議相關的API
(3) HttpServletResponse :HttpServletRequest
它們的實現類不在JavaEE API中(request和response實現類在tomcat源碼中) ,實現類是由服務器提供在服務器接收到請求發生時,由服務器構造出Request和Response對象
apache
狀態碼是結合Location響應頭使用的
response.setStatus(302);
response.setHeader("Location", "/day6/response/demo2.html")Location的value指定要重定向的地址
以上兩行代碼能夠簡化,經過sendRedirect方法實現:response.sendRedict("/day6/response/demo2.html");
經過refresh完成自動刷新頁面:
refresh 格式: 時間(秒);url=跳轉頁面路徑
例如: response.setHeader("refresh", "5;url=/day6/hello.html"); === 生成響應頭信息中
在HTML中meta標籤,一樣能夠產生Http響應頭信息相同的效果
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
http-equiv 響應頭信息name
content 響應頭信息value
例如: <meta http-equiv="refresh" content="5;url=/day6/hello.html" /> === 生成響應體中
注意問題:
1)、文件複製時用getOutputStream , 手動生成響應內容時用getWriter
2)、getOutputStream和getWriter相互排斥不能同時使用
3)、getOutputStream和getWriter生成響應體內容,不能改變狀態行和頭信息的
4)、tomcat服務器會自動調用response輸出流 close方法,調用close時自動flush緩衝區內容 api
一、得到客戶機經常使用信息
getMethod 請求方式
getProtocol 協議
getRequestURI 和 getRequestURL 得到請求資源路徑
getRemoteAddr 得到客戶機IP地址
* 將 127.0.0.1 localhost 加入本機 hosts文件
getContextPath 得到工程虛擬目錄名稱
URI和URL區別
URI:/day6/request1
URL:http://localhost/day6/request1
URI範圍比URL大,http://localhost/day6/request1 是URL也是 URI ,/day6/request1 是URI 不是 URL瀏覽器
二、得到請求頭信息
getHeader(name) 得到指定頭信息
User-Agent 客戶端瀏覽器類型 (文件下載)
MSIE IE瀏覽器
Firefox 火狐瀏覽器
Chrome google瀏覽器
三、得到請求參數
GET方式請求,參數位於請求行中
POST方式請求,參數位於請求體中tomcat
getParameter(name) 根據參數名稱得到參數值 (一個值)
getParameterValues(name) 根據參數名稱得到參數值 (多個值) -------- 結合checkbox 一塊兒使用
getParameterNames() 得到全部參數名稱
getParameterMap() 將參數name和value 保存到一個map中,返回map服務器
POST請求亂碼 :request.setCharacterEncoding("utf-8");
GET請求亂碼
解決方案一:修改server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
* 必須有修改tomcat服務器配置文件權限post
解決方案二:逆向編解碼
username = URLEncoder.encode(username, "ISO-8859-1");
username = URLDecoder.decode(username, "utf-8");
簡化
username = new String(username.getBytes("ISO-8859-1"),"utf-8");網站
結論:能用post時 不用get ---- form提交都用post
<a href="url?name=中國"> ---- 手動處理 get
URL編碼和解碼
1) 瀏覽器提交一次請求,請求中中文字符,自動進行URL編碼 (由瀏覽器完成)
2) web服務器接收到內容以後,自動URL解碼
URLEncoder 完成URL編碼 , URLDecoder 完成URL解碼
服務器端接收請求,請求url : http://localhost/day6/request3?name=aaa+bbb
問題:在服務器端執行 request.getParameter("name"); 值 aaa bbb
四、請求轉發傳遞數據
請求轉發forward 和 請求重定向redirect 區別 ???
1) 轉發一次請求 一次響應; 重定向兩次請求 兩次響應
2) 轉發URL地址 不變,重定向URL地址改變第二個資源地址
3) 轉發只能轉發給同一個網站內部資源,重定向能夠定向到任何網站
4) 轉發中/屬於服務器內部路徑 不寫工程名,重定向/來自客戶端必需要寫工程名
servlet的最佳應用:Servlet處理數據獲得數據處理結果,經過請求轉發,將處理結果傳遞JSP顯示
* Servlet處理數據得到結果,JSP負責數據顯示的。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletResponse.html