Servlet生命週期
1.生命週期表示一個java對象從最初被創建到最終被銷燬,經歷的所有過程。
2.Servlet對象的生命週期
Servlet對象的生命週期,javaweb程序員是無權干涉的,包括Servlet對象相關方法的調用,都是無權干涉的
Servlet對象從最初的創建,方法的調用,以及對象的銷燬,整個過程,都是由web容器來管理的。
Web Container管理Servlet對象的生命週期。
3.“默認情況下”,Servlet對象在對象在WEB服務器啓動階段不會被實例化【想要啓動時實例化,需要特殊配置web.xml】
4.描述Servlet對象生命週期
1) 用戶在瀏覽器地址欄上輸入URL: http://localhost:8080/prj_servlet_01_war_exploded/hello
2) WEB容器截取請求路徑 /prj_servlet_01_war_exploded/hello
3)WEB容器在容器上下文中找請求路徑 /prj_servlet_01_war_exploded/hello 對應的Servlet對象
4)若沒有找到對應的Servlet對象-(沒找到9中的容器,找10中的容器)
4.1) 通過web.xml文件中相關的配置信息,得到請求路徑/hello 對應的Servlet完整類名
4.2)通過反射機制,調用Servlet類的無參構造方法完成Servlet對象的實例化
4.3)web容器調用Servlet對象的init()方法完成初始化操作
4.4)web容器調用Servlet對象的service()方法提供服務
5)若找到對應的Servlet對象-(找到9中的容器)
5.1)web容器直接調用Servlet對象的service()方法提供服務
6) web容器關閉的時候/webapp重新部署的時候/該Servlet對象長時間沒有用戶再次訪問的時候
web容器會將該Servlet對象銷燬,在銷燬該對象之前,web容器會調用Servlet對象的destroy方法,
完成銷燬之前的準備
5.總結
5.1 Servlet類的構造方法只執行一次
5.2 Servlet對象的init方法只執行一次
5.3 Servlet對象的service方法,只要用戶請求一次,則執行一次
5.4 Servlet對象的destroy方法只執行一次
6.注意
init方法執行的時候,Servlet對象已經被創建好了。
destroy方法執行的時候,Servlet對象還沒有被銷燬,即將被銷燬
7.Servlet對象是單例,但是不符合單例設計模式,只能稱爲僞裝單例
單例模式的構造方法是私有化的
所以Servlet對象是在單實例多線程的環境下運行的。 那麼Servlet對象中若有實例變量,
並且實例變量涉及到修改操作,Servlet對象一定會存在線程安全問題,
所以不建議在Servlet對象中使用實例變量,儘量使用局部變量
8.在服務器啓動階段,實例化Servlet對象,需要在web.xml文件中進行相關的配置,例如:
1//"1"表示運行的優先級,0最高
9.Servlet對象實例化後
大多數的WEB容器都是將Servlet對象以及對應的url-pattern存儲到MAp集合中了
WEB容器中有這樣一個Map集合
Map<String,Servlet>集合
key value
----------------
/login LoginServlet對象引用
/delete DeleteServlet對象調用
/save SaveServlet對象引用
10.服務器在啓動的時候會解析各個webapp的web.xml文件
將web.xml文件中的url-pattern和對應Servlet完整類名存儲到Map集合中了
在Web容器中有這樣一個Map集合
Map<String,String>集合
key value
----------------
/login com.chif.loginServlet
/delete com.chif.deleteServlet
/save com.chif.saveServlet
8. Servlet3.0
*好處:支持註解配置,可以不寫web.xml
*步驟:
1.創建項目,選擇Servlet3.0以上的版本。
2.定義一個Servlet類。
3.複寫方法
4.在類上使用@webServlet註解,進行配置
@webServlet("資源路徑")