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請求的類型(GET、POST等)並調用相應的doGet()、doPost()等方法。
5、銷燬和卸載Servlet
當Servlet容器決定不再需要Servlet實例,它將在Servlet實例上調用destroy()方法,在該方法中,Servlet應該釋放資源,如它在init()方法中獲得的數據庫連接。
在調用destroy()方法之前,容器會等待其他執行Servlet的service()方法的線程結束。
如果Servlet容器關閉,它也將銷燬Servlet。
5.1、HTTP請求結構
一個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是資源的 URI,HTTP/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-Type與Content-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的屬性值使用HTTP的POST方法:
<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