1. 程式人生 > >JavaWeb學習筆記(四)——Servlet開發

JavaWeb學習筆記(四)——Servlet開發

一、Servllet是sun公司提供的一門用於開發動態web資源的技術

簡單來說,Servlet是實現了servlet介面的java程式

二、servlet的執行過程

Servlet程式是由web伺服器呼叫,web伺服器收到客戶端的servlet訪問請求後:

1)web伺服器首先檢查是否已經裝載並建立了該servlet的例項,如果是,直接第4步;否則,執行第2步;

2)裝載並建立該Servlet的一個例項物件;

3)呼叫servlet例項物件的init()方法;

4)建立一個用於封裝http請求訊息的httpServletRequest物件和一個代表httpServletResponse物件,然後呼叫servlet的service()方法並將請求和響應物件作為引數傳遞進去

5)web應用程式被停止或重新啟動之前,servlet引擎將解除安裝servlet,並在解除安裝之前呼叫servlet的destroy方法。

三、Eclispe開發servlet

Servlet介面有兩個預設實現類,分別為:GenericServlet、HttpServlet

HttpServlet指能夠處理HTTP請求的servelt,開發人員通常繼承這個類而避免直接去實現;HttpServlet實現介面時覆寫了service方法,該方法會自動判斷使用者的請求方式,自動呼叫對應的get/post方法,因此開發在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不需要去覆寫service方法

1、通過Eclipse建立Servlet

老版本建立Servlet時可以生成web.xml用於servlet的mapping,但是在Servlet3.0新特性(得Tomcat7.0版本及以上),@WebServlet 用於將一個類宣告為 Servlet,不用生成web.xml

解決方法:

1)可以在@WebServlet後面的括號裡定義Servlet的name、urlPatterns等資訊;

2)在新建Servlet的URL mapping中輸入

2、關於servlet的URL對映

servlet程式要想被外界訪問,就要對映到一個URL地址上,這個工作在web.xml中用<servlet>和<servlet mapping>完成。

<servlet>元素用於註冊Servlet,包含兩個子元素:<servlet-name>和<servlet-class>,分別用於註冊名稱和servlet的完整類名;

<servlet mapping>用於對映一個已註冊的servlet對外訪問路徑,包含兩個子元素:<servlet-name>和<url-pattern>,分別用於指定servlet的註冊名稱和servlet的對外訪問路徑。

同一個servlet可以被對映到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設定值可以是同一個servlet的註冊名

3、servlet訪問URL使用*萬用字元對映

在servlet對映的URL中也可以使用*萬用字元,但是隻能有兩種固定的格式:一種是“*.副檔名”,另一種是以正斜槓/開頭並以“/*”結尾;匹配的原則是“誰長得更像就找誰”。

4、servlet與普通java類的區別

servlet是一個供其他java程式(servlet引擎)呼叫的java類,它不能獨立執行,它的執行完全由servlet引擎來控制和排程。

針對客戶端的多次Servlet請求,通常情況下,伺服器只會建立一個servlet例項物件,即servlet例項物件一旦建立就會駐留在記憶體中,為後續請求服務,直至web容器退出,servlet例項物件才會銷燬。

在servlet的生命週期內,servlet的init方法只調用一次,而對一個servlet的每次訪問請求都導致servlet引擎呼叫一次servlet的service方法。對於每次訪問請求,servlet引擎都會建立一個新的HttpServletRequest請求物件和一個新的HttpServletResponse響應物件,然後將這兩個物件作為引數傳遞給它呼叫的servlet的service方法,service方法再根據請求方式分別呼叫doXXX方法。

如果在<servlet>元素中配置了一個<load-on-startup>元素,那麼web應用程式在啟動時,就會裝載並建立servlet的例項物件以及呼叫servlet例項物件的init()方法。

5、預設Servlet

如果某個servlet的對映路徑僅僅為一個正斜槓/,那麼這個servlet就成為當前web應用程式的預設的servlet。

凡是在web.xml檔案中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給預設Servlet處理即處理其他servlet都不處理的訪問請求。

在tomcat的安裝目錄下的conf/web.xml中,註冊了一個預設的預設servlet為org.apache.catalina.servlets.DefaultServlet

6、servlet的執行緒安全問題

當多個客戶端併發訪問同一個servlet時,web伺服器會為每一個客戶端的訪問請求建立一個執行緒,並在這個執行緒上呼叫servlet的service方法,因此service方法如果訪問了同一個資源的話,就有可能引發執行緒安全問題。

執行緒安全問題只存在多個執行緒併發操作同一個資源的情況下,一般的解決的操作是通過synchronize給servlet物件加鎖,保證任何時候都只有一個執行緒在訪問該servlet物件裡的資源。

這種做法雖然解決了執行緒安全問題,但是編寫servlet不能使用這種方式處理執行緒安全問題,因為假如有999人同時訪問這個servlet,那麼他們必須按先後順序輪流訪問。

針對該問題sun公司的解決方案:讓servlet去實現一個singleThreadModel介面,如果某個servlet實現了singleThreadModel介面,那麼servlet引擎將以單執行緒模式來呼叫其service方法。對於實現了singleThreadModel介面的servlet,servlet引擎仍然支援對該servlet的多執行緒併發訪問,其採用的方式是產生多個servlet例項物件,併發的每個執行緒分別呼叫一個獨立的servlet例項物件。但實現singleThreadModel介面並不能真正解決servlet的執行緒安全問題,因為servlet引擎會建立多個servlet例項,真正意義上的解決多執行緒安全問題是指一個servlet例項物件被多個執行緒同時呼叫的問題。

四、servletConfig講解

1、配置servlet初始化引數

在servlet的配置檔案web.xml中,可以使用一個或多個<init-param>標籤為servlet配置一些初始化引數

2、通過servletConfig獲取servlet的初始化引數

當servlet配置了初始化引數,web容器在建立servlet例項物件時,會自動將這些初始化引數封裝到servletConfig物件中,並在呼叫servlet的init方法時,將servletConfig物件傳遞給servlet。所以我們通過servletConfig物件就可以得到當前的servlet的初始化引數資訊

五、ServletContext物件

web容器在啟動時,會為每個web應用程式都建立一個對應的servletContext物件,代表當前web應用。

ServletConfig物件中維護了ServletContext物件的引用,可通過ServletConfig.getServletContext方法獲得ServletContext物件。

由於一個web應用中的所有Servlet共享一個ServletContext物件,因此Servlet物件之間可以通過ServletContext物件來實現通訊。ServletContext物件通常也稱之為context域物件。

1)多個servlet通過servletContext物件實現資料共享

eg.Demo1和Demo2通過ServletContext物件實現資料共享

2)獲取web應用的初始化引數

在web.xml檔案中使用<context-param>標籤配置web應用的初始化引數

3)用servletContext實現請求轉發

訪問某個頁面,瀏覽器顯示的卻是其他頁面的內容,就是請求轉發

4)利用servletContext物件讀取資原始檔

六、在客戶端快取servlet的輸出

一般在瀏覽器安裝目錄的快取資料夾中%appdata%\..\Local\Google\Chrome\User Data\Default\Cache