-
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-name和servlet-class,代表servlet的名稱和具 體包名類路徑。映射servlet標籤中添加子標籤servlet-name和url-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方法完成一些善後操作。