1 <!-- 配置一個servlet --> 2 <!-- servlet的配置 --> 3 <servlet> 4 <!-- servlet的內部名稱,自定義。儘可能有意義 --> 5 <servlet-name>FirstServlet</servlet-name> 6 <!-- servlet的類全名: 包名+簡單類名 --> 7 <servlet-class>com.nick.FirstServlet</servlet-class> 8 </servlet> 9 10 11 <!-- servlet的映射配置 --> 12 <servlet-mapping> 13 <!-- servlet的內部名稱,必定要和上面的內部名稱保持一致!! --> 14 <servlet-name>FirstServlet</servlet-name> 15 <!-- servlet的映射路徑(訪問servlet的名稱) --> 16 <url-pattern>/first</url-pattern> 17 </servlet-mapping>
tomcat啓動時,首先加載webapps中的每一個web應用的web.xml配置文件,並根據web.xml配置文件中的信息來完成對應servlet類對象的建立。html
建立流程以下:java
(1)tomcat在web.xml中查找是否存在與請求URL匹配的url-pattern的內容web
(2)若是存在,就去servlet標籤下查找具備相同servlet-name的servlet-class標籤,並經過反射機制來完成servlet類的建立。若是不存在就去加載tomcat中的defaultServlet類,defaultServelt會在應用的根目錄下查找是否存在index.html的靜態文件,若是存在就讀取文件內容返回給瀏覽器。若是不存在則返回404錯誤頁面。瀏覽器
servlet的映射路徑--<url-pattern>映射路徑</url-pattern>tomcat
映射路徑分類兩種類型:精確匹配和模糊匹配。安全
精確匹配:如服務器
/first: http://localhost:8080/FirstServlet/first多線程
/first/demo :http://localhost:8080/FirstServlet/first/demo併發
模糊匹配:如app
/*:http://localhost:8080/FirstServlet/任意路徑
/first/*:http://localhost:8080/FirstServlet/first/任意路徑
*.後綴名:http://localhost:8080/day10/任意路徑.後綴名
注意事項:
1)url-pattern要麼以 / 開頭,要麼以*開頭。
2)不能同時使用兩種模糊匹配,例如 /first/*.do是非法路徑
3)當有輸入的URL有多個servlet同時被匹配的狀況下:
3.1 精確匹配優先。(長的最像優先被匹配)
3.2 之後綴名結尾的模糊url-pattern優先級最低!!!
servlet的缺省路徑:
servlet的缺省路徑(<url-pattern>/</url-pattern>)是在tomcat服務器內置的一個路徑。該路徑對應的是一個DefaultServlet(缺省Servlet)。這個缺省的Servlet的做用是用於解析web應用的靜態資源文件。
servlet類的聲明週期
(1)四個生命週期函數
構造方法: 建立servlet對象的時候調用。默認狀況下,第一次訪問servlet的時候建立servlet對象只調用1次。servlet對象在tomcat是單實例的。
init方法: 建立完servlet對象的時候調用。只調用1次。--public void init(ServletConfig config);
service方法: 每次發出請求時調用。調用n次。--public void service(ServletRequest req, ServletResponse res);
destroy方法: 銷燬servlet對象的時候調用。中止服務器或者從新部署web應用時銷燬servlet對象。只調用1次。--public void destroy();
(2)應用的生命週期時序圖
servlet自動加載
默認狀況下,第一次訪問servlet的時候建立servlet對象。若是servlet的構造方法或init方法中執行了比較多的邏輯代碼,那麼致使用戶第一次訪問sevrlet的時候比較慢。經過在servlet的web.xml配置信息中,加上一個<load-on-startup>1</load-on-startup>來改變servlet對象在web應用加載的時候就進行建立。
配置示例以下:
<servlet> <servlet-name>LifeDemo</servlet-name> <servlet-class>com.nick.LifeDemo</servlet-class> <!-- 讓servlet對象自動加載 --> <load-on-startup>1</load-on-startup> 注意: 整數值越大,建立優先級越低!! </servlet>
注意:在啓動servlet的時候進行的邏輯處理應該重寫無參的init方法中寫,而不用有參的init方法。
servlet線程安全問題
servlet對象在tomcat服務器是單實例多線程的。當多個線程同時訪問共享資源的時候,如成員變量等就匯引起線程安全問題。
解決辦法:
1)把使用到共享數據的代碼塊進行同步(使用synchronized關鍵字進行同步)。
2)建議在servlet類中儘可能不要使用成員變量。若是確實要使用成員,必須同步。並且儘可能縮小同步代碼塊的範圍。(哪裏使用到了成員變量,就同步哪裏!!),以免由於同步而致使併發效率下降。
servlet中的對象
(1)HttpServletRequest
(2)HttpServletResponse
(3)ServletConfig
(4)ServletContext
其中HttpServletRequest和HttpServletResponse對象的使用在上一篇博客有介紹,下面主要來看一下ServletConfig和ServletContext對象。
ServletConfig對象
做用:主要是用於加載servlet的初始化參數。在一個web應用能夠存在多個ServletConfig對象(一個Servlet對應一個ServletConfig對象)。
web應用servlet初始化參數的配置方式:在web.xml中對應的<servlet></servlet>標籤下添加初始化參數,配置示例以下:
1 <servlet> 2 <servlet-name>ConfigDemo</servlet-name> 3 <servlet-class>com.nick.ConfigDemo</servlet-class> 4 <!-- 初始參數: 這些參數會在加載web應用的時候,封裝到ServletConfig對象中 --> 5 <init-param> 6 <param-name>path</param-name> 7 <param-value>e:/b.txt</param-value> 8 </init-param> 9 </servlet>
獲取servletConfig的API:
ServletConfig getServletConfig()
servletConfig經常使用API:
java.lang.String getInitParameter(java.lang.String name) 根據參數名獲取參數值
java.util.Enumeration getInitParameterNames() 獲取全部參數
ServletContext getServletContext() 獲得servlet上下文對象
java.lang.String getServletName() 獲得servlet的名稱
servletContext對象
ServletContext對象 ,叫作Servlet的上下文對象。表示一個當前的web應用環境。一個web應用中只有一個ServletContext對象。
servletContext對象的核心API:
java.lang.String getContextPath() --獲得當前web應用的路徑
java.lang.String getInitParameter(java.lang.String name) --獲得web應用的初始化參數java.util.Enumeration getInitParameterNames()
void setAttribute(java.lang.String name, java.lang.Object object) --域對象有關的方法java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
RequestDispatcher getRequestDispatcher(java.lang.String path) --轉發(相似於重定向)
java.lang.String getRealPath(java.lang.String path) --獲得web應用的資源文件java.io.InputStream getResourceAsStream(java.lang.String path)
(1) 獲取web應用路徑(其實就是項目的名稱)--經常使用於重定位時,代碼以下:
(2) 獲得web應用的初始化參數
在web.xml中配置web應用參數代碼以下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 8 <!-- 配置web應用參數 --> 9 <context-param> 10 <param-name>AAA</param-name> 11 <param-value>AAA's value</param-value> 12 </context-param> 13 <context-param> 14 <param-name>BBB</param-name> 15 <param-value>BBB's value</param-value> 16 </context-param> 17 <context-param> 18 <param-name>CCC</param-name> 19 <param-value>CCC's value</param-value> 20 </context-param> 21 22 </web-app>
注意:
(1)web應用參數可讓當前web應用的全部servlet獲取。
(2) web應用的參數放在<web-app>標籤的第一層,每一個<context-param></context-param>就是一個web應用的參數。
獲取web應用的代碼示例以下:
(3) 域對象
域對象的做用:用於保存數據,獲取數據。能夠在不一樣的動態資源之間共享數據。
常見的域對象:
HttpServletRequet 域對象
ServletContext域對象
HttpSession 域對象
PageContext域對象
ServletContext做爲域對象的使用代碼示例以下:
保存對象的java類:
ServletContext做爲域對象保存數據
ServletContext做爲域對象獲取數據
注意:ServletContext域對象的做用於爲整個web工程。
(4) 轉發
一個web資源收到客戶端請求後,通知服務器去調用另一個web資源進行處理,稱之爲請求轉發。
一個web資源收到客戶端請求後,通知瀏覽器去訪問另一個web資源,稱之爲請求重定向。
轉發的代碼示例以下:
轉發和重定向的區別:
1)轉發
a)地址欄不會改變。
b)轉發只能轉發到當前web應用內的資源。
c)能夠在轉發過程當中,能夠把數據保存到request域對象中。
2)重定向
a)地址欄會改變,變成重定向到地址。
b)重定向能夠跳轉到當前web應用,或其餘web應用,甚至是外部域名網站。
c)不能在重定向的過程,把數據保存到request中。
(5) 獲得web應用中的資源文件
web應用中用到路徑先寫上/。
.:表明java命令行目錄,即tomcat/bin目錄。
使用ServletContext加載資源文件的方法示例以下: