java web 第三天筆記

61.檢索客戶端有關信息 

String getRemoteHost()  返回客戶機的主機名

String getRemoteAddr()  返回客戶端的IP地址

int getRemotePort()     返回客戶端的IP地址的端口號

String getProtocol()     返回客戶使用的請求協議名和版本。

String getContentType()  返回請求體的MIME類型 

String getCharacterEncoding() 返回客戶請求的編碼方式

public Cookie[] getCookies() 返回客戶與該請求一同發送的Cookie對象數組。

62檢索HTTP請求頭 

HTTP請求頭是針對HTTP協議的,因此處理頭的方法屬於HttpServletRequest接口。 

下面是HttpServletRequest接口中提供的用於檢索頭信息的方法: 

 String getHeader(String name) 

 Enumeration getHeaders(String name) 

 Enumeration getHeaderNames() 

常用的HTTP請求頭 

    請求頭名      內容

user-agent       關於瀏覽器和它的平臺的信息 

accept           客戶能處理的頁面的類型 

accept-charset    客戶可以接受的字符集 

accept-encoding  客戶能處理的頁面編碼的方法 

acceptlanguage  客戶能處理的語言 

host             服務器的DNS名字 

authorization    客戶的信任憑據的列表 

cookie           將一個以前設置的cookie送回服務器 

date             消息被髮送的日期和時間 

63下面是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響應重定向

1Servlet可能決定不直接向瀏覽器發送響應,而是將響應重定向到其他資源。 

      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、比較:

1RequestDispatcher對象是一個Web資源的包裝器,可以用來把當前請求轉發到該資源。

這種轉發是在服務器端控制權的轉向,客戶端發來的請求將交由新的頁面進行處理。

使用請求轉發,在客戶的瀏覽器地址欄中不會顯示轉發後的資源地址。

使用請求轉發,可以將前一個頁面的數據、狀態等信息傳到轉發的頁面。

2sendRedirect()方法實際是服務器向瀏覽器發送一個特殊的響應頭(Location,狀態碼302),它命令瀏覽器連接到新的位置。

因此,使用這種方法在瀏覽器的地址欄中可以看到地址的變化。

重定向是作爲不同請求來看待的,因此,所有請求作用域的參數在重定向到下一個頁面時都會失效。

使用sendRedirect()方法重定向時,資源不能位於WEB-INF目錄中。

在調用sendRedirect()方法之前,主頁面不能有內容輸出。在調用sendRedirect()方法之後應該有一個return語句。 

9、發送狀態碼和錯誤消息

1Web服務器對請求的響應一般由狀態行、響應頭、空行和相應的文檔構成。狀態行由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上查閱相關文檔。

3HTTP爲常見的錯誤狀態定義了狀態碼,這些錯誤狀態包括:資源沒有找到、資源被永久移動以及非授權訪問等。

所有這些代碼都在接口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等。

其中有些如WebLogicWebSphere不僅僅是Servlet容器,它們也提供對EJBEnterprise JavaBeans)、JMSJava Message Service)以及其他Java EEEnterprise Edition)技術的支持。

3、Web應用程序的目錄結構

名爲bookstoreWeb應用程序

├ webapps

├ bookstore

├ html (包含所有的HTML文件)

├ images (包含所有的GIFJPEGBMP圖象文件)

├ javascripts (包含所有的*.js文件

├ jsp (包含所有的JSP文件)

├ index.html (默認的歡迎文件)

WEB-INF

 ├ classes(應用程序的類文件)

   ├ com

       ├mycompany

           ├ MyClass.class

 ├ lib(驅動程序包和標籤庫包文件)

      ├ *.jar(jdbcdriver.jar,mytaglib.jar)

 ├ web.xml(部署描述文件) 

31. 理解文檔根目錄

假設服務器主機名爲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 

32. 理解WEB-INF目錄

1classes目錄

2lib目錄

3web.xml文件

  

在創建Web應用程序時,可能需要阻止用戶訪問一些特定資源而允許Servlet容器訪問它們。爲了保護這些資源,應將它們存儲在WEB-INF目錄中。 

33. Web歸檔文件 

擴展名爲.warWeb歸檔文件(web archive),一般稱爲WAR文件。 

創建一個WAR文件:使用Javajar工具將bookstore目錄打包: 

jar cvf  bookstore.war  *

34. 默認的Web應用程序 

Tomcat服務器維護一個默認的Web應用程序。

<CATALINA_HOME>\webapps\ROOT目錄被設置爲默認的Web應用程序的文檔根目錄。

訪問它的資源不需要指定應用程序的名稱。例如,訪問默認Web應用程序的URL爲:

http://localhost:8080/

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>

41

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>

42使用<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>

發佈了23 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章