6、1.檢索客戶端有關信息
String getRemoteHost() 返回客戶機的主機名
String getRemoteAddr() 返回客戶端的IP地址
int getRemotePort() 返回客戶端的IP地址的端口號
String getProtocol() 返回客戶使用的請求協議名和版本。
String getContentType() 返回請求體的MIME類型
String getCharacterEncoding() 返回客戶請求的編碼方式
public Cookie[] getCookies() 返回客戶與該請求一同發送的Cookie對象數組。
6、2檢索HTTP請求頭
HTTP請求頭是針對HTTP協議的,因此處理頭的方法屬於HttpServletRequest接口。
下面是HttpServletRequest接口中提供的用於檢索頭信息的方法:
String getHeader(String name)
Enumeration getHeaders(String name)
Enumeration getHeaderNames()
常用的HTTP請求頭
請求頭名 內容
user-agent 關於瀏覽器和它的平臺的信息
accept 客戶能處理的頁面的類型
accept-charset 客戶可以接受的字符集
accept-encoding 客戶能處理的頁面編碼的方法
accept–language 客戶能處理的語言
host 服務器的DNS名字
authorization 客戶的信任憑據的列表
cookie 將一個以前設置的cookie送回服務器
date 消息被髮送的日期和時間
6、3下面是HttpServletRequest接口中提供的用於檢索頭信息的方法:
1、設置響應頭。
public String getHeader(String name) 返回指定名稱的請求頭的值。
public Enumeration getHeaders(String name) 返回指定名稱的請求頭的Enumeration對象。
public Enumeration getHeaderNames() 返回一個Enumeration對象,它包含所有請求頭名。
public int getIntHeader(String name) 返回指定名稱的請求頭的整數值。
public long getDateHeader(String name) 返回指定名稱的請求頭的日期值。
2、
3、通過設置refresh響應頭實現每5秒鐘刷新一次頁面。
如:response.setHeader("refresh","5");
4、要告訴瀏覽器在5秒鐘後跳轉到http://host/path頁面,可以使用下面語句:
response.setHeader("Refresh","5;URL=http://host/path/");
實際上,在HTML頁面中通過在<head>標籤內添加下面代碼也可以實現這個功能:
<meta http-equiv="Refresh" content="5; URL= http://host/path/">
7響應重定向
1、Servlet可能決定不直接向瀏覽器發送響應,而是將響應重定向到其他資源。
public void sendRedirect(String location)
向客戶發送一個重定向的響應,location爲指定的新的資源的URL。該URL可以是絕對URL,也可以是相對URL。
2、關於sendRedirect()方法,記住下面兩點。
(1)如果響應被提交,即響應頭已經發送到瀏覽器,就不能調用該方法。此時如果調用該方法,方法將拋出異常。例如:
public void doGet(HttpServletRequest req,
HttpServletResponse res){
PrintWriter pw = res.getWriter();
pw.println("<html><body>Hello orld!</body></html>");
pw.flush();
res.sendRedirect("http://www.cnn.com");
}
解釋:flush() 是把緩衝區的數據強行輸出, 主要用在IO中,即清空緩衝區數據,一般在讀寫流(stream)的時候,數據是先被讀到了內存中,再把數據寫到文件中,當你數據讀完的時候不代表你的數據已經寫完了,因爲還有一部分有可能會留在內存這個緩衝區中。這時候如果你調用了close()方法關閉了讀寫流,那麼這部分數據就會丟失,所以應該在關閉讀寫流之前先flush()。
(2)只有當瀏覽器從第一個資源收到重定向消息後,它才請求第二個資源。
8、重定向與請求響應的區別
1、請求轉發
2、重定向
3、比較:
(1)RequestDispatcher對象是一個Web資源的包裝器,可以用來把當前請求轉發到該資源。
這種轉發是在服務器端控制權的轉向,客戶端發來的請求將交由新的頁面進行處理。
使用請求轉發,在客戶的瀏覽器地址欄中不會顯示轉發後的資源地址。
使用請求轉發,可以將前一個頁面的數據、狀態等信息傳到轉發的頁面。
2)sendRedirect()方法實際是服務器向瀏覽器發送一個特殊的響應頭(Location,狀態碼302),它命令瀏覽器連接到新的位置。
因此,使用這種方法在瀏覽器的地址欄中可以看到地址的變化。
重定向是作爲不同請求來看待的,因此,所有請求作用域的參數在重定向到下一個頁面時都會失效。
使用sendRedirect()方法重定向時,資源不能位於WEB-INF目錄中。
在調用sendRedirect()方法之前,主頁面不能有內容輸出。在調用sendRedirect()方法之後應該有一個return語句。
9、發送狀態碼和錯誤消息
1、Web服務器對請求的響應一般由狀態行、響應頭、空行和相應的文檔構成。狀態行由3部分組成:HTTP版本、狀態碼和狀態碼的描述信息。如下是一個典型的狀態行:
HTTP/1.1 200 OK
由於HTTP的版本是由服務器決定的,而狀態的消息是與狀態碼有關的,因此,在Servlet中一般只需要設置狀態碼。
狀態碼200是系統自動設置的,Servlet一般不需要指定該狀態碼。對於其他狀態碼,可以使用HttpServletResponse接口中定義的setStatus()方法設置,該方法的格式爲:
public void setStaus (int sc)
可以設置任意的狀態碼。參數sc表示要設置的狀態碼
對於404狀態碼,其消息爲Not Found,所以HttpServletResponse接口中爲該狀態碼定義的常量名爲SC_NOT_FOUND。
2、在HTTP協議1.1版中定義了若干狀態碼,這些狀態碼是由3位整數表示的,一般分爲5類
關於其他狀態碼的含義可以參閱參考文獻[1]或
直接到http://www.w2.org/Protocols上查閱相關文檔。
3、HTTP爲常見的錯誤狀態定義了狀態碼,這些錯誤狀態包括:資源沒有找到、資源被永久移動以及非授權訪問等。
所有這些代碼都在接口HttpServletResponse中作爲常量定義。HttpServletResponse也提供了sendError()方法用來向客戶發送狀態碼,該方法有兩個重載的形式,如下所示:
public void sendError (int sc)
public void sendError (int sc, String msg)
第一個方法使用一個狀態碼,第二個方法同時指定顯示消息。服務器在默認情況下創建一個HTML格式的響應頁面,其中包含指定的錯誤消息。
如果爲Web應用程序聲明瞭錯誤頁面,將優先返回錯誤頁面。
例如,如果Servlet發現客戶不應訪問其結果,它將調用
sendError(HttpServletResponse.SC_UNAUTHORIZED)
第三章:Servlet容器模型
1、web應用程序
所謂Web應用程序是一種可以通過Web訪問的應用程序。
一個Web應用程序是由完成特定任務的各種Web組件構成的並通過Web將服務展示給外界。
多個Servlet
多個JSP頁面
HTML文件
圖像文件等
2、應用服務器
Web 應用程序駐留在應用服務器上。
應用服務器爲 Web 應用程序提供一種簡單的和可管理的對系統資源的訪問機制。
它也提供低級的服務,
如 HTTP 協議的實現
數據庫連接管理。
Servlet 容器僅僅是應用服務器的一部分。
市場上可以得到多種Servlet容器,其中包括:
Apache 的Tomcat 、
Caucho Technology 的Resin、
Macromedia 的JRun、
JBoss
BEA 的WebLogic、
IBM 的WebSphere等。
其中有些如WebLogic、WebSphere不僅僅是Servlet容器,它們也提供對EJB(Enterprise JavaBeans)、JMS(Java Message Service)以及其他Java EE(Enterprise Edition)技術的支持。
3、Web應用程序的目錄結構
名爲bookstore的Web應用程序
├ webapps
├ bookstore
├ html (包含所有的HTML文件)
├ images (包含所有的GIF、JPEG和BMP圖象文件)
├ javascripts (包含所有的*.js文件)
├ jsp (包含所有的JSP文件)
├ index.html (默認的歡迎文件)
├WEB-INF
├ classes(應用程序的類文件)
├ com
├mycompany
├ MyClass.class
├ lib(驅動程序包和標籤庫包文件)
├ *.jar(jdbcdriver.jar,mytaglib.jar)
├ web.xml(部署描述文件)
3、1. 理解文檔根目錄
假設服務器主機名爲www.myserver.com,如果要訪問bookstore Web應用程序根目錄下的index.html 文件,應該使用下面的URL:
http://www.myserver.com/bookstore/index.html
要訪問html目錄中的/hello.html 文件,使用下面的URL:
http://www.myserver.com/bookstore/html/hello.html
3、2. 理解WEB-INF目錄
(1)classes目錄
(2)lib目錄
(3)web.xml文件
在創建Web應用程序時,可能需要阻止用戶訪問一些特定資源而允許Servlet容器訪問它們。爲了保護這些資源,應將它們存儲在WEB-INF目錄中。
3、3. Web歸檔文件
擴展名爲.war的Web歸檔文件(web archive),一般稱爲WAR文件。
創建一個WAR文件:使用Java的jar工具將bookstore目錄打包:
jar –cvf bookstore.war *
3、4. 默認的Web應用程序
Tomcat服務器維護一個默認的Web應用程序。
<CATALINA_HOME>\webapps\ROOT目錄被設置爲默認的Web應用程序的文檔根目錄。
訪問它的資源不需要指定應用程序的名稱。例如,訪問默認Web應用程序的URL爲:
4部署描述文件
Web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name> Webapp Test </display-name>
<context-param>
<param-name>email</param-name>
<param-value>[email protected]</param-value>
</context-param>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.abc.LoginServlet</servlet-class>
<init-param>
<param-name>greeting</param-name>
<param-value>Good Morning</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>20</session-timeout>
</session-config>
</web-app>
4、1
DD文件是一個XML文件。
第一行指定了XML的版本及所使用的字符集。
下面所有的內容都包含在<web-app>和</web-app>元素中,它是DD文件的根元素
DD文件的模式定義:
下面的代碼展示了在部署描述文件中<servlet>元素的一個典型的使用:
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>
com.myserver.HelloServlet
</servlet-class>
<init-param>
<param-name>email</param-name>
<param-value>[email protected]</param-value>
</init-param>
<init-param>
<param-name>limit</param-name>
<param-value>200</param-value>
<init-param>
<load-on-startup>2</load-on-startup>
</servlet>
4、2使用<servlet-mapping>元素
<servlet-mapping>元素用來定義一個映射,它爲Servlet分配一個URL,客戶使用該URL訪問Servlet。。
<servlet-name>元素應該是使用<servlet>元素定義的Servlet名,而<url-pattern>可以包含要與該Servlet關聯的模式字符串。下面是在DD文件中使用<servlet-mapping>元素的例子:
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloServlet/hello/*</url-pattern>
</servlet-mapping>
下面的URL就與上面的URL模式匹配:
http://www.myserver.com/mywebapp/helloServlet/hello/abc.jsp
1. URL的組成
協議與主機名 上下文路徑 Servlet路徑 路徑信息 查詢串
http://www.myserver.com /mywebapp/helloServlet/hello/abc.jsp?userName=Hacker
請求URI
2. <url-pattern>的三種形式
目錄匹配:以斜槓“/”開頭,以“/*”結尾的形式。例如:
/helloServlet/hello/*
擴展名匹配:以星號“*.”開始,後接一個擴展名
<servlet-mapping>
<servlet-name>pdfGeneratorServlet</servlet-name>
<url-pattern>*.pdf</url-pattern>
</servlet-mapping>
精確匹配:所有其他字符串都作爲精確匹配。
<servlet-mapping>
<servlet-name>reportServlet</servlet-name>
<url-pattern>/report</url-pattern>
</servlet-mapping>