JavaWeb基礎學習(三)--Request & Response
請求過程:
每次請求都將會建立新的request&response物件。
-
HttpServletRequest
簡介:
Servlet API 中定義的 ServletRequest 介面用於封裝請求訊息。
HttpServletRequest 是專用於HTTP協議的ServletRequest 子介面,它用於封裝 HTTP 請求訊息。
在 service() 方法內部呼叫 HttpServletRequest 物件的各種方法來獲取請求訊息。
功能:
- 接收使用者引數;
- 接收使用者的所有請求頭資訊;
- 轉發、包含;
- 作為域物件存放資料。
接收使用者引數:
- getParameter(String) :根據名字獲取引數,返回String型別
//獲取<input type=”text” name=”username”>的值
String username = request.getParameter(“username”);
- getParameterValues(String) :根據名字獲取一組引數,返回String[ ]
//獲取多個<input type=”checkbox” name=”hobby” value=”…” >的值
String [] hobbys = request.getParameterValues(“hobby”);
注意:如果指定的引數未傳遞,請求時會報空指標異常,此時用前先判斷。
- getParameterNames() :獲取所有引數名,返回Enumeration
//獲取所有引數名字
Enumeration<String> names = request.getParameterNames();
- getParameterMap() :獲取所有資料,返回Map型別
//獲取所有資料
Map<String,String[]> map = request.getParameterMap();
亂碼出現的原因:
提交資料之前,頁面根據設定的格式進行編碼之後傳送給tomcat,
tomcat預設編碼格式為iso-8859-1,
因此request得到的內容都是iso-8859-1的編碼格式,
從而造成亂碼問題。
注:tomcat8之前URIEncoding預設使用iso-8859-1編碼,tomcat8中預設使用UTF-8編碼,因此8中get請求不會出現中文亂碼。
兩種解決方式:
- (不常用)
String name = requst.getParameter("name");//目前得到的是iso-8859-1的編碼
byte[] bys = name.getBytes("iso-8859-1");//根據iso-8859-1獲取位元組碼
String name1 = new String(bys,"utf-8");//根據utf-8重新編碼,組成新字串
response.setContentType("text/html;charset=utf-8");
- (常用)
// 在獲取資料之前呼叫,只能在post型別有效,
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
response.setContentType("text/html;charset=utf-8");
獲取請求行中相關資訊:
構建專案地址:
//假設當前專案地址為--http://localhost:8080/javaweb_program/
String http = request.getScheme(); // http
String serverName = request.getServerName();// localhost
int serverPort = request.getServerPort(); // 8080
String contextPath
=request.getContextPath(); // /javaweb_program
String basePath
= http+"://"+serverName+":"+serverPort+contextPath+"/";
-
請求轉發
轉發:是將請求在伺服器內部交給另一個元件再去執行,同時共享request中的資料。
1.位址列不變
2./代表:當前web應用的跟路徑(建議以/開始),不帶斜線就是相對路徑
3.瀏覽器只發出一次請求
4.可以共享資料
5.只能轉發到本web應用中的位置
-
HttpServletResponse
簡介:
Servlet API中定義的ServletResponse介面類用於建立響應訊息。
HttpServletResponse是專用於HTTP協議的ServletResponse子介面,它用於封裝HTTP響應訊息。
功能:
1. 設定響應內容
給使用者輸出html資料
2. 設定響應頭
請求時的請求頭由tomcat伺服器來讀取,但響應時的響應頭由瀏覽器來讀取,用於影響瀏覽器的行為。如是否要快取這次響應的資料、狀態碼
3. 重定向
將請求傳送回瀏覽器。然後由瀏覽器再重新向伺服器自動的傳送一個請求。
設定響應內容:
- 字元流輸出
方法:PrintWriter out = response.getWiter();
out.write(“”);
如果僅是輸出 html資訊,文字資訊,則就可以使用字元。
- 位元組碼輸出
方法:ServetOutputStream outStream = response.getOutputStream()
如果是下載檔案,如 *.avi,則可以使用位元組碼
*這兩個是互斥的,即如果已經使用了一個,則另一個就不能再被呼叫
設定響應頭:
HTTP1.1中啟用Cache-Control 來控制頁面的快取與否
- no-cache,瀏覽器和快取伺服器都不快取頁面資訊;
- public,瀏覽器和快取伺服器都可以快取頁面資訊;
- no-store,請求和響應的資訊都不被儲存在對方的磁碟系統中;
//不允許瀏覽器端或快取伺服器快取當前頁面資訊。
resp.setDateHeader(“Expires”, 0); //過期時間
resp.setHeader( "Cache-Control", "no-chache" );
請求重定向
請求重定向:指的是一個web資源受到客戶端請求後,通知客戶端去訪問另外一個web資源。
使用方法:response.sendRedirect(路徑)
特點
- 瀏覽器會向伺服器傳送兩次請求,意味著會有兩個request/respose
- 瀏覽器位址列會發生變化。
- 不會共享request中的資料,但可以在重定向的路徑中使用?name=value的方式傳送簡單資料。
- 執行重定向狀態碼為302(請求重定向).
因此使用重定向建議寫絕對地址(request.getContextPath+”/servlet”)。
- 重定向的URL可以是其他應用,不侷限於當前應用,例如重定向到百度
轉發與重定向的區別
轉發只能將請求轉發給同一個WEB應用中的元件;
重定向可以到同一個站點上的其他應用程式中的資源,也可使用絕對URL重定向到其他站點的資源。
轉發時指定的相對URL以“/”開頭,它是相對於當前WEB應用程式的根目錄;
重定向相對URL以“/”開頭,它是相對於整個WEB站點的根目錄。
轉發是由伺服器內部實現的。
重定向由瀏覽器再次發出一個請求。
轉發方法的呼叫者與被呼叫者之間共享相同的request物件和response物件,它們屬於同一個訪問請求和響應過程,共享資料;
重定向方法呼叫者與被呼叫者使用各自的request物件和response物件,它們屬於兩個獨立的訪問請求和響應過程,所以資料不共享。
轉發後瀏覽器位址列保持初始的URL地址不變。
重定向後瀏覽器位址列保持初始的URL地址改變。
轉發時請求的型別(GET/POST)不變
重定向時的被呼叫者的請求型別只能是get