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)