一JSP客戶端請求
當瀏覽器請求一個網頁時,它會向網絡服務器發送一系列不能被直接讀取的信息,因為這些信息是作為HTTP信
息頭的一部分來傳送的。我們可以查閱HTTP協議來獲得更多的信息。
下表列出了瀏覽器端信息頭的一些重要內容,在以后的網絡編程中將會經常見到這些信息:
(1)HttpServletRequest類
request對象是javax.servlet.http.HttpServletRequest類的實例。每當客戶端請求一個頁面時,JSP引擎就會產
生一個新的對象來代表這個請求。
request對象提供了一系列方法來獲取HTTP信息頭,包括表單數據,cookies,HTTP方法等等。
接下來將會介紹一些在JSP編程中常用的獲取HTTP信息頭的方法。詳細內容請見下表:
(2)HTTP信息頭示例
在下面的這個例子中,我們會使用HttpServletRequest類的getHeaderNames()方法來讀取HTTP信息頭。這個
方法以枚舉的形式返回當前HTTP請求的頭信息。
獲取Enumeration對象后,用標准的方式來遍歷Enumeration對象,用hasMoreElements()方法來確定什么時候
停止,用nextElement()方法來獲得每個參數的名字。
main.jsp源代碼為:
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTTP</title>
</head>
<body>
<h1>HTTP頭部請求實例</h1>
<hr>
<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> </body> </html>
訪問main.jsp,將會得到以下結果:
二JSP服務器響應
response響應對象主要將JSP容器處理后的結果傳回到客戶端。可以通過response變量設置HTTP的狀態和向客
戶端發送數據,如Cookie、HTTP文件頭信息等。
一個典型的響應看起來就像下面這樣:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(空行)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
狀態行包含HTTP版本信息,比如HTTP/1.1,一個狀態碼,比如200,還有一個非常短的信息對應着狀態碼,比
如OK。
下表摘要出了HTTP1.1響應頭中最有用的部分,在網絡編程中您將會經常見到它們:
(1)HttpServletResponse類
response對象是 javax.servlet.http.HttpServletResponse類的一個實例。就像服務器會創建request對象一樣,
它也會創建一個客戶端響應。
response對象定義了處理創建HTTP信息頭的接口。通過使用這個對象,開發者們可以添加新的cookie或時間
戳,還有HTTP狀態碼等等。
下表列出了用來設置HTTP響應頭的方法,這些方法由HttpServletResponse類提供:
(2)HTTP響應頭程序示例
接下來的例子使用setIntHeader()方法和setRefreshHeader()方法來模擬一個數字時鍾:
main1.jsp源代碼:
<%@page import="java.util.GregorianCalendar"%>
<%@page import="java.util.Calendar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTTP</title>
</head>
<body>
<h1>自動刷新實例</h1>
<%
//設置每隔5秒自動刷新 response.setIntHeader("Refresh", 5); //獲取當前時間 Calendar calendar = new GregorianCalendar(); String am_pm; int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); if (calendar.get(Calendar.AM_PM) == 0){} am_pm = "AM"; else am_pm = "PM"; String CT = hour + ":" + minute + ":" + second + " " + am_pm; out.println("當前時間: " + CT + "\n"); %> </body> </html>
將以上代碼保存為main1.jsp,然后通過瀏覽器訪問它。它將會每隔5秒顯示一下系統當前時間。
三HTTP狀態碼
HTTP請求與HTTP響應的格式相近,都有着如下結構:
1)以狀態行+CRLF(回車換行)開始
2)零行或多行頭模塊+CRLF
3)一個空行,比如CRLF
4)可選的消息體比如文件,查詢數據,查詢輸出
舉例來說,一個服務器響應頭看起來就像下面這樣:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
狀態行包含HTTP版本,一個狀態碼,和狀態碼相對應的短消息。
下表列出了可能會從服務器返回的HTTP狀態碼和與之關聯的消息:
(1)設置HTTP狀態碼的方法
下表列出了HttpServletResponse類中用來設置狀態碼的方法:
(2)HTTP狀態碼程序示例
接下來的例子將會發送407錯誤碼給瀏覽器,然后瀏覽器將會告訴您"Need authentication!!!"。
main2.jsp源代碼:
訪問以上JSP頁面,將會得到以下結果: