java web 第二天筆記

3.1URL(Uniform Resource Locator)統一資源定位器

URL通常由4部分組成:協議名稱、所在主機的DNS名、可選的端口號、和資源的名稱

URI(Uniform Resource Identifier)統一資源標識符

在Web應用中分三類型:1、絕對URI 2、根相對URI 3、非根相對URI

URN(Uniform Resource Name)統一資源名稱

URN:它唯一標識一個資源但不指定如何訪問資源

ISBN:1-930110-59-6是一個URN,因爲它唯一地標識某一本書,但它不是URL,因爲它沒有指定如何檢索該書。

4.1

什麼是Servlet.

Servlet一般翻譯成服務器端小程序,它是使用Servlet API以及相關的類編寫的Java程序。主要用來擴展Web服務器的功能。 

Servlet技術實際上是CGI技術的一種替代。 

什麼是Servlet容器。

Web服務器使用一個單獨的模塊裝載和運行Servlet。這個專門用於Servlet管理的單獨模塊稱爲Servlet容器(container),或稱Web容器。

圖1.17顯示了各種不同的組件構成的一個示意圖。 

4.3 Servlet的開發:

開發一個Servlet一般要經過一下4個步驟:編寫代碼、編譯、部署、運行

4.4錯誤處理

在執行Servlet時,由於各種原因可能會出現錯誤,下面是最經常出現的錯誤:

HTTP Status 404 -/helloapp/hello.

The requested resource(/helloapp/hello) is not available.

404錯誤是最常見的一種錯誤,它表示請求的資源不可用。有多種原因可導致該錯誤。你可以從這幾方面檢查:

查看給定的路徑名是否正確(包括大小寫);

查看Servlet類文件是否在WEB-INF\classes目錄中;

查看web.xml文件內容是否正確;

查看Tomcat服務器是否啓動。

4.4servlet的優缺點。

優點:

(1)高效性。每個請求由一個輕量級的Java線程處理 

(2)方便性。提供了大量的實用工具例程 

(3)功能強大。許多使用傳統CGI程序很難完成的任務都可以輕鬆地完成。 

(4)可移植性好 。爲一個服務器編寫的Servlet無需任何實質上的改動即可移植到其他服務器上。 

(5)節省投資 。有許多廉價甚至免費的Web服務器可供個人或小規模網站使用 

缺點:

缺點是它經常既包含業務邏輯又包含表示邏輯。

表示邏輯(presentation logic)是展示給用戶的信息,在Servlet中產生HTML響應就是表示邏輯。

業務邏輯(business logic)是完成某種數據處理和存儲任務的功能。

Sun在推出Servlet技術後不久又推出了JSP技術。有了JSP技術就可以實現業務邏輯和表示邏輯的分離:

Servlet專門處理業務邏輯

用JSP實現表示邏輯。

4.5什麼是JSP。

JSP(Java Server Pages)頁面是包含Java代碼和HTML標籤的Web頁面。 

由主動的JSP標籤和被動的HTML標籤混合而成的Web頁面。 

4.6使用servlet還是JSP。

用Servlet可以實現JSP的功能,用JSP也可以實現Servlet的功能 。

請記住下面兩點:

JSP頁面主要實現可視化的表示邏輯 。

Servlet主要用來實現業務處理和控制邏輯 。

MVC稱爲模型-視圖-控制器(Model View Control,MVC)模式。在這種設計模式中,控制器使用Servlet實現,視圖使用JSP實現,而模型使用JavaBeans實現。

第二章:

1.1

Sun的Servlet規範提供了一個標準的、平臺獨立的框架用來實現在Servlet和Servlet容器之間的通信。該框架是由一組Java接口和類組成的,它們統稱爲Servlet API。 

Servlet API的組成:

javax.servlet

定義了14個接口和11個類。開發獨立於協議的服務器小程序的接口和類。  

javax.servlet.http

定義了8個接口和7個類。這些接口和類定義了開發採用HTTP協議通信的Servlet。

2.1

1、Servlet接口 :

Servlet API中的核心接口,每個Servlet必須直接或間接實現該接口。 

該接口定義瞭如下5個方法。 

public void init(ServletConfig config) 

public void service(ServletRequest request,  

                                ServletResponse response)  

                  throws ServletException, IOException

public void destroy() 

public ServletConfig getServletConfig() 

public String getServletInfo() 

2. ServleConfig接口 

ServletConfig接口爲用戶提供了有關Servlet配置信息。Servlet配置包括Servlet名稱、Servlet環境(context)對象、Servlet初始化參數名和參數等。 

3. GenericServlet類 

GenericServlet是一個抽象類,它實現了Servlet接口和ServletConfig接口,它又是HttpServlet類的超類,它們的層次關係如圖3.1所示。 

   

4. ServleRequest接口 

ServletRequest接口是獨立於任何協議的請求對象。它定義了獲取客戶請求信息的方法。

5. ServleResponse接口 

ServletResponse接口是獨立於任何協議的響應對象。它定義了向客戶發送適當響應的方法。

3.1、servlet接口以及類的層次關係圖

1、 HttpServlet類 

增加了一個新的service()方法,格式如下:

protected void service (HttpServletRequest,

                  HttpServletResponse)

      throws ServletException, IOException;

該方法是Servlet向客戶請求提供服務的一個方法。

編寫Servlet可以覆蓋該方法。

2. HttpServletRequest接口    

該接口擴展了ServletRequest接口;

提供了關於HTTP請求對象的視圖;

定義了從請求對象中獲取如HTTP請求頭、cookies信息的方法。

3. HttpServletResponse接口 

該接口擴展了ServletResponse接口;

提供了針對HTTP的發送響應的方式;

定義了爲響應設置如HTTP響應頭、設置cookies信息的方法;

該方法是Servlet向客戶請求提供服務的一個方法。

4.1、servlet的生命週期

1、讀取web.xml文件 

Servlet 容器啓動時,它將查找一組部署文件,這些配置文件描述了所有的 Web 應用程序 

每個Web應用程序都有它自己的名爲web.xml的部署描述文件,其中包括應用程序所使用的每個Servlet的入口。 

一個入口指定了Servlet名稱和對應的Java類名稱。 

2、創建實例

對每個Servlet類,Servlet容器使用

Class.forName(className).newInstance()

方法加載並創建一個實例。

3.1、初始化

一旦容器創建了servlet實例,它將在新創建的實例上調用init(ServletConfig)方法。 

ServletConfig對象包含了所有的在web應用程序的DD文件中指定的初始化參數。 

init()方法返回後,servlet就被初始化了。 

  3.2、預初始化

servlet第一次被請求時纔對它初始化,這叫做延遲加載。 

優點 :大大提高servlet容器的啓動時間 

缺點 :如果在初始化時servlet要完成很多任務,如從數據庫中緩存靜態數據,則發送第一個請求的客戶的響應時間會很長。 

servlet規範定義了<load-on-startup>元素,它可以在部署描述文件中指定當servlet容器啓動時裝載並初始化servlet

在任何請求達到之前裝載servlet的過程稱爲預裝載或預初始化。

 4、爲客戶請求服務

servlet實例正常初始化後,它就準備爲客戶提供服務。

當容器接收到請求時,都會創建一個新的線程,然後調用

  service(ServletRequest,ServletResponse)方法。

service()方法將檢查HTTP請求的類型(GETPOST等)並調用相應的doGet()doPost()等方法。

5、銷燬和卸載Servlet 

Servlet容器決定不再需要Servlet實例,它將在Servlet實例上調用destroy()方法,在該方法中,Servlet應該釋放資源,如它在init()方法中獲得的數據庫連接。 

在調用destroy()方法之前,容器會等待其他執行Servletservice()方法的線程結束。 

如果Servlet容器關閉,它也將銷燬Servlet

5.1HTTP請求結構

 一個HTTP消息是客戶向服務器的請求或服務器向客戶的響應。 

1. HTTP消息組成:

初始行:指定請求或響應消息的目的  

頭部區 :指定元信息,如關於消息內容的大小、類型、編碼方式。 

空行 

可選的消息體 :請求或響應消息的主要內容。

5.2、客戶向服務器發出的 HTTP 消息叫做HTTP請求(HTTP request)。

下面是一個典型的POST請求:、

請求行    POST /bookstore/selectBook HTTP/1.1

      Accept = */*

         Accept-Language = zh-cn

         Accept-Encoding = gzip, deflate

請求頭   User-Agent = Mozilla/4.0 (compatible; MSIE 6.0;

           Windows NT 5.1; 

         Host = localhost:8080

         Connection = Keep-Alive

空行

數據         name=Java+EE

1.請求行

HTTP 請求行由三部分組成,且由空格分隔: 

方法名 

請求的資源的局部路徑 (URI) 

使用的 HTTP 的版本   

示例:

POST  /bookstore/selectBook  HTTP 1.1

這裏,POST 是方法名, /bookstore/selectBook是資源的 URIHTTP/1.1 是請求的 HTTP 的版本。

2.請求頭

請求行之後的頭行稱爲請求頭

它可以指定

請求使用的瀏覽器信息

字符編碼信息

客戶能處理的頁面類型等。 

示例:

User-Agent: = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; 

Content-Type:application/x-www-form-urlencoded

Content-Length:11

3.常用的請求方法

HTTP 1.1版本共定義了8個方法 

GET:請求讀取一個Web頁面 

POST:請求向服務器發送數據 

PUT :請求存儲一個Web頁面 

HEAD :請求讀取一個Web頁面的頭部 

DELETE :移除Web頁面

TRACE :返回收到的請求 

OPTIONS :查詢特定選項 

CONNECT :保留作將來使用

4.GET方法和POST方法

GET方法用來檢索資源。它的含義是“獲得(get)由該URI標識的資源”。 

資源通常是被動資源。 

GET也可以用來請求主動資源。 

傳遞一個名爲userid參數的請求行。 

HTTP方法                              查詢串          HTTP版本

GET /servlet/helloServlet ? userid=john  HTTP/1.1

 

                     URL

查詢串(query string),它是由&符號分開的參數名和參數值對組成的,如下所示:

 name1=value1&name2=value2&&nameM=valueM 

POST方法 

POST請求用來向服務器發送需要處理的數據

POST含義是“將數據發送到由該URI標識的主動資源”。

數據塊在消息體中發送。

常常在請求頭中還要給出額外的行,如Content-TypeContent-Length。 

HTML頁面使用POST提交HTML FORM數據。

表單提交所產生的HTTP POST請求 

GET方法

資源類型 :主動的或被動的 

數據類型 :文本 

數據量 :最多255個字符。儘管HTTP協議並沒有限制查詢串的長度,某些瀏覽器和web服務器可能不能處理超過255個字符的數據。 

可見性 :數據是URL的一部分,在瀏覽器的URL地址欄中用戶可見。 

緩存 :數據可以在瀏覽器的URL歷史中緩存。

POST方法

目標資源類型 :主動的

數據類型 :文本或二進制數據  

數據量 :沒有限制 。 

可見性 :數據不是URL的一部分而是作爲請求的消息體發送,因此在瀏覽器的URL地址欄中對用戶不可見。 。 

緩存 :數據不能在瀏覽器的URL歷史中緩存。

兩種方法的使用場合:

使用GET方法 

檢索HTML文件或圖像文件,因爲只需要發送文件名。 

使用POST方法 

發送大量數據。例如,POST方法非常適合於在線調查,因爲查詢字符串可能超過255個字符。  

上傳文件。因爲文件的大小可能超過255個字符,而且,文件也可能是二進制的文件。 

捕獲用戶名和口令。因爲我們需要防止用戶從URL中看到口令。

6、發送請求

發送請求的事件:

用戶在瀏覽器的地址欄中輸入URL並按回車鍵;

用戶在HTML頁面中點擊了超鏈接;

用戶在HTML頁面中添寫一個表單並提交;

其他 :用JavaScript函數在當前文檔上調用reload()方法。 

     在上面的所有事件中,缺省情況下瀏覽器使用的是HTTP GET方法。

指定POST方法:

下面的HTML表單通過method的屬性值使用HTTPPOST方法:

<form name=loginForm’ method=POST’ 

                    action='/loginServlet'>

<input type='text' name='userid'>

<input type='password' name='passwd'>

<input type='submit' name='loginButton' value='Login'>

</form> 

注意:在<form>標籤中如果沒有指定method屬性,瀏覽器缺省使用GET方法 

5.2、處理HTTP請求:

HttpServlet類中,對每個HTTP方法,都有一個相應的doXXX()方法,它具有下面一般格式:

protected void doXXX(HttpServletRequest, 

      HttpServletResponse)

 throws ServletException, IOException;

所有的doXXX()方法都有兩個參數:

HttpServletRequest對象

HttpServletResponse對象。

HTTP方法和doXxx()方法

HTTP方法        doXxx()方法  

GET 方法        doGet()方法

POST方法        doPost()方法

HEAD方法        doHead()方法

PUT方法        doPut()方法

DELETE方法          doDelete()方法

OPTIONS方法         doOptions()方法

TRACE方法           doTrace()方法

HttpServlet類中爲每個doXxx()方法提供的是空實現。爲實現業務邏輯,應該覆蓋這些doXxx()方法。

5.3、分析請求

1. 檢索請求參數 

請求參數是隨請求一起發送到服務器的數據,它是以名/值對的形式發送的。可以使用ServletRequest接口中定義的方法檢索由客戶發送的參數 

public String getParameter(String name) 

返回由name指定的請求參數值,如果指定的參數不存在,則返回null值。使用該方法必須確信指定的參數只有一個值。

public String[] getParameterValues(String name) 

返回指定的參數name所包含的所有值,返回一個String數組對象,如果指定的參數不存在,則返回null值。該方法適用於參數有多個值的情況。如果參數只有一個值,則返回的數組的長度爲1

public Enumeration getParameterNames() 

5.4、請求參數傳遞的方法

(1)通過表單提供請求參數。

2)將參數名和值附加在請求的URL後面,這種方法只適用於GET請求。

訪問LoginServlet使用的URL

http://localhost:8080/helloapp/login?username=admin&password=admin

問號後面內容爲請求參數名和請求參數值對,稱爲查詢串(query string

若有多個參數,中間用&符號分隔,參數名和參數值之間用等號(=)分隔。

(3)在超鏈接中也可以傳遞請求參數

例如:

<a href=/helloapp/login?username=admin&password=admin>用戶登錄</a>

jsp爲前綴的請求參數名都是保留的 

下面的用法會產生意想不到的結果,因此不推薦使用。

      http://localhost:8080/helloapp/login?jspTest=myTest

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