- 從零開始學Java Web開發
- 孫更新等編著
- 2467字
- 2018-12-27 13:06:06
5.2 request內置對象
request對象用來包含客戶端提交的各種信息。當客戶端請求一個JSP頁面時,JSP引擎會將客戶端的請求信息封裝在這個request對象中,request對象調用相應的方法就可以獲取對應的封裝信息了。該對象中封裝的請求信息主要包括以下3部分。
? 請求的HTTP協議的傳送文件頭信息。
? 提交請求的客戶端和服務器端信息。
? 用戶提交的表單信息。
表5.2中列舉了request對象中常用的方法。
表5.2 request對象中常用方法

5.2.1 獲取用戶提交的表單信息
request對象最主要的一個作用就是用來封裝用戶提交的表單信息,然后通過如下的兩個方法來獲取用戶提交的表單信息。
? getParameter(String name):根據參數名獲取唯一的參數值。
? getParameterValues(String name):根據參數名獲取參數數組。
【實例5-1】接收用戶提交的信息。
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <FORM action="getinfo.jsp" method=post name=form> 05 姓名:<INPUT type="text" name="name"> 06 <P>您熟悉的語言:</P> 07 <P> 08 <!--供選取語言類型的復選框--> 09 <INPUT type="checkbox" name=box value="JSP">JSP 10 <INPUT type="checkbox" name=box value="PHP">PHP 11 <INPUT type="checkbox" name=box value="ASP.NET">ASP.NET 12 </P> 13 <INPUT TYPE="submit" value="Enter" name="submit"> 14 </FORM> 15 </FONT> 16 </BODY> 17 </HTML>
【代碼說明】在實例5-1頁面的第9行定義了提交單個值參數的文本框,第10~11行定義了提交多個值參數的復選框。并通過第4行的<form>表單提交給getinfo.jsp頁面。
【運行結果】在如圖5.1所示頁面中輸入用戶的姓名及用戶所熟悉的語言。
getinfo.jsp頁面的具體代碼如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <%String textContent=request.getParameter("name"); //獲取用戶提交的姓名信息 05 %> 06 <BR> 07 <%=textContent%> 08 <P> 熟悉的語言是: 09 <% 10 String box[] = request.getParameterValues("box"); //獲取用戶提交的熟悉的語言信息 并進行遍歷 11 for(int i = 0; i < box.length ; i++) 12 out.println("<LI>" + box[i] + "</LI>"); //顯示用戶提交的復選框的選項 內容 13 %> 14 <BR> 15 </FONT> 16 </BODY> 17 </HTML>
【代碼說明】該頁面的第4 行使用getParameter()方法獲取單值的參數,無論用戶提交的信息是什么類型的,該方法的返回值都將是String類型,而第10行的getParameterValues ()方法則用來獲取多值的參數,該方法的返回值將是一個String類型的數組。
【運行結果】該頁面接收用戶提交的參數后將如圖5.2所示。

圖5.1 提交信息的頁面

圖5.2 接收用戶提交的參數
5.2.2 獲取服務器端和客戶端信息
使用request對象還可以獲取提交請求的客戶端信息及接收請求的服務器端信息,這些獲取信息的方法如下所示。
? getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱。
? getContentLength():獲取HTTP請求的長度。
? getMethod():獲取客戶端提交信息的方式,如POST或者GET。
? getServletPath():獲取客戶端提交信息頁面的路徑。
? getRemoteAddr():獲取客戶端的IP地址。
? getRemoteHost():獲取客戶端計算機的名稱。
? getServerName() :獲取服務器的名稱。
? getServerPort():獲取服務器的端口號。
【實例5-2】獲取客戶端和服務器的信息。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <HTML> 03 <BODY> 04 <Font size=2> <BR> 05 客戶使用的協議是: 06 <% 07 String protocol=request.getProtocol(); //獲取客戶端使用的協議的版本信息 08 out.println(protocol); 09 %> <BR> 10 獲取接受客戶提交信息的頁面: 11 <% 12 String path=request.getServletPath(); //獲取客戶端提交信息的頁面路徑 13 out.println(path); 14 %> <BR> 15 接受客戶提交信息的長度: 16 <% 17 int length=request.getContentLength(); //獲取客戶端提交請求的信息的長度 18 out.println(length); 19 %> <BR> 20 客戶提交信息的方式: 21 <% 22 String method=request.getMethod(); //獲取客戶端提交信息的方式 23 out.println(method); 24 %> <BR> 25 獲取客戶的IP地址: 26 <% 27 String IP=request.getRemoteAddr(); //獲取客戶端的IP地址 28 out.println(IP); 29 %> <BR> 30 獲取客戶機的名稱: 31 <% 32 String clientName=request.getRemoteHost(); //獲取客戶端計算機的名稱 33 out.println(clientName); 34 %> <BR> 35 獲取服務器的名稱: 36 <% 37 String serverName=request.getServerName(); //獲取服務器的名稱 38 out.println(serverName); 39 %> <BR> 40 獲取服務器的端口號: 41 <% 42 int serverPort=request.getServerPort(); //獲取服務器的端口號 43 out.println(serverPort); 44 %> <BR> 45 </Font> 46 </BODY> 47 </HTML>
【代碼說明】該頁面的第7行使用getProtocol()方法獲取客戶端使用的協議名稱和版本,第12行使用getServletPath()方法獲取接受客戶提交信息頁面的路徑,第17行使用getContentLength()方法獲取客戶端提交信息的長度,第22 行使用getMethod()方法獲取客戶端提交請求的方式,第27 行使用getRemoteAddr()方法獲取客戶端的IP地址,第32行使用getRemoteHost()方法獲取客戶端計算機的名稱,如果得不到計算機名稱就將返回客戶端計算機的IP地址,第37行使用getServerName()方法獲取服務器的名稱,如果得不到服務器名稱就將返回服務器的IP地址,第42 行使用getServerPort()方法獲取服務器的端口號。

圖5.3 顯示獲取的客戶端和服務器端信息
【運行結果】實例5-2的JSP頁面的執行結果如圖5.3所示。
5.2.3 獲取HTTP協議的傳送文件頭信息
使用request對象還可以獲取提交信息時所使用的HTTP協議的傳送文件頭信息。HTTP協議采用了請求/響應模型??蛻舳讼蚍掌靼l送一個請求,請求的頭信息包含請求的方法、URI、協議版本、包含請求修飾符、客戶信息及內容類似于MIME的消息結構。通過如下兩個方法可以獲取HTTP協議中的頭信息。
? getHeaders(String name):可以獲取傳送請求信息的HTTP協議中指定的頭信息。
? getHeaderNames():可以返回所有傳送文件頭信息的名字。
【實例5-3】獲取HTTP頭信息。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <%@ page import="java.util.*"%> 03 <HTML> 04 <BODY> 05 <Font size=2> <BR> 06 獲取HTTP頭文件中User-Agent的值: 07 <% 08 String header1=request.getHeader("User-Agent"); //獲取HTTP頭信息 User-Agent的值 09 out.println(header1); 10 %> <BR> 11 獲取HTTP頭文件中accept的值: 12 <% 13 String header2=request.getHeader("accept"); //HTTP頭信息User-Agent的值 14 out.println(header2); 15 %> <BR> 16 獲取HTTP頭文件中Host的值: 17 <% 18 String header3=request.getHeader("Host"); //獲取HTTP頭信息Host的值 19 out.println(header3); 20 %> <BR> 21 獲取HTTP頭文件中accept-encoding的值: 22 <% 23 String header4=request.getHeader("accept-encoding");//獲取HTTP頭信息 accept-encoding的值 24 out.println(header4); 25 %> <BR> 26 獲取頭名字的一個枚舉: 27 <% //獲取HTTP所有頭信息的關鍵字,并使用枚舉對象進行遍歷 28 Enumeration enum_headed=request.getHeaderNames(); 29 while(enum_headed.hasMoreElements()) 30 {String s=(String)enum_headed.nextElement(); 31 out.println(s); 32 } 33 %> <BR> 34 獲取頭文件中指定頭名字的全部值的一個枚舉: 35 <% //獲取HTTP頭信息cookie的全部值,并使用枚舉對象進行遍歷 36 Enumeration enum_headedValues=request.getHeaders("cookie"); 37 while(enum_headedValues.hasMoreElements()) 38 {String s=(String)enum_headedValues.nextElement(); 39 out.println(s); 40 } 41 %> <BR> 42 </Font> 43 </BODY> 44 </HTML>
【代碼說明】該頁面的第8行、第13行、第18行、第23行分別調用getHeaders()方法根據不同的頭信息關鍵字獲取對應的頭信息。第28 行調用getHeaderNames()方法獲取包含全部頭信息關鍵字的一個枚舉對象,并使用第29~32 行的while循環對該枚舉對象進行遍歷。第36行獲取“cookie”關鍵字所對應的頭信息并將其封裝成一個枚舉對象,使用第37~40行的while循環對其進行遍歷。
【運行結果】實例5-3的JSP頁面的執行結果如圖5.4所示。

圖5.4 顯示獲取的HTTP頭信息
5.2.4 request中保存和讀取共享數據
request對象不僅能夠封裝請求信息,而且還可以保存和讀取某一范圍內的共享數據。其實request本身就代表了一個范圍,這個范圍包括了提交信息的頁面和接收提交信息的頁面。request對象中定義了一對方法getAttribute(String name)和setAttribute(String name,Object object),用來在request對象中讀取和保存共享數據。
說明
保存的數據必須是Object的子類,也就是說必須是類的對象,Java中的基本數據類型不能夠直接保存,必須封裝成對應的封裝類。
【實例5-4】保存和讀取共享數據。
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <% 05 request.setAttribute("name","sun"); //將共享信息存儲在request對象中 06 %> 07 <jsp:forward page="readAttribute.jsp" /> 08 </FONT> 09 </BODY> 10 </HTML>
【代碼說明】該頁面的第5行使用setAttribute()方法將共享數據保存到request對象中,然后在第7行中使用<jsp:forward>動作指令轉向readAttribute.jsp頁面。
readAttribute.jsp頁面的具體代碼如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 從request中讀取的共享信息是: 05 <% 06 out.println(request.getAttribute("name")); //從request對象中獲取共享信息并 顯示 07 %> 08 </FONT> 09 </BODY> 10 </HTML>
【代碼說明】該頁面的第6行使用getAttribute()方法來獲取存儲在request中的共享數據。
【運行結果】在瀏覽器中輸入訪問saveAttribute.jsp頁面的URL地址后,頁面將轉向readAttribute.jsp頁面,并讀取request對象中的共享數據并顯示在頁面上,最后運行結果如圖5.5所示。

圖5.5 讀取并顯示request對象中的共享數據
5.2.5 正確接收用戶提交的中文信息
在實例5-1 中,如果用戶在輸入姓名的文本框中輸入中文字符,那么提交后的頁面將顯示什么內容呢?讀者可以自己執行一下,看看是否顯示如圖5.6所示的亂碼信息。
為什么會出現這種情況呢?這是因為JSP頁面默認的接收字符集是英文,這里不要跟<%@ page contentType="text/html;charset=GB2312" %>指令中的“charset”屬性混淆了,該屬性是用來設置返回給瀏覽器的頁面中所采用的字符集的,與接收提交信息的字符集沒有任何關系。因此,要正確接收用戶提交的中文信息,必須重新設置頁面的接收字符集,通過調用request對象的setCharacterEncoding(String character)方法就可以實現該功能。下面修改實例5-1中的getinfo.jsp頁面的代碼如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <% 05 request.setCharacterEncoding("GB2312"); //設置接受信息時使用GB2312字符集 06 String textContent=request.getParameter("name"); //獲取用戶提交的姓名信息,可接收中 文輸入 07 %> 08 <BR> 09 <%=textContent%> 10 <P> 熟悉的語言是: 11 <% 12 //獲取并遍歷顯示提交的復選框的信息 13 String box[]=request.getParameterValues("box"); 14 for(int i=0; i<box.length ; i++) 15 out.println("<LI>" + box[i] + "</LI>"); 16 %> 17 <BR> 18 </FONT> 19 </BODY> 20 </HTML>
在該頁面中的第5 行調用setCharacterEncoding()方法來設置頁面的接收字符集為中文字符集,這里需要注意的是,該方法必須在頁面中所有的接收參數的方法執行之前被調用。修改后的頁面就可以正確接收用戶提交的中文信息了。修改后頁面的執行結果如圖5.7所示。

圖5.6 亂碼顯示用戶輸入的中文信息

圖5.7 正確顯示用戶提交的中文信息