1 如何開發一個Servlet(重點)
1.1 步驟:
1)編寫java類,繼承HttpServlet類
2)重新doGet和doPost方法
3)Servlet程序交給tomcat服務器運行!!
3.1 servlet程序的class碼拷貝到WEB-INF/classes目錄
3.2 在web.xml文件中進行配置
<!--配置一個servlet-->
<!--servlet的配置-->
<servlet>
?<!--servlet的內部名稱,自定義,盡量有意義-->
<servlet-name>FirstServlet<servlet-name>
<!--servlet的類全名:包名+簡單類名-->
</servlet>
<!--servlet的映射配置-->
<servlet-mapping>
<!--servlet的內部名稱,一定要和上面的內部名稱保持一致!!-->
<servlet-name>FirstServlet</servlet-name>
<!--servlet的映射路徑(訪問servlet的名稱)
<url-pattern>/first</url-pattern>
</servlet-mapping>
訪問次URL:? http://localhost:8080/day10/first 即可
前提: tomcat服務器啟動時,首先加載webapps中的每個web應用的web.xml配置文件。
http://: http協議
localhost: 到本地的hosts文件中查找是否存在該域名對應的IP地址
127.0.0.1
8080:? ? 找到tomcat服務器
/day10? ? 在tomcat的webapps目錄下找 day10的目錄
/first? ? 資源名稱。
1)在day10的web.xml中查找是否有匹配的url-pattern的內容(/first)
2)如果找到匹配的url-pattern,則使用當前servlet-name的名稱到web.xml文件中查詢是否相同名稱的servlet配置
3)如果找到,則取出對應的servlet配置信息中的servlet-class內容:
字符串: gz.itcast.a_servlet.FirstServlet
通過反射:
a)構造FirstServlet的對象
b)然后調用FirstServlet里面的方法
精確匹配? ? ? ? ? ? /first? ? ? ? ? ? ? ? http://localhost:8080/day10/first
模糊匹配? ? ? ? ? ? /*? ? ? ? ? ? ? ? ? http://localhost:8080/day10/任意路徑
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *.do? ? ? ? ? ? ? ? http://localhost:8080/day10/任意路徑.do
? ? ? ? ? ? ? ? ? ? ? ? ? ? *.action? ? ? ? http://localhost:8080/day10/任意路徑.action
注意:1)url-pattern要么以 / 開頭,要么以*開頭。 例如, itcast是非法路徑。、
2)不能同時使用兩種模糊匹配,例如 /itcast/*.do是非法路徑
3)當有輸入的URL有多個servlet同時被匹配的情況下:
3.1 精確匹配優先。(長的最像優先被匹配)
3.2 以后綴名結尾的模糊url-pattern優先級最低!!!
3 servlet缺省路徑servlet的缺省路徑
servlet的缺省路徑(<url-pattern>/</url-pattern>)是在tomcat服務器內置的一個路徑。該路徑對應的是一個DefaultServlet(缺省Servlet)。這個缺省的Servlet的作用是用于解析web應用的靜態資源文件。
問題: URL輸入http://localhost:8080/day10/index.html 如何讀取文件????
1)到當前day10應用下的web.xml文件查找是否有匹配的url-pattern。
2)如果沒有匹配的url-pattern,則交給tomcat的內置的DefaultServlet處理
3)DefaultServlet程序到day10應用的根目錄下查找是存在一個名稱為index.html的靜態文件。
4)如果找到該文件,則讀取該文件內容,返回給瀏覽器。
5)如果找不到該文件,則返回404錯誤頁面。
結論: 先找動態資源,再找靜態資源。
4 Sevlet的生命周期(重點)
Servlet程序的生命周期由tomcat服務器控制的!!!
構造方法: 創建servlet對象的時候調用。默認情況下,第一次訪問servlet的時候創建servlet對象 只調用1次。證明servlet對象在tomcat是單實例的。
init方法: 創建完servlet對象的時候調用。只調用1次。
service方法: 每次發出請求時調用。調用n次。
destroy方法: 銷毀servlet對象的時候調用。停止服務器或者重新部署web應用時銷毀servlet對象。只調用1次
2. 偽代碼演示servlet的生命周期(重點)
Tomtcat內部代碼運行:
1)通過映射找到到servlet-class的內容,字符串: gz.itcast.a_servlet.FirstServlet
2)通過反射構造FirstServlet對象
2.1 得到字節碼對象
Class clazz = class.forName("gz.itcast.a_servlet.FirstServlet");
2.2 調用無參數的構造方法來構造對象
Object obj = clazz.newInstance();? ? ---1.servlet的構造方法被調用
3)創建ServletConfig對象,通過反射調用init方法
3.1 得到方法對象
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
3.2 調用方法
m.invoke(obj,config);? ? ? ? ? ? --2.servlet的init方法被調用
4)創建request,response對象,通過反射調用service方法
4.1 得到方法對象
Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
4.2 調用方法
m.invoke(obj,request,response);? --3.servlet的service方法被調用
5)當tomcat服務器停止或web應用重新部署,通過反射調用destroy方法
5.1 得到方法對象
Method m = clazz.getDeclareMethod("destroy",null);
3. Servlet的自動加載?默認情況下,第一次訪問servlet的時候創建servlet對象。如果servlet的構造方法或init方法中執行了比較多的邏輯代碼,那么導致用戶第一次訪問sevrlet的時候比較慢。改變servlet創建對象的時機: 提前到加載web應用的時候!!!在servlet的配置信息中,加上一個即可!!(了解)
<load-on-startup>1<load-on-startup>注意: 整數值越大,創建優先級越低!!
4.Servlet的多線程并發問題(了解)
注意: servlet對象在tomcat服務器是單實例多線程的。
因為servlet是多線程的,所以當多個servlet的線程同時訪問了servlet的共享數據,如成員變量,可能會引發線程安全問題。
解決辦法:
1)把使用到共享數據的代碼塊進行同步(使用synchronized關鍵字進行同步)
2)建議在servlet類中盡量不要使用成員變量。如果確實要使用成員,必須同步。而且盡量縮小同步代碼塊的范圍。(哪里使用到了成員變量,就同步哪里!!),以避免因為同步而導致并發效率降低。
Servlet學習:
HttpServletRequest? 請求對象:獲取請求信息
HttpServletResponse 響應對象: 設置響應對象
ServletConfig對象? ? servlet配置對象
ServletContext對象; servlet的上下文對象
5 ServletConfig對象(重點)
作用:ServletConfig對象: 主要是用于加載servlet的初始化參數。在一個web應用可以存在多個ServletConfig對象(一個Servlet對應一個ServletConfig對象)
5.2 對象創建和得到
創建時機: 在創建完servlet對象之后,在調用init方法之前創建。
得到對象: 直接從有參數的init方法中得到!!!
9.3 servlet的初始化參數配置
<servlet>
<servlet-name>FirstName</servlet-name>
<servlet-class>boomin.類名 <servlet-class>
!-- 初始參數: 這些參數會在加載web應用的時候,封裝到ServletConfig對象中 --
<init-param>
<param-name>path < param-name>
<param-value>e:/b.txt</ param-value>
</init-param>
<servlet>
注意: servlet的參數只能由當前的這個sevlet獲取!!!!
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對象。
10.2 對象創建和得到
創建時機:加載web應用時創建ServletContext對象。
得到對象: 從ServletConfig對象的getServletContext方法得到