客戶端可通過 HTML 表單或在網頁地址后面提供參數的方法提交數據,然后通過 request 對象的相關方法來獲取這些數據。request 對象封裝了客戶端的請求信息,包括用戶提交的信息以及客戶端的一些信息,服務端通過 request 對象可以了解到客戶端的需求,然后做出響應。
request 對象是 HttpServletRequest(接口)的實例。請求信息的內容包括請求的標題頭(Header)信息(如瀏覽器的版本信息語言和編碼方式等),請求的方式(如 HTTP 的 GET 方法、POST 方法等),請求的參數名稱、參數值和客戶端的主機名稱等。
request 對象提供了一些方法,主要用來處理客戶端瀏覽器提交的請求中的各項參數和選項。表 1 列出了 request 對象常用的方法。下面介紹 request 對象的應用。
表1 request對象常用的方法
方法 |
說明 |
---|---|
Object getAttribute(String name) |
用于返回由 name 指定的屬性值,如果指定的屬性值不存在,則返回一個 null 值 |
Enumeration getAttributeNames() |
用于返回 request 對象的所有屬性的名稱集合 |
String getCharacterEncoding() |
用于返回一個 String,它包含請求正文中所使用的字符編碼 |
int getContentLength() |
用于返回請求正文的長度(字節數),如果不確定,返回 -1 |
String getContenType() |
得到請求體的 MIME 類型 |
ServletlnputStream getInputStream() |
用于返回請求的輸入流,用來顯示請求中的數據 |
String getParameter(String name) |
用于獲取客戶端傳送給服務器端的參數。主要由 name 指定,通常是表單中的參數 |
Enumeration getParameterNames() |
用于獲取客戶端傳送的所有參數的名字集合 |
String getParameterValues(String name) |
用于獲得指定參數的所有值,由 name 指定 |
String getProtocol() |
用于返回客戶端向服務器端傳送數據所依據的協議名稱 |
String getMethod() |
用于獲得客戶端向服務器端傳送數據的參數方法,主要有兩個,分別是 get() 和 post() |
String getServerName() |
用于獲得服務器端的主機名字 |
int getServletPath() |
用于獲得 JSP 文件相對于根地址的地址 |
String getRemoteAddr() |
用于獲得客戶端的網絡地址 |
String getRemoteHost() |
用于獲取發送此請求的客戶端主機名 |
String getRealPath(String path) |
用于獲取一虛擬路徑的真實路徑 |
cookie[] get Cookie() |
用于獲取所有的 Cookie 對象 |
void setAttribute(String key,Object obj) |
設置屬性的屬性值 |
boolean isSecure() |
返回布爾類型的值,用于確定這個請求是否使用了一個安全協議,如 HTTP |
boolean isRequestedSessionldPromCookie() |
返回布爾類型的值,表示會話是否使用了一個 Cookie 來管理會話 ID |
boolean isRequestedSessionIdFromURL() |
返回布爾類型的值,表示會話是否使用了一個URL來管理會話ID |
boolean isRequestedSessionldFromVoid() |
檢查請求的會話 ID 是否合法 |
獲取客戶信息
request 對象就是利用表 1 列舉的那些 get 方法,來獲取客戶端的信息。
例1:應用 request 對象獲取客戶信息,代碼如下:
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>
request對象獲取客戶信息
</title>
</head>
<body>
客戶提交信息的方式:<%=request.getMethod() %> <br/>
使用的協議:<%=request.getProtocol() %> <br/>
獲取提交數據的客戶端IP地址:<%=request.getRemoteAddr() %> <br/>
獲取服務器端的名稱:<%=request.getServerName() %> <br/>
獲取服務器端口號:<%=request.getServerPort() %> <br/>
獲取客戶端的機器名稱:<%=request.getRemoteHost() %> <br/>
</body>
</html>
送行結果如圖 1 所示。
圖1 應用request對象獲取客戶信息
用戶借助表單向服務器提交數據,完成用戶與網站之間的交互,大多數 Web 應用程序都是這樣的。表單中包含文本框、列表、按鈕等輸入標記。當用戶在表單中輸入信息后,單擊 Submit 按鈕提交給服務器處理。
用戶提交的表單數據存放在 request 對象里,通常在 JSP 代碼中用 getParameter() 或者 getParameterValues() 方法來獲取表單傳送過來的數據,前者用于獲取單值,如文本框、按鈕等;后者用于獲取數組,如復選框或者多選列表項。使用格式如下:
String getParameter(String name);
String[] getParameterValues(String name);
以上兩種方法的參數 name 與 HTML 標記的 name 屬性對應,如果不存在,則返回 null。
另外要注意的是,利用 request 的方法獲取表單數據時,默認情況下,字符編碼為 ISO-8859-1,所以,當獲取客戶提交的漢字字符時,會出現亂碼問題,必須進行特殊處理。
首先,將獲取的字符串用 ISO-8859-1 進行編碼,并將編碼存放到一個字節數組中,然后再將這個數組轉化為字符串對象即可,這種方法僅適用于處理表單提交的單值數據或者查詢字符串中所傳遞的參數。關鍵代碼如下:
String s1=request.getParameter("UserName");
byte tempB[]=s1.getByte("ISO-8859-1");
String s1=new String(tempB);
在處理中文字符亂碼問題時,下面設置編碼格式的語句在獲取表單提交的單值或者數組數據時都更為常用:
<%
request.setCharacterEncoding("GBK"); //設置編碼格式為中文編碼,或者utf-8
%>
例2:應用 request 對象獲取請求參數。在 3-5.jsp 頁面中,利用表單向 3-5-1.jsp 頁面提交用戶的注冊信息,包括用戶名、密碼和愛好。
3-5.jsp 的代碼如下:
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>
request對象獲取請求參數
</title>
</head>
<body>
<h2> 個人注冊 </h2>
<form name="form1" method="post" action="3-5-1.jsp">
用戶名:<input name="username" type="text"/> <br>
密 碼:<input name="pwd" type="text" /> <br>
<input name="inst" type="checkbox" value="音樂">音樂
<input name="inst" type="checkbox" value="舞蹈">舞蹈
<input name="inst" type="checkbox" value="讀書">讀書
<input name="inst" type="checkbox" value="游泳">游泳 <br>
<input type="submit" value="提交" />
<input type="reset" value="重置" />
</form>
</body>
</html>
3-5-1.jsp 的代碼如下:
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>
request對象獲請求參數
</title>
</head>
<body>
<h2> 獲取到的注冊信息如下:</h2>
<%
request.setCharacterEncoding("utf-8");
String username=request.getParameter("username");
String pwd=request.getParameter("pwd");
String inst[]=request.getParameterValues("inst");
out.println("用戶名為:"+username+"<br>");
out.println("密碼為:"+pwd+"<br>");
out.println("愛好為:");
for(int i=0;i<inst.length;i++)
out.println(inst[i]+" ");
%>
</body>
</html>
3-5.jsp 運行結果如圖 2(a) 所示。程序 3-5.jsp 通過表單向 3-5-l.jsp 提交信息,3-5-l.jsp 通過 request 對象獲取用戶提交的表單數據并進行處理,運行結果如圖 2(b) 所示。
a)
b)
圖2 request對象獲取請求參數
為了在網頁之間傳遞值,常常在請求的 URL 地址后面附加查詢字符串,語法如下:
?變量名1=值1&變量名2=值2...
可以有多個變量參數,參數之間使用 & 來連接,變量的值可以是 JSP 表達式。利用 request getParameter() 方法獲取查詢字符串中的所有變量及其值。
例3:應用 request 對象獲取查詢字符串,實現頁面之間傳值的目的。在 3-6.jsp 頁面中設置要傳遞的數據,當單擊“顯示”肘,超鏈接到 3-6-1.jsp 頁面,并將所傳遞的信息顯示出來。
3-6.jsp 的代碼如下:
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>
request對象獲取查詢字符串
</title>
</head>
<body>
<%
String address="北京";
String college="清華大學";
%>
<h4>請單擊下面的鏈接查看我的相關信息</h4>
<a href="3-6-1.jsp?name=白淺&add=<%=address%>&col=<%=college%>">顯示</a>
</body>
</html>
3-6-1.jsp 的代碼如下:
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>
request對象獲取查詢字符串
</title>
</head>
<body>
<%
String m_name=request.getParameter("name");
String m_add=request.getParameter("add");
String m_col=request.getParameter("col");
//處理中文亂碼
String ch_name=new String(m_name.getBytes("ISO-8859-1"),"utf-8");
String ch_add=new String(m_add.getBytes("ISO-8859-1"),"utf-8");
String ch_col=new String(m_col.getBytes("ISO-8859-1"),"utf-8");
%>
<%out.println(ch_name+"您好");%><br>
<%out.println("您來自中國"+ch_add);%><br>
<%out.println("畢業于"+ch_col);%><br>
</body>
</html>
運行結果分別如圖 3(a) 和 (b) 所示。
(a)
(b)
圖3 request對象獲取查詢字符串
在進行請求轉發時,往往需要把一些數據帶到轉發后的頁面進行處理。這時,就可以使用 request 對象的 setAttribute() 方法設置數據在 request 范圍內存取。
request.setAttribute("key",value);
參數 key 是鍵,為 String 類型。在轉發后的貢面就通過這個鍵來獲取數據。參數 value 是鍵值,為 Object 類型,它代表需要保存在 request 范圍內的數據。
request.getAttribute("key");
參數 key 表示鍵名,如果指定的屬性值不存在,則返回一個 null 值。
在頁面使用 request 對象的 setAttribute(“key”,value) 方法,可以把數據 value 設定在 request 范圍內。請求轉發后的頁面使用 getAttribute(“key”) 就可以取得數據 value。
提示:
這一對方法在不同的請求之間傳遞數據,而且從上一個請求到下一個請求必須是轉發請求(使用 動作來實現),即保存的屬性在 request 屬性范圍(request scope)內,而不能是重定向請求(使用 response.sendRedirect() 或者超級鏈接來實現)。
例4:通過 request 對象在作用域中管理屬性。使用 request 對象的 setAttribute() 方法設置數據,然后在請求轉發后利用 getAttribnte() 取得設置的數據。代碼如下:
<!--3-7.jsp-->
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>
request對象在作用域中管理屬性
</title>
</head>
<body>
<% request.setAttribute("str","歡迎學習request對象的使用方法!"); %>
<jsp:forward page="3-7-1.jsp"/>
</body>
</html>
<!--3-7-1.jsp-->
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>
request對象在作用域中管理屬性
</title>
</head>
<body>
<% out.println("頁面轉發后獲取的屬性值:"+request.getAttribute("str")); %>
</body>
</html>
運行結果如圖 4 所示。
運行結果如圖 4 所示。
提示:
在 3-7.jsp 中,若將語句<jsp:forward page="3-7-1.jsp"/>改成response.sendRedirect("3-7.jsp")或者<a href="3-7-1.jsp">跳轉</a>,就不能獲得 request 范圍內的屬性值。
Cookie 是一小段文本信息,伴隨著用戶請求和頁面在 Web 服務器和瀏覽器之間傳遞。Cookie 常常用來保存用戶信息,以便 Web 應用程序能進行讀取,并且當用戶每次訪問站點時,Web 應用程序都可以讀取 Cookie 包含的信息。
例如,當用戶訪問站點時,可以利用 Cookie 保存用戶首選項或其他信息,這樣,當用戶再次訪問站點時,應用程序就可以撿索以前保存的信息。
1.通過 request 對象的 getCookies() 方法獲取 Cookie 中的數據。獲取 Cookie 的方法如下:
Cookie[] cookie=request.getCookies();
request 對象的 getCookies() 方法返回的是 Cookie[] 數組。
2.通過 response 對象的 addCookie() 方法添加一個 Cookie 對象。添加 Cookie 的方法如下:
response.addCookie(Cookie cookie)
例5:通過 request 對象獲取 Cookie。使用 request 對象的 get () 方法和 response 對象的 addCookie() 方法,記錄本次及上次訪問網頁的時間,代碼如下:
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>
request對象獲取Cookie
</title>
</head>
<body>
<%
Cookie[] cookies=request.getCookies(); //從request中獲得Cookie集
Cookie cookies_response=null; //初始化Cookie對象為空
String t=new java.util.Date().toLocaleString(); //取得當前訪問時間
if(cookies==null)
{
cookies_response=new Cookie("AccessTime"," ");
out.println("您第一次訪問,本次訪問時間:"+t+"<br>");
cookies_response.setValue(t);
response.addCookie(cookies_response);
}
else
{
cookies_response=cookies[0];
out.println("本次訪問時間:"+t+"<br>");
out.println("上一次訪問時間:"+cookies_response.getValue());
cookies_response.setValue(t);
response.addCookie(cookies_response);
}
%>
</body>
</html>
結果如圖 5 所示。
圖5 request 對象獲取 Cookie
request 對象提供了訪問安全屬性的方法,主要包括以下 4 種。
1. isSecure()。
2. isRequestedSessionldFromCookie()。
3. isRequestedSessionldFromURL()。
4. isRequestedSessionldFromValid()。
例如,可使用 request 對象來確定當前請求是否使用了一個類似 HTTP 的安全協議:用戶安全信息:<%=reguest,isSecure() %>
很多 Web 應用程序都能夠根據客戶瀏覽器的設置做出國際化響應,這是因為瀏覽器會通過 accept-language 的 HTTP 報頭向 Web 服務器指明它所使用的本地語言,JSP 開發人員就可以利用 request 對象中的 getLocale() 和 getLocales() 方法獲取這一信息,獲取的信息屬于 Java.util.Local 類型。
使用報頭的具體代碼如下:
<%
java.util.Local locale=request.getLocale();
if(locale.equals(java.util.Locale.US))
{
out.print("Welcome to Beijing");
}
if(locale.equals(java.util.Local.CHINA))
{
out.print("北京歡迎您");
}
%>
上述代碼表示,如果所在區域為中國,將顯示“北京歡迎您”,而所在區域為英國,則顯示“Welcome to Beijing”。