- JSP從零開始學(視頻教學版)
- 劉鑫編著
- 2544字
- 2021-03-12 12:32:00
4.1 request對象
本節介紹request對象的作用范圍及其常用的方法。用戶每訪問一個頁面,就會產生一個HTTP請求。這些請求中一般都包含了請求所需的參數值或者信息,如果將request對象看作是客戶請求的一個實例,那么這個實例就包含了客戶請求的所有數據。因此,可以通過request來獲取客戶端和服務器端的信息,如IP地址、傳遞的參數名和參數值、應用系統名、服務器主機名等等。
4.1.1 request對象的常用方法
request對象的常用方法參見表4.1。
表4.1 request對象常用方法

續表

4.1.2 使用request對象接收請求參數
request對象有兩種方法獲得請求參數值,一個是getParameter(),另一個是getParameterValues()。下面演示使用getParameter()方法獲取頁面請求參數。
【例4.1】獲取網頁請求參數
getParameter.jsp是獲取頁面參數值,代碼如下:
----------------- getParameter.jsp ---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>' getParameter.jsp'</title> 06 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 07 </head> 08 <body > 09 <center> 10 <% 11 String name= request.getParameter("name"); 12 String city = request.getParameter("city"); 13 if(name! =null&&city! =null) 14 { 15 %> 16 <p>Welcome <%=name %>,您所在的城市是<%=city %></p> 17 <% 18 }else{ 19 %> 20 <p>歡迎訪問本頁面!</p> 21 <% 22 } 23 %> 24 </center> 25 </body> 26 </html>
上述代碼中,第11、12行代碼分別獲得參數name、city的參數值。
在訪問地址上輸入http://localhost:8080/ch04/getParameter.jsp? name=John&city=Beijing后頁面效果如圖4.1所示。

圖4.1 例4.1的運行結果
提示
在URL參數傳遞時,在頁面地址后使用“? ”連接請求參數,參數由“=”相連表示參數名和參數值,一個請求攜帶多個參數用“&”連接。
實際上,上述傳遞參數的方法在實際的開發中相比表單提交參數要少用,因為這種提交參數的方法完全將參數暴露出來,不利于隱私保護,所以開發中一般是采取表單提交的方式傳遞參數。
在表單form中,有兩個非常重要的屬性action和method。屬性action指明表單提交后的數據跳轉到指定頁面并處理參數。method有兩個值,分別是get和post,通常指定為post,因為用get時,在表單中設定的參數和參數值將附加到頁面地址的末尾以參數的形式提交,這樣會暴露參數值,不安全;而指定為post,提交表單時,表單中的參數將被作為請求頭部中的信息發送,不會在目標地址中添加任何參數,這樣也就不會暴露出參數值。所有出于安全考慮,一般會選擇post提交。
【例4.2】表單post提交獲取網頁請求參數
【程序結構】
ex4_1.jsp頁面將用戶填寫的內容提交給getParameter.jsp。頁面關系如圖4.2所示。

圖4.2 例4.2的頁面關系圖
ex4_1.jsp是用戶提交頁面,源代碼如下:
----------------- ex4_1.jsp ---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>'ex4_1.jsp'</title> 06 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 07 </head> 08 09 <body > 10 <center> 11 <form action="getParameter.jsp" method="post"> 12 <table> 13 <tr> 14 <td>姓名</td> 15 <td><input type="text" name="name" value=""/></td> 16 </tr> 17 <tr> 18 <td>城市</td> 19 <td><input type="text" name="city" value=""/></td> 20 </tr> 21 <tr> 22 <td><input type="submit" value="提交"/></td> 23 <td><input type="reset" value="重置"/></td> 24 </tr> 25 </table> 26 </form> 27 </center> 28 </body> 29 </html>
上述代碼中,代碼第11~26行用表單form提交,其中action為getParameter.jsp, methode方法為post,代碼第12~25行用輸入框裝載姓名和城市。getParameter.jsp與【例4.1】中的getParameter.jsp代碼一樣。
在瀏覽器中訪問ex4_1.jsp并在“姓名”和“城市”輸入框中輸入值“John”和“Beijing”,單擊“提交”按鈕后,可以看到顯示的結果與例4.1的結果是一樣的。
提示
在測試時,讀者可以設定method的兩個值并分別進行測試,查看地址欄的變化情況。
4.1.3 請求中文亂碼的處理
在上述例子中,請求信息中的參數值都是用英文,但在實際開發中,請求信息通常是包含中文的。但在上述的例子中,要是使用中文,例如在表單的姓名輸入框中輸入中文字符,在提交之后顯示的值不是中文而是“? ”或者其他字符,如圖4.3所示。

圖4.3 顯示奇怪的字符
產生這種原因是由于請求信息所使用的字符集與頁面使用的字符集的不同,有3種方法可以解決這個問題。
(1)一種方法是在接受請求的頁面中規定請求字符編碼的代碼,例如在例子4.2的getParameter.jsp頁面中添加語句“request.setCharacterEncoding(“utf-8”)”即可。
(2)另一種方法是在取得參數值后,通過轉碼的方式將參數值轉為合適的字符集。例如,將前面的例子中獲得參數的代碼修改為如下形式:
String name= new String(request.getParameter("name").getBytes("ISO-8859-1"), "utf-8") String city= new String(request.getParameter("city").getBytes("ISO-8859-1"), "utf-8");
通過上述兩種方法都可以解決中文亂碼問題,但是在代碼維護方便帶來很大麻煩,因為它不僅增加了代碼量,而且移植性也差。
(3)第3種方法,通過編寫一個Servlet過濾器來解決中文亂碼問題,并可以通過配置過濾器解決所有請求處理字符集的問題,請求處理頁面就不用關心字符集的處理了。第3種方法可以有效的防止上述的問題且移植性強。如何編寫過濾器將在第5章中詳細介紹。
4.1.4 獲取請求的頭部信息
請求的頭部信息在實際中也是有其重要作用的,這些信息有時候對服務器的響應特別有用,而且也能查看到服務器中的相關信息。
請求頭部信息的相關方法除了4.1.1節提到的getHeaders()外,還有以下方法:
●String getHeader(String name):獲取字符串型的表頭信息
●int getIntHeader(String name):獲取整型的表頭信息
【例4.3】獲取請求中所有的頭名稱和對應的值。
getHeaders.jsp頁面用于獲取請求中的所有頭名稱和對應的值,其源代碼如下:
----------------- getHeaders.jsp ---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>'getHeaders.jsp'</title> 06 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 07 </head> 08 09 <body > 10 <% 11 Enumeration<String>enumeration=request.getHeaderNames(); 12 while(enumeration.hasMoreElements()){ 13 String name = enumeration.nextElement(); 14 String value = request.getHeader(name); 15 if(value==null||"".equals(value)){ 16 value="空字符串"; 17 } 18 %> 19 <p>表頭名稱:<%=name %>  ;對應的值:<%=value %></p> 20 <%} %> 21 </body> 22 </html>
上述代碼中,代碼第11~17行獲取請求的Header信息,并循環遍歷輸出。在瀏覽器中直接輸入頁面地址,效果如圖4.4所示。這些頭信息的含義說明如下:

圖4.4 網頁的請求頭信息
●accept:客戶端能接收的MIME類型
●accept-language:瀏覽器的首選語言
●user-agent:客戶端程序的相關信息,例如:瀏覽器版本,操作系統類型等
●host:表示服務器的主機名和端口號
●ua-cpu:CPU類型
●connection:判斷客戶端是否可以持續性的連接HTTP
●accept-encoding:指明客戶端能夠處理的編碼類型有哪些
●cookie:會話的信息,每個會話都有一個會話ID或者其他信息
以上是通過直接在地址欄中輸入頁面地址獲得到的頭文件信息。如果通過post方式跳轉的頁面,那么頭文件信息會稍微多些。例如,在一表單中將method的屬性指定為post,然后action指定為例4.3的跳轉頁面,則顯示結果如圖4.5所示。

圖4.5 post方式獲取的請求頭信息
從結果對比看,增加了以下幾個信息:
●referer:向頁面發起請求的地址。
●content-type:指明表單的MIME編碼類型,一般值為text/plain, multipart/form-data, application/x-www-form-urlencoded。默認為application/x-www-form-urlencoded,如果表單上傳一個文件,則表單中enctype設置為multipart/form-data。
●content-length:提交的請求中數據的長度。表單中提交的數據越多,長度就越大。
●cache-control:網頁緩存控制。默認值為no-cache,表明每次訪問都從服務器中獲取頁面。
在一般的開發中,不需要關注請求的頭信息,針對不同的需求,在網頁中設置相關的屬性值就可以。但當我們了解了它們之后,在解決某些問題上將起到關鍵的作用。
4.1.5 獲取主機和客戶機信息
獲取主機和客戶機的信息,一般通過以下幾個方法:
●getRemoteAddr():獲取客戶主機IP
●getRemoteHost():獲取客戶主機名稱
●getLocalAddr():獲取本地主機IP
●getLocalHost():獲取本地主機名稱
●getServerName ():獲取服務器主機名稱
●getServerPort():獲取服務器端口
【例4.4】獲取客戶機和主機信息
getHostInfo.jsp是獲取客戶機和本地主機信息的頁面,其源代碼如下:
----------------- getHostInfo.jsp ---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>'getHostInfo.jsp'</title> 06 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 07 </head> 08 09 <body > 10 <p> 11 本地機器IP:<%=request.getLocalAddr() %><br> 12 本地機器名稱:<%=request.getLocalName() %><br> 13 本地機器端口:<%=request.getLocalPort() %><br> 14 </p> 15 <p> 16 客戶主機IP:<%=request.getRemoteAddr() %><br> 17 客戶主機名稱:<%=request.getRemoteHost() %><br> 18 客戶主機端口:<%=request.getRemotePort()%><br> 19 </p> 20 <p> 21 服務器IP:<%=request.getServerName() %><br> 22 服務器端口:<%=request.getServerPort() %><br> 23 </p> 24 </body> 25 </html>
上述代碼中,第11~13行獲取本地機器信息,第16~18行獲取客戶主機信息,代碼第21~23行獲取服務器信息。頁面效果如圖4.6所示。

圖4.6 獲取主機信息
提示
一般而言,服務器主機名與本地機器IP應該是相同的,端口號也應一樣。
- LabVIEW2018中文版 虛擬儀器程序設計自學手冊
- Arduino開發實戰指南:LabVIEW卷
- Learn Programming in Python with Cody Jackson
- Python Network Programming Cookbook(Second Edition)
- Web全棧工程師的自我修養
- Java 11 Cookbook
- 表哥的Access入門:以Excel視角快速學習數據庫開發(第2版)
- Java Web程序設計任務教程
- 51單片機C語言開發教程
- OpenCV with Python By Example
- C++從入門到精通(第6版)
- PHP與MySQL權威指南
- 軟硬件綜合系統軟件需求建模及可靠性綜合試驗、分析、評價技術
- Learn Linux Quickly
- MonoTouch應用開發實踐指南:使用C#和.NET開發iOS應用