1. 程式人生 > >JSP學習筆記三之response物件和request物件

JSP學習筆記三之response物件和request物件

接著上一篇,我們接著講JSP中的內建隱式物件。這篇部落格介紹的是request和response物件。

A. request物件

     request物件是javax.servlet.http.HttpServletRequest 類的例項。每當客戶端請求一個JSP頁面時,JSP引擎就會製造一個新的request物件來代表這個請求。request物件提供了一系列方法來獲取HTTP頭資訊,cookies,HTTP方法等等。客戶端的請求資訊被封裝在request物件中,通過它才能瞭解到使用者的需求,然後做出響應。它是HttpServletRequest類的例項。request物件具有請求域,即完成客戶端的請求之前,該物件一直有效。常用方法如下:

String getParameter(String name) 返回name指定引數的引數值

String[] getParameterValues(String name) 返回包含引數name的所有值的陣列

void setAttribute(String, Object) 儲存此請中的屬性

object getAttribute(String, Object) 返回指定屬性的屬性值

String getContentType() 得到請求體的MIME型別

String getProtocol() 返回請求用的協議型別及版本號

String getServerName() 返回接受請求的伺服器主機名

程式碼例項:

reg.jsp

<body>
    <h1>使用者註冊</h1><br/>
    <hr>
        <form action="03/request.jsp" name="regForm" method="post">
    	<table>
    		<tr>
    		    <td>使用者名稱:</td>
    		    <td><input type="text" name="username" /></td>
    		</tr>
    		<tr>
    			<td>愛好:</td>
    			<td>
    				<input type="checkbox" name="favorite" value="read"/>讀書
    				<input type="checkbox" name="favorite" value="movie"/>電影
    				<input type="checkbox" name="favorite" value="internet"/>上網
    				<input type="checkbox" name="favorite" value="football"/>足球
    			</td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="submit" value="登陸" /></td>
    		</tr>
    	</table>
    </form>
  </body>

request.jsp

 <body>
    <h1>request的內建物件</h1><br/>
    <hr>
    <% 
    //設定預設的字元
    request.setCharacterEncoding("utf-8");
    %>
             使用者名稱:<%=request.getParameter("username") %><br>
             愛好:<%
             if(request.getParameterValues("favorite")!=null){
            	 String[] favorite=request.getParameterValues("favorite");
                 for(String f:favorite){
                	 out.println(f);
                	 }
             }
            
             %>
  </body>

結果顯示:



             <%request.setCharacterEncoding("utf-8"); %>//解決中文亂碼,但不能解決URL傳遞中文出現的亂碼

注意:

            但是在測試超連結<a href="request.jsp?username=李四">測試url傳引數</a>的時候,我們將引數的value直接在URL上進行賦值。如果賦值的結果是中文,在這種情況下如果使用request的setCharacterEncoding方法來進行修改字符集是無法解決中文亂碼的問題的。

            正確的解決方法為:在Tomcat伺服器中,在server.xml檔案修改Connector,在裡面新增:URLEncoding="utf-8"即可。

B、response物件

          response物件是javax.servlet.http.HttpServletResponse類的例項。當伺服器建立request物件時會同時建立用於響應這個客戶端的response物件。同時response物件具有頁面Page作用域,即訪問一個頁面時,該頁面的response物件只對本次訪問有效,其他頁面的response物件對當前頁面無效。

          response物件也定義了處理HTTP頭模組的介面。通過這個物件,開發者們可以新增新的cookies,時間戳,HTTP狀態碼等等。

常用方法:

String setCharacterEncoding()//設定響應字元編碼格式

String getCharacterEncoding()//獲取響應字元編碼格式

void setContentType(String type)//設定響應MIME型別

sendRedirect(java.lang.String location)//請求重定向

PrintWriter getWriter()//獲取列印輸出物件

注意:PrintWriter物件的輸出先於內建out物件。
解決方法:
out.println();
out.flush();//清空緩衝區並將緩衝區內容輸出到瀏覽器
PrintWriter outer=response.getWriter();
outer.println();

-------------------------------------------*-----------------------------------------------------

程式碼例項:

reg.jsp

<body>
    <h1>使用者註冊</h1><br/>
    <hr>
    <form action="03/response.jsp" name="regForm" method="post">
    	<table>
    		<tr>
    		    <td>使用者名稱:</td>
    		    <td><input type="text" name="username" /></td>
    		</tr>
    		<tr>
    			<td>愛好:</td>
    			<td>
    				<input type="checkbox" name="favorite" value="read"/>讀書
    				<input type="checkbox" name="favorite" value="movie"/>電影
    				<input type="checkbox" name="favorite" value="internet"/>上網
    				<input type="checkbox" name="favorite" value="football"/>足球
    			</td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="submit" value="登陸" /></td>
    		</tr>
    	</table>
    </form>
  </body>

response.jsp

<body>
   <%
   	 out.println("<h1>內建物件response</h1>");
   	 out.println("<hr>");
   	 //out.flush();//新增緩衝區域重新整理
   	 PrintWriter pw=response.getWriter();
   	 pw.println("這裡是從內建物件response中獲取的輸出流。");
   
   	 //進行伺服器響應的重定向操作
   	 response.sendRedirect("request.jsp");
   
   	 //進行客戶端的轉發請求操作
   	 //request.getRequestDispatcher("request.jsp").forward(request, response);
   %>
  </body>

request.jsp

<body>
    <h1>request的內建物件</h1><br/>
    <hr>
    <% 
    //設定預設的字元
    request.setCharacterEncoding("utf-8");
    %>
             使用者名稱:<%=request.getParameter("username") %><br>
             愛好:<%
             if(request.getParameterValues("favorite")!=null){
            	 String[] favorite=request.getParameterValues("favorite");
                 for(String f:favorite){
                	 out.println(f);
                	 }
             }
            
             %>
  </body>

注意:在response.jsp的中分別使用的是伺服器的請求重定向和客戶端的請求轉發操作。

首先看看請求重定向的結果:




接下來看看請求轉發的結果:




這裡總結一下重定向和轉發請求的作用:

請求重定向:客戶端行為,相當於兩次請求,前一次請求的內容不會被儲存,url路徑會改變(檢視上面的圖片中的URL)。
response.sendRedirect("request.jsp"
請求轉發:伺服器行為,一次請求,轉發後請求物件會儲存,url路徑不變(檢視上面的圖片中的URL)
requst.getRequestDispatcher("st.jsp").forward(request,response