# JSP 客戶端請求
當瀏覽器請求一個網頁時,它會向網絡服務器發送一系列不能被直接讀取的信息,因為這些信息是作為HTTP信息頭的一部分來傳送的。您可以查閱HTTP協議來獲得更多的信息。
下表列出了瀏覽器端信息頭的一些重要內容,在以后的網絡編程中將會經常見到這些信息:
| **信息** | **描述** |
| --- | --- |
| Accept | 指定瀏覽器或其他客戶端可以處理的MIME類型。它的值通常為?**image/png**?或?**image/jpeg** |
| Accept-Charset | 指定瀏覽器要使用的字符集。比如 ISO-8859-1 |
| Accept-Encoding | 指定編碼類型。它的值通常為?**gzip**?或**compress** |
| Accept-Language | 指定客戶端首選語言,servlet會優先返回以當前語言構成的結果集,如果servlet支持這種語言的話。比如 en,en-us,ru等等 |
| Authorization | 在訪問受密碼保護的網頁時識別不同的用戶 |
| Connection | 表明客戶端是否可以處理HTTP持久連接。持久連接允許客戶端或瀏覽器在一個請求中獲取多個文件。**Keep-Alive**?表示啟用持久連接 |
| Content-Length | 僅適用于POST請求,表示 POST 數據的字節數 |
| Cookie | 返回先前發送給瀏覽器的cookies至服務器 |
| Host | 指出原始URL中的主機名和端口號 |
| If-Modified-Since | 表明只有當網頁在指定的日期被修改后客戶端才需要這個網頁。 服務器發送304碼給客戶端,表示沒有更新的資源 |
| If-Unmodified-Since | 與If-Modified-Since相反, 只有文檔在指定日期后仍未被修改過,操作才會成功 |
| Referer | 標志著所引用頁面的URL。比如,如果你在頁面1,然后點了個鏈接至頁面2,那么頁面1的URL就會包含在瀏覽器請求頁面2的信息頭中 |
| User-Agent | 用來區分不同瀏覽器或客戶端發送的請求,并對不同類型的瀏覽器返回不同的內容 |
## HttpServletRequest類
request對象是javax.servlet.http.HttpServletRequest類的實例。每當客戶端請求一個頁面時,JSP引擎就會產生一個新的對象來代表這個請求。
request對象提供了一系列方法來獲取HTTP信息頭,包括表單數據,cookies,HTTP方法等等。
接下來將會介紹一些在JSP編程中常用的獲取HTTP信息頭的方法。詳細內容請見下表:
| **方法** | **描述** |
| --- | --- |
| **Cookie[] getCookies()** |返回客戶端所有的Cookie的數組 |
| **Enumeration getAttributeNames()** |返回request對象的所有屬性名稱的集合 |
| **Enumeration getHeaderNames()** |返回所有HTTP頭的名稱集合 |
| **Enumeration getParameterNames()** |返回請求中所有參數的集合 |
| **HttpSession getSession()** |返回request對應的session對象,如果沒有,則創建一個 |
| **HttpSession getSession(boolean create)** |返回request對應的session對象,如果沒有并且參數create為true,則返回一個新的session對象 |
| **Locale getLocale()** |返回當前頁的Locale對象,可以在response中設置 |
| **Object getAttribute(String name)** |返回名稱為name的屬性值,如果不存在則返回null。 |
| **ServletInputStream getInputStream()** |返回請求的輸入流 |
| **String getAuthType()** |返回認證方案的名稱,用來保護servlet,比如 "BASIC" 或者 "SSL" 或 null 如果 JSP沒設置保護措施 |
| **String getCharacterEncoding()** |返回request的字符編碼集名稱 |
| **String getContentType()** |返回request主體的MIME類型,若未知則返回null |
| **String getContextPath()** |返回request URI中指明的上下文路徑 |
| **String getHeader(String name)** |返回name指定的信息頭 |
| **String getMethod()** |返回此request中的HTTP方法,比如 GET,,POST,或PUT |
| **String getParameter(String name)** |返回此request中name指定的參數,若不存在則返回null |
| **String getPathInfo()** |返回任何額外的與此request URL相關的路徑 |
| **String getProtocol()** |返回此request所使用的協議名和版本 |
| **String getQueryString()** |返回此 request URL包含的查詢字符串 |
| **String getRemoteAddr()** |返回客戶端的IP地址 |
| **String getRemoteHost()** |返回客戶端的完整名稱 |
| **String getRemoteUser()** |返回客戶端通過登錄認證的用戶,若用戶未認證則返回null |
| **String getRequestURI()** |返回request的URI |
| **String getRequestedSessionId()** |返回request指定的session ID |
| **String getServletPath()** |返回所請求的servlet路徑 |
| **String[] getParameterValues(String name)** |返回指定名稱的參數的所有值,若不存在則返回null |
| **boolean isSecure()** |返回request是否使用了加密通道,比如HTTPS |
| **int getContentLength()** |返回request主體所包含的字節數,若未知的返回-1 |
| **int getIntHeader(String name)** |返回指定名稱的request信息頭的值 |
| **int getServerPort()** |返回服務器端口號 |
## HTTP信息頭示例
在這個例子中,我們會使用HttpServletRequest類的getHeaderNames()方法來讀取HTTP信息頭。這個方法以枚舉的形式返回當前HTTP請求的頭信息。
獲取Enumeration對象后,用標準的方式來遍歷Enumeration對象,用hasMoreElements()方法來確定什么時候停止,用nextElement()方法來獲得每個參數的名字。
```
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<title>HTTP Header Request Example</title>
</head>
<body>
<center>
<h2>HTTP Header Request Example</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
</center>
</body>
</html>
```
訪問main.jsp,將會得到以下結果:
```
<h1>HTTP Header Request Example</h1>
<table width="100%" border="1" align="center">
<tbody>
<tr><th>Header Name</th><th>Header Value(s)</th></tr>
<tr><td>accept</td><td>*/*</td></tr>
<tr><td>accept-language</td><td>en-us</td></tr>
<tr><td>user-agent</td><td>Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8)</td></tr>
<tr><td>accept-encoding</td><td>gzip, deflate</td></tr>
<tr><td>host</td><td>localhost:8080</td></tr>
<tr><td>connection</td><td>Keep-Alive</td></tr>
<tr><td>cache-control</td><td>no-cache</td></tr>
</tbody>
</table>
```
您可以在上面代碼中嘗試HttpServletRequest類的其它方法。
- Java 基礎
- Java 簡介
- Java開發環境配置
- Java基礎語法
- Java對象和類
- Java基本數據類型
- Java變量類型
- Java修飾符
- Java運算符
- Java循環結構 - for, while 及 do...while
- Java分支結構 - if...else/switch
- Java Number類
- Java Character類
- Java String類
- Java StringBuffer和StringBuilder類
- Java 數組
- Java 日期時間
- Java正則表達式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 異常處理
- Java 面向對象
- Java 繼承
- Java 重寫(Override)與重載(Overload)
- Java 多態
- Java 抽象類
- Java 接口
- Java 包(package)
- Java 高級教程
- Java 數據結構
- Java Enumeration接口
- Java Bitset類
- Java Vector 類
- Java Stack 類
- Java Dictionary 類
- Java Hashtable 接口
- Java Properties 接口
- Java 集合框架
- Java 泛型
- Java序列化
- Java 網絡編程
- Java 發送郵件
- Java 多線程編程
- Java Applet基礎
- Java 文檔注釋
- Servlet 教程
- Servlet 簡介
- Servlet 環境設置
- Servlet 生命周期
- Servlet 實例
- Servlet 表單數據
- Servlet 客戶端 HTTP 請求
- Servlet 服務器 HTTP 響應
- Servlet HTTP 狀態碼
- Servlet 編寫過濾器
- Servlet 異常處理
- Servlet Cookies 處理
- Servlet Session 跟蹤
- Servlet 數據庫訪問
- Servlet 文件上傳
- Servlet 處理日期
- Servlet 網頁重定向
- Servlet 點擊計數器
- Servlet 自動刷新頁面
- Servlet 發送電子郵件
- Servlet 包
- Servlet 調試
- Servlet 國際化
- JSP 基礎
- JSP 簡介
- JSP 開發環境搭建
- JSP 結構
- JSP 生命周期
- JSP 語法
- JSP 指令
- JSP 動作元素
- JSP 動作元素
- JSP 隱含對象
- JSP 客戶端請求
- JSP 服務器響應
- JSP HTTP 狀態碼
- JSP 表單處理
- JSP 過濾器
- JSP Cookies 處理
- JSP Session
- JSP 文件上傳
- JSP 日期處理
- JSP 頁面重定向
- JSP 點擊量統計
- JSP 自動刷新
- JSP 發送郵件
- JSP 高級教程
- JSP 標準標簽庫(JSTL)
- JSP 連接數據庫
- JSP XML 數據處理
- JSP JavaBean
- JSP 自定義標簽
- JSP 表達式語言
- JSP 異常處理
- JSP 調試
- JSP 國際化
- 免責聲明