4.9 request對象
request對象可以獲得客戶端的輸入信息。request對象包括了從客戶端傳來的請求信息。在HTTP 1.1協(xié)議中,客戶端請求信息是從客戶端通過HTTP頭(HTTP Header)和消息體傳送到服務器端的。
請求的參數(shù)是一個請求的組成部分,它們被作為字符串從客戶端傳送到JSP/Servlet容器,并被用于初始化request對象。
request對象的基類是javax.servlet.http.HttpServletRequest接口,它可用的主要方法如下所示。
1)getCookies()
該方法返回客戶端的Cookie對象數(shù)組,這些Cookie對象是javax.servlet.http.Cookie類的實例對象。
2)getHeader(String name)
該方法可以獲得HTTP協(xié)議所定義的特定HTTP文件頭的信息。該方法的參數(shù)name可以是HTTP文件頭的名字,如User-Agent。
3)getAttribute(String name)
該方法返回參數(shù)name所指定的屬性值,如果不存在那個屬性,則返回null值。這些屬性被綁定在當前的HTTP請求對象(request)上。如果我們需要將某個屬性綁定在request對象上,可以使用setAttribute()方法。請參考setAttribute()方法的介紹。
4)getAttributeNames()
使用getAttributeNames()方法可以返回和當前request對象所綁定的每一個屬性的名字。返回值是一個枚舉對象(Enumeration),使用getAttributeNames()方法和getAttribute()方法可以獲得所有和當前request對象綁定的屬性值和名稱。它的使用方法如下所示:
<%
Enumeration enum=request. getAttributeNames();
while(enum.hasMoreElements())
{
String attributeName=(String)enum.nextElement();
out.println(“Attribut Name-->”+attributeName+”<br>”);
String attributeValue=
(String)request.getAttribute(attributeName);
out.println(“Attribut Value-->”+attributeName+”<br>”);
}
%>
5)getHeaderNames()
使用getHeaderNames()方法可以獲得當前request對象中包含的每一個HTTP Header的名字,這也是一個枚舉對象(Enumerration)。
6)getHeader(String name)
該方法返回指定名字的HTTP Header的值,比如調(diào)用request.getHeader("User-Agent")將返回客戶端所用瀏覽器的名稱、版本號、操作系統(tǒng)平臺類型等信息。
7)getMethod()
該方法可以獲得客戶端向服務器端傳送數(shù)據(jù)的方式,可能的值有GET、POST或者PUT等方式。
8)getParameter(String name)
可以獲得客戶端傳送給服務器端的參數(shù)值,該參數(shù)的名稱是name。
9)getParameterNames()
該方法可以獲得客戶端傳送給服務器端的所有的參數(shù)名字。這個方法的返回值是一個枚舉對象(Enumeration),它的使用方法如下所示:
<%
Enumeration enum=request. getParameterNames ();
while(enum.hasMoreElements())
{
String parameterName=(String)enum.nextElement();
out.println(“Parameter Name-->”+ parameterName +”<br>”);
String parameterValue=
(String)request.getAttribute(parameterValue);
out.println(“ParameterValue-->”+ parameterValue +”<br>”);
}
%>
10)getParameterValues(String name)
使用這個方法可以獲得由客戶端向服務器端傳送的指定參數(shù)的所有值。因為同一個參數(shù)可能被賦多個值,如果使用getParameter()方法,那么僅會獲得該參數(shù)的第一個值,后面的值都被忽略了。但是使用getParameterValues()方法,就可以獲取賦給指定參數(shù)的所有值,這個方法的返回類型是字符串數(shù)組。它的使用方法如下所示:
<%
String []tempArray=request.getParameterValues(“friends”);
List paraList=tempArray.asList();
for(int i=0, i<paraList.size(); i++)
{
out.println(“friends: ”+i+”-->”+(String)paraList.get(i)+”<br>”);
}
%>
或:
<%
String []tempArray=request.getParameterValues(“friends”);
for(int i=0, i< tempArray.length; i++)
{
out.println(“friends: ”+i+”-->”+ tempArray [i]+”<br>”);
}
%>
11)getQueryString()
這個方法可以獲得請求字符串,該字符串由客戶端以GET方式向服務器端傳送。讀者可能會問,什么是請求字符串?我們留心觀察一下瀏覽器的地址欄,有時候URL的后面跟了一個問號,問號的后面是一列字符串,這一列字符串就是所謂的請求字符串。例如下面的URL:
http://127.0.0.1:8080/login.jsp?username=george&password=george
其中username=george&password=george就是請求字符串。
12)getRequestURI()
getRequestURI()方法可以獲得和當前request對象相應的URL地址,也就是客戶端通過瀏覽器所請求的URI地址。
13)getServletPath()
該方法可以獲得客戶端所請求的服務器端程序的文件路徑。
14)setAttribute(String name, Java.lang.Object obj)
該方法可以將某個參數(shù)和它的值與當前的request對象綁定起來,利用這個方法,我們可以在兩個不同的網(wǎng)頁之間通過此request對象傳遞信息,這個方法應該和getAttribute()方法協(xié)同使用。首先在第一個網(wǎng)頁中調(diào)用setAttribute()方法,設定被綁定的參數(shù)的名稱和它的值,然后重定向到第二個JSP程序,接著在后者中調(diào)用getAttribute()方法,獲得相應參數(shù)的值。這個方法的參數(shù)——name代表參數(shù)的名稱,obj代表和參數(shù)名對應的參數(shù)值,這是一個java.lang.Object類型的對象。
15)getServerName()
該方法可以獲取服務器的名稱。
16)getServerPort()
該方法可以獲取服務器提供HTTP服務的端口號,默認值一般是80。
17)getRemoteAddr()
該方法用于獲得發(fā)送HTTP請求的客戶端地址。利用這個方法,我們可以屏蔽來自某些IP地址的訪問。
18)getRemoteHost()
該方法可以獲取當前HTTP連接的客戶端的計算機名稱,這個方法一般不可能真的取得客戶端電腦的名字,這時,它將會返回客戶端電腦的IP地址,這和getRemoteAddr()方法的作用一樣。
19)getProtocol()
該方法可以獲取客戶端向服務器端通信所依據(jù)的協(xié)議名稱。
javax.servlet.http.HttpServletRequest接口繼承自javax.servlet.Servlet Request接口,因此request對象也可以使用ServletRequest接口的方法。
在程序4-16中,演示了如何使用request對象的各種方法去獲取當前HTTP連接的信息。
【程序4-16】snoop.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 <body bgcolor="white">
05 <h1>
06 Request Information
07 </h1>
08
09 <font size=”4”>
10 JSP Request Method: <%out.println(request.getMethod()); %>
11 <br>
12 Request URI: <%out.println(request.getRequestURI()); %>
13 <br>
14 Request Protocol: <%out.println(request. getProtocol()); %>
15 <br>
16 Servlet path: <%out.println(request.getServletPath ()); %>
17 <br>
18 Path info: <%out.println(request.getPathInfo()); %>
19 <br>
20 Path translated: <%out.println(request.getPathTranslated()); %>
21 <br>
22 Query string: <%out.println(request.getQueryString()); %>
23 <br>
24 Content length: <%out.println(request.getContentLength()); %>
25 <br>
26 Content type: <%out.println(request.getContentType()); %>
27 <br>
28 Server name: <%out.println(request.getServerName()); %>
29 <br>
30 Server port: <%out.println(request.getServerPort()); %>
31 <br>
32 Remote user: <%out.println(request.getRemoteUser()); %>
33 <br>
34 Remote address: <%out.println(request.getRemoteAddr()); %>
35 <br>
36 Remote host: <%out.println(request.getRemoteHost()); %>
37 <br>
38 Authorization scheme: <%out.println(request.getAuthType()); %>
39 <hr>
40 The browser you are using is: <%out.println(request.getHeader
41 (“User-Agent”)); %>
42 <hr>
43 </font>
44 </body>
45 </html>
執(zhí)行結(jié)果如圖4-15所示。