- Java Web從入門到精通(第3版)
- 明日科技
- 2521字
- 2020-06-29 17:33:59
6.2 request對象
request對象封裝了由客戶端生成的HTTP請求的所有細節,主要包括HTTP頭信息、系統信息、請求方式和請求參數等。通過request對象提供的相應方法可以處理客戶端瀏覽器提交的HTTP請求中的各項參數。
6.2.1 訪問請求參數
我們知道request對象用于處理HTTP請求中的各項參數。在這些參數中,最常用的就是獲取訪問請求參數。當通過超鏈接的形式發送請求時,可以為該請求傳遞參數,這可以通過在超鏈接的后面加上問號“?”來實現。注意這個問號為英文半角的符號。例如,發送一個請求到delete.jsp頁面,并傳遞一個名稱為id的參數,可以通過以下超鏈接實現。
【例6.1】 在頁面中定義超鏈接。
<a href="delete.jsp?id=1">刪除</a>
說明
本示例中,設置了一個請求參數,如果要同時指定多個參數,各參數間使用與符號“&”分隔即可。
【例6.2】 在delete.jsp頁面中,可以通過request對象的getParameter()方法獲取傳遞的參數值。具體代碼如下:
<% request.getParameter("id"); %>
說明
在使用request的getParameter()方法獲取傳遞的參數值時,如果指定的參數不存在,將返回null;如果指定了參數名,但未指定參數值,將返回空的字符串""。
【例6.3】 使用request對象獲取請求參數值。(實例位置:資源包\TM\sl\6\1)
(1)創建index.jsp文件,在該文件中添加一個用于鏈接到deal.jsp頁面的超鏈接,并傳遞兩個參數。index.jsp文件的具體代碼如下:

(2)創建deal.jsp文件,在該文件中通過request對象的getParameter()方法獲取請求參數id、user和pwd的值并輸出。deal.jsp文件的具體代碼如下:

運行本實例,首先進入index.jsp頁面,單擊“處理頁”超鏈接,將進入處理頁獲取請求參數并輸出,如圖6.1所示。

圖6.1 在頁面中獲取請求參數
6.2.2 在作用域中管理屬性
在進行請求轉發時,需要把一些數據傳遞到轉發后的頁面進行處理。這時,就需要使用request對象的setAttribute()方法將數據保存到request范圍內的變量中。
request對象的setAttribute()方法的語法格式如下:
request.setAttribute(String name,Object object);
參數說明:
name:表示變量名,為String類型,在轉發后的頁面取數據時,就是通過這個變量名來獲取數據的。
object:用于指定需要在request范圍內傳遞的數據,為Object類型。
在將數據保存到request范圍內的變量中后,可以通過request對象的getAttribute()方法獲取該變量的值,具體的語法格式如下:
request.getAttribute(String name);
參數說明:
name:表示變量名,該變量名在request范圍內有效。
【例6.4】 使用request對象的setAttribute()方法保存request范圍內的變量,并應用request對象的getAttribute()方法讀取request范圍內的變量。(實例位置:資源包\TM\sl\6\2)
(1)創建index.jsp文件,在該文件中,首先應用Java的try...catch語句捕獲頁面中的異常信息,如果沒有異常,則將運行結果保存到request范圍內的變量中;如果出現異常,則將錯誤提示信息保存到request范圍內的變量中。然后應用<jsp:forward>動作指令將頁面轉發到deal.jsp頁面。index.jsp文件的具體代碼如下:

(2)創建deal.jsp文件,在該文件中通過request對象的getAttribute()方法獲取保存在request范圍內的變量result并輸出。這里需要注意的是,由于getAttribute()方法的返回值為Object類型,所以需要調用其toString()方法,將其轉換為字符串類型。deal.jsp文件的具體代碼如下:

運行本實例,將顯示如圖6.2所示的運行結果。

圖6.2 獲取保存在request對象中的信息
6.2.3 獲取cookie
cookie的中文意思是“小甜餅”,然而在互聯網上的意思與這就完全不同了。它和食品完全沒有關系。在互聯網中,cookie是小段的文本信息,在網絡服務器上生成,并發送給瀏覽器。通過使用cookie可以標識用戶身份,記錄用戶名和密碼,跟蹤重復用戶等。瀏覽器將cookie以key/value的形式保存到客戶機的某個指定目錄中。
通過cookie的getCookies()方法即可獲取到所有cookie對象的集合;通過cookie對象的getName()方法可以獲取到指定名稱的cookie;通過getValue()方法即可獲取到cookie對象的值。另外,將一個cookie對象發送到客戶端,使用response對象的addCookie()方法。
說明
在使用cookie時,應保證客戶機上允許使用cookie。這可以通過在IE瀏覽器中選擇“工具”→“Internet選項”命令,在打開對話框的“隱私”選項卡中進行設置。
【例6.5】 通過cookie保存并讀取用戶登錄信息。(實例位置:資源包\TM\sl\6\3)
(1)創建index.jsp文件,在該文件中,首先獲取cookie對象的集合,如果集合不為空,就通過for循環遍歷cookie集合,從中找出設置的cookie(這里設置為mrCookie),并從該cookie中提取出用戶名和注冊時間,再根據獲取的結果顯示不同的提示信息。index.jsp文件的具體代碼如下:

(2)編寫deal.jsp文件,用于向cookie中寫入注冊信息。deal.jsp文件的具體代碼如下:

技巧
在向cookie中保存的信息中,如果包括中文,則需要調用java.net.URLEncoder類的encode()方法將要保存到cookie中的信息進行編碼;在讀取cookie的內容時,還需要應用java.net.URLDecoder類的decode()方法進行解碼。這樣,就可以成功地向cookie中寫入中文信息。
運行本實例,第一次顯示的頁面如圖6.3所示,輸入姓名mr,并單擊“確定”按鈕后,將顯示如圖6.4所示的運行結果。

圖6.3 第一次運行的結果

圖6.4 第二次運行的結果
6.2.4 解決中文亂碼
在上面的代碼中為id參數傳遞了一個字符串類型的值“001”,如果將這個參數的值更改為中文,則在show.jsp中就會出現大家都不愿意看到的問題——在顯示參數值時中文內容變成了亂碼。這是因為請求參數的文字編碼方式與頁面中的不一致所造成的,所有的request請求都是ISO-8859-1的,而在此頁面采用的是UTF-8的編碼方式。要解決此問題,只要將獲取到的數據通過String的構造方法使用指定的編碼類型重新構造一個String對象,即可正確地顯示出中文信息。
【例6.6】 解決中文亂碼。(實例位置:資源包\TM\sl\6\4)
創建index.jsp頁面,在其中加入一個超鏈接,并在該超鏈接中傳遞兩個參數,分別為name與sex,其值全部為中文。關鍵代碼如下:

接下來創建show.jsp頁面,在其中將第一個參數name的值進行編碼轉換,將第二個參數sex的值直接顯示在頁面中,比較效果。關鍵代碼如下:

運行本實例后,可以發現name參數的值被正常顯示出來,而sex參數的值則被顯示成了亂碼,如圖6.5所示。

圖6.5 解決中文亂碼
6.2.5 獲取客戶端信息
通過request對象可以獲取客戶端的相關信息,如HTTP報頭信息、客戶信息提交方式、客戶端主機IP地址、端口號等。在客戶端獲取用戶請求相關信息的request對象的方法如表6.1所示。
表6.1 request獲取客戶端信息的常用方法

【例6.7】 使用request對象的相關方法獲取客戶端信息。(實例位置:資源包\TM\sl\6\5)
創建index.jsp文件,在該文件中,調用request對象的相關方法獲取客戶端信息。index.jsp文件的具體代碼如下:

運行本實例,將顯示如圖6.6所示的運行結果。

圖6.6 獲取客戶端信息
6.2.6 顯示國際化信息
瀏覽器可以通過accept-language的HTTP報頭向Web服務器指明它所使用的本地語言。request對象中的getLocale()和getLocales()方法允許JSP開發人員獲取這一信息,獲取的信息屬于java.util.Local類型。java.util.Local類型的對象封裝了一個國家和國家所使用的一種語言。通過這一信息,JSP開發者就可以使用語言所特有的信息做出響應。
【例6.8】 頁面信息國際化。

上面的代碼,如果所在區域為中國,將顯示“您好,歡迎訪問我們公司網站!”,而所在區域為英國,則顯示“Hello, welcome to access our company's web!”。