request與response
1. request和response概述
Web伺服器收到客戶端的http請求,會針對每一次請求,分別建立一個用於代表請求的request物件、和代表響應的response物件。request和response物件代表請求和響應,若要獲取客戶機提交過來的資料,只需要找request物件就行了。若要向客戶機輸出資料,只需要找response物件就行了。
2. response
response是用來向客戶端完成響應,型別為HttpServletResponse,它是Servlet的service()方法的引數。當客戶端發出請求時,tomcat會建立request和rsponse來呼叫Servlet的service()方法,每次請求都會建立新的request和response。
2.1 response操作響應行
在http響應行中,包括協議,版本號,以及響應狀態碼,響應行中主要就是操作這些狀態碼。
常用方法:
void setStatus(int sc,String sm) 設定狀態程式碼
void sendError(int sc) throws IOException 設定錯誤狀態碼
void sendError(int sc,String msg) throwsIOException 設定錯誤狀態碼及資訊
2.2 response操作響應頭
http響應頭的格式是 name:value的格式,如果有多個value值,以”,”分開,
例如:
Content-Encoding:gzip
Content-Length: 123
Content-Language: zh-cn
Response設定響應頭:
一個key對應一個value
一個key對應多個value
2.3 response操作響應體
http響應正文是我們最終在瀏覽器上看到的結果。對於HttpServletResponse如果想要操作響應正文,需要通過response物件獲取到輸出流,將資訊寫回到瀏覽器端。
Response設定響應體:
注意:
getOutputStream和getWriter方法分別用於得到輸出二進位制資料、輸出文字資料的ServletOuputStream、Printwriter物件。
getOutputStream和getWriter這兩個方法互相排斥,呼叫了其中的任何一個方法後,就不能再呼叫另一方法。
Servlet程式向ServletOutputStream或PrintWriter物件中寫入的資料將被Servlet引擎從response裡面獲取,Servlet引擎將這些資料當作響應訊息的正文,然後再與響應狀態行和各響應頭組合後輸出到客戶端。
Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流物件是否已經呼叫過close方法,如果沒有,Servlet引擎tomcat將呼叫close方法關閉該輸出流物件。呼叫close的時候,會呼叫flushBuffer方法.
2.4 設定輸出資料編碼
預設情況下,瀏覽器編碼格式是ISO-8859-1
publicvoid setCharacterEncoding(String charset)
設定傳送到客戶端的響應的字元編碼
publicvoid setContentType(String type)
設定將傳送到客戶端的響應的內容型別,如果該響應尚未提交。給定內容型別可能包含字元編碼規範,例如text/html;charset=UTF-8
示例:
位元組流:
設定瀏覽器預設開啟編碼
response.setHeader("Content-Type","text/html;charset=UTF-8");
中文轉成位元組陣列編碼
response.getOutputStream().write("薛之謙".getBytes("UTF-8"));
字元流:
設定response的緩衝區的編碼
response.setCharacterEncoding("UTF-8");
設定瀏覽器預設開啟的編碼.
response.setHeader("Content-Type","text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");相當於上面兩句
2.5自動重新整理
有一個響應頭:Refresh,它的作用是在指定的時間後,自動重定向到指定路徑。
例如:response.setHeader(“Refresh”, “5;URL=http://www.baidu.com”);,表示在5秒後自動跳轉到百度。
2.6檔案下載
一種:超連結方式.(不推薦)
<a href=”aa.zip”>下載</a>
<a href=”1.jpg”>下載</a>
二種:手動編碼方式完成檔案下載.
設定兩個頭和一個流:
Content-Type:檔案MIME的型別.
Content-Disposition:
檔案的輸入流:
2.7重定向
重定向:兩個請求。
第一個請求,伺服器響應碼:302。第一個請求的響應頭有一個Location頭,它說明了要重定向的URL;
第二個請求,瀏覽器重新向Location頭指定的URL發出。
重定向:可以重定向到本專案之外的頁面。例如可以重定向到百度!
重定向:可以重定向到本專案內的其他資源,可以使用相對路徑,以“/專案名”開頭
重定向:會使瀏覽器的位址列發生變化!
實現: //1.設定狀態碼
response.setStatus(302);
//2.設定相應頭--跳轉目錄
response.setHeader(“location”,”http://localhost/test/ss”);
response.setHeader(“location”,”test/ss”);
開發中也可以使用:response.sendRedirect(String path);
servlet:
登入頁面:
使用者名稱與密碼錯誤,登陸失敗,重定向到登陸頁面
使用者名稱與密碼正確,登陸成功:
3. request
HttpServletRequest物件用於封裝http請求,對於http請求它有三部分組成,http請求行,http請求行及請求正文。
3.1 request操作請求行
public String getMethod()
返回用於發出此請求的 HTTP 方法的名稱,例如 GET、POST
public String getRequestURI()
返回此請求的 URL 的一部分,從協議名稱一直到 HTTP 請求的第一行中的查詢字串。
public String getProtocol()
以protocol/majorVersion.minorVersion 的形式(例如 HTTP/1.1)返回請求使用的協議的名稱和版本。
public String getQueryString()
返回包含在請求 URL 中路徑後面的查詢字串。如果 URL 沒有查詢字串,則此方法返回 null。
3.2 request獲取客戶資訊
public String getContextPath()
返回請求 URI 指示請求上下文的那一部分。
public StringBuffergetRequestURL()
重新構造客戶端用於發出請求的 URL。返回的 URL 包含一個協議、伺服器名稱、埠號、伺服器路徑,但是不包含查詢字串引數。
public String getRemoteAddr()
返回傳送請求的客戶端或最後一個代理的 InternetProtocol (IP) 地址
3.3 request操作請求頭
public String getHeader(String name)
以 String 的形式返回指定請求頭的值。
publicjava.util.Enumeration<E> getHeaders(String name)
以 String 物件的 Enumeration 的形式返回指定請求頭的所有值。
publicjava.util.Enumeration<E> getHeaderNames()
返回此請求包含的所有頭名稱的列舉。如果該請求沒有頭,則此方法返回一個空列舉。
public int getIntHeader(Stringname)
以 int 的形式返回指定請求頭的值。如果該請求沒有指定名稱的頭,則此方法返回 -1。如果無法將頭轉換為整數,則此方法丟擲NumberFormatException。
public longgetDateHeader(String name)
以表示 Date 物件的 long 值的形式返回指定請求頭的值
3.4 request獲取請求引數
請求引數是瀏覽器傳送請求時攜帶的資訊。對於請求方式GET與POST,請求引數存在位置不同。
GET:請求引數存在於請求的資源路徑中。
POST:請求引數存在於正文中
public StringgetParameter(String name)
以 String 形式返回請求引數的值,如果該引數不存在,則返回 null
public String[]getParameterValues(String name)
返回包含給定請求引數擁有的所有值的 String 物件陣列,如果該引數不存在,則返回 null。
public java.util.Map<K,V> getParameterMap()
返回此請求的引數的 java.util.Map。請求引數是與請求一起傳送的額外資訊。對於 HTTPservlet,引數包含在查詢字串或傳送的表單資料中。
publicjava.util.Enumeration<E> getParameterNames()
返回包含此請求中所包含引數的名稱的 String 物件的 Enumeration。如果該請求沒有引數,則此方法返回一個空的Enumeration。
3.5 request域物件
request物件同時也是一個域物件,開發人員通過request物件在實現轉發時,把資料通過request物件帶給其它web資源處理。
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
request物件提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher物件,呼叫這個物件的forward方法可以實現請求轉發,從而共享請求中的資料
3.6 請求轉發
請求轉發可以實現路徑的跳轉操作.
ReqeustDispatcherdispatcher=request.getRequestDispatcher("路徑")
dispatcher.forward(request,response)
請求轉發和重定向的區別:
(1)請求轉發是伺服器內部跳轉,位址列不會發生改變
重定向位址列會發生改變。
(2)請求轉發,只有一次請求,一次響應.
重定向,有兩次請求,兩次響應。
(3)請求轉發存在request域,可以共享資料.
重定向不存在request域。
(4)請求轉發只能在伺服器的內部跳轉,簡單說,只能訪問本站內資源。
重定向可以訪問站外資源,也可以訪問站內資源.
(5)請求轉發是由request 發起的 .request.getRequestDispatcher().forward()
重定向是由response 發起的 response.sendRedirect();
(6)請求轉發與重定向時路徑寫法不一樣.
請求轉發是伺服器內部跳轉,這時它與瀏覽器無關 寫法:/資源
重定向要跳轉的路徑是從瀏覽器在次發起的,是瀏覽器端路徑,寫法: /工程名/資源
3.7 請求包含
RequestDispatcher.include()方法用於將RequestDispatcher物件封裝的資源內容作為當前響應內容的一部分包含進來,從而實現可程式設計的伺服器端包含功能,被包含的Servlet程式不能改變響應訊息的狀態碼和響應頭,如果它裡面存在這樣的語句,這些語句的執行結果將被忽略。include在程式執行上效果類似forward,但是使用forward只有一個程式可以生成響應,include可以由多個程式一同生成響應 ----- 常用來頁面佈局。
RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);
rd.include(request,response);