Java大數據之路--Servlet

  • Servlet

目錄

Servlet

Servlet概述

實現Servlet

 Servlet繼承結構和運行過程

Servlet細節 


  • Servlet概述

1、Sun公司提供的一個動態資源開發的技術。Servlet本質就是一個java文件。需要先編譯後執行,並且需要存儲在servlet容器中。

2、servlet容器:存儲並運行servlet的環境稱之爲servlet容器,即 tomcat

3、web容器:存儲並運行web資源的環境稱之爲web容器。即 tomcat

  • 實現Servlet

(不使用IDE)

1、創建一個類,實現servlet接口,即可編程一個servlet文件。 

package cn.zyj;
import java.io.*;
import javax.servlet.*;
res.getWriter().write("hello servlet");
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{
}
public class FirstServlet extends GenericServlet{
}

2、將編譯後的文件放入classes目錄

a.打開cmd窗口,臨時引入環境變量 set classpath=%classpath%;[tomcat/lib下找到servlet-api拖動到cmd窗口] ,javac -d . FirstServlet.java。

b. 使用javac指令編譯FirstServlet.java

c.將編譯後的文件夾放入class目錄中

3、爲servlet添加配置文件。(web.xml)

<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>cn.tedu.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/FirstServlet</url-pattern>
</servlet-mapping>

(使用IDE太過容易不再贅述)

4、在Myeclipse中添加tomcat

 

5、通過Myeclipse的tomcat發佈web應用 

 

  •  Servlet繼承結構和運行過程

1、Servlet繼承結構

Servlet 基礎servlet接口 需要重寫全部方法 不適合廣泛使用

|

|-------GenericServlet 通用Servlet 關注service()

      |

      |-----HttpServlet HTTPServlet 在通用servlet基礎之上,添加了和HTTP協議相關的內容。更善於http協議相關開發

2. Servlet運行過程

a.HttpServletRequest 和HttpServletResponse兩個接口如何創建對象的?

雖然上述兩個接口定義了變量request,和response但是真正是實現對象創建的 應該是他們的兩個子實HttpServletRequestWrapper和 HttpServletResponseWrapper。

b.頁面中的靜態資源爲什麼可以被直接訪問?

頁面中的靜態資源和沒有人要的資源都會交給conf/web.xml裏的defaultServlet 來處理。defaultServlet也稱之爲缺省servlet。

地址欄中輸入的任何內容都會作爲虛擬路徑使用,書寫靜態資源名稱,如 (1.html)也是虛擬路徑,這個路徑如果沒有和url-pattern相匹配,則會交給 defaultServlet處理。

defaultServlet會先在靜態資源中作比對,如果有靜態資源名稱與之相同,則加 載顯示,如果沒有則會顯示404頁面。

  • Servlet細節 

1、Servlet細節一 

servlet組成:servlet標籤和servlet-mapping標籤,servlet標籤稱之爲註冊servlet標籤,servlet-mapping標籤稱之爲servlet映射標籤。 註冊servlet標籤中添加子標籤servlet-nameservlet-class,代表servlet的名稱和具 體包名類路徑。映射servlet標籤中添加子標籤servlet-nameurl-pattern

<servlet>

<servlet-name>FirstServlet</servlet-name>

<servlet-class>cn.tedu.FirstServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>FirstServlet</servlet-name>

<url-pattern>/servlet/FirstServlet</url-pattern>

</servlet-mapping>

之所以書寫成註冊和映射servlet兩部分,是因爲考慮以後可能有多個虛擬路徑同時映射到真實的servlet身上,以上形式只需要

書寫映射servlet標籤即可,相對來說,較爲簡單,同時servlet名稱不允許重複。

2、Servlet細節二

servlet虛擬路徑的通配形式--共兩種:i. "/"開頭,以"/*"結尾的通配形式。ii. "*.後綴"的通配形式。*.do

<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>cn.tedu.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
--------------------------------------------------------------
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>cn.tedu.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>*.do</url-patte

3、Servlet細節三-------通配路徑的優先級

虛擬路徑與通配路徑越相似的路徑越優先採用。

*.do永遠匹配級別最低。

4、Servlet細節四-------load-on-startup標籤

a.load-on-startup標籤可以書寫在註冊servlet標籤中。在load-on-startup標籤中間可以 添加一個數字,如果這個數字大於等於0,那麼當前servlet會隨着web應用的啓動 而加載。如果數字小於0,則servlet不會隨着web應用的啓動而加載,仍然需要訪 問之後纔會創建對象完成初始化。

b. 注意:load-on-startup標籤中的數字表示優先級,數字越小,優先級越高,越優先 啓動。

注意:load-on-startup,在服務器啓動的時候會創建並初始化servlet對象,並不會請求servlet對象。

5、Servlet細節五------缺省servlet

在conf/web.xml中包含一個缺省servlet(defaultServlet),會隨着tomcat服務器的啓動而加載,負責所有web應用靜態資源的加載,如果用戶訪問的資源路徑不存 在或者服務器報錯,都會交給缺省servlet來處理。 缺省servlet的url-pattern配置爲一個"/"

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

"/"爲缺省servlet特有的虛擬路徑形式,任何一個servlet如果配置虛擬路徑爲"/", 那麼當前servlet都會作爲缺省Servlet進行工作。

問題:"/"和"/*"意義上的區別:

i. "/"是缺省servlet的虛擬路徑,一旦servlet配置這個虛擬路徑,則會作爲缺省 servlet使用,負責靜態資源和沒人要的資源加載。

ii. "/*"是通配的虛擬路徑形式,表示在*號的位置輸入任意的內容都會與當前的路徑匹配,所有的路徑都會使用/*來通配,使用對應的servlet顯示結果。

6、Servlet細節六----------線程安全問題

當多個客戶端併發訪問同一個Servlet時,web服務器會爲每一個客戶端的訪問請求創建一 個線程,並在這個線程上調用Servlet的service方法,因此service方法內如果訪問了同一個資源的話,就有可能引發線程安全問題。

解決方案:

a.多使用局部變量,少使用成員變量和靜態變量。因爲成員變量和靜態變量都會引發線程安全問題。

b.合理加鎖。鎖一定要鎖住關鍵部分代碼,否則會降低代碼的執行效率。

7、Servlet細節七--------Servlet運行過程及生命週期

a>Servlet運行過程

①通過hosts文件或域名解析器,將域名解析爲一個ip地址,找到對應的服務器,再通過端口號確定是哪一個服務器。

②通過Host請求確定是當前服務器的哪一臺虛擬主機。

③通過請求行的請求資源名稱部分,確定是哪一個web應用的虛擬路徑。

④通過請求行的請求資源名稱部分,確定是當前web應用的哪一個web資源的虛擬路徑,再使用web資源的虛擬路徑與web.xml文件中的url-patter作比較,確定是哪一個真是的servlet文件。

⑤servlet返回的結果會放在response緩衝區中,在服務器內組織成一定結構之後,在發送給瀏覽器展示。

b>Servlet的生命週期

在servlet被初次訪問時,會創建一個對象駐留在tomcat內存中。這個對象會重複使用。在對象創建之後,會立刻調用init方法完成初始化操作。每一次訪問servlet都會導致service方法執行,提供服務。在web應用被移除容器或者服務器關閉情況下,servlet對象會被銷燬,在銷燬之前那會自動調用destroy方法完成一些善後操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章