Java Web學習(1): 客戶端請求、伺服器響應及其HTTP狀態碼

Love Lenka發表於2016-09-27

一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頁面,將會得到以下結果:

 

相關文章