1. 程式人生 > >JavaWeb基礎學習(三)--Request & Response

JavaWeb基礎學習(三)--Request & Response

請求過程:

       每次請求都將會建立新的request&response物件。

  • HttpServletRequest

簡介:

Servlet API 中定義的 ServletRequest 介面用於封裝請求訊息

HttpServletRequest 是專用於HTTP協議的ServletRequest 子介面,它用於封裝 HTTP 請求訊息。

在 service() 方法內部呼叫 HttpServletRequest 物件的各種方法來獲取請求訊息。

功能:

  1. 接收使用者引數;
  2. 接收使用者的所有請求頭資訊;
  3. 轉發、包含;
  4. 作為域物件存放資料。

接收使用者引數:

  • 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