Servlet的生命週期
API
init()
實例化對象 初始化Servlet
-僅調用一次
-常用於數據庫連接
service()
響應客戶端請求,通過response對象修改客戶端內容
-可執行多次
-創建代表請求的request對象
-創建代表響應的response對象
-請求結束後對象會自動銷燬
destory()
Servlet對象被摧毀後執行的方法
-servlet對象一旦創建就會駐留內存
直到web容器(如tomcat)的退出
-常用於數據庫的釋放
HttpServlet
HttpServlet是GenericServlet的子類,複寫了service()方法,會判斷http的請求方式,然後執行doget()或dopost()方法或其他方法doxxx(),因而不用去直接重寫service()方法,而是使用doxxx()方法。
HttpServlet和GenericServlet的不同
GenericServlet是個抽象類,必須給出子類才能實例化。它給出了設計servlet的一些骨架,定義了servlet生命週期,還有一些得到名字、配置、初始化參數的方法,其設計的是和應用層協議無關的,也就是說 你有可能用非http協議實現它。
HttpServlet是GenericServlet的子類,當然就具有GenericServlet的一切特性,還添加了doGet, doPost, doDelete, doPut, doTrace等方法對應處理http協議裏的命令的請求響應過程。
關於mapping:
同一個servlet可以被多個地址映射,即:
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/s</url-pattern>
</servlet-mapping>
中的<url-pattern>/s</url-pattern>
地址映射可以是多個
缺省Servlet
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
/ 則該Servlet定義爲web應用程序的缺省
Mapping找不到的Servlet會自動使用此Servlet,
此時所有的靜態web資源都無法訪問到
-服務器會默認配置一個缺省Servlet,最好不要配置缺省servlet
*通配符的使用:
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
/*則可以匹配所有地址
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
*.html則可以匹配web應用下各種html
<load-on-startup>
標籤
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.lemon.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<load-on-startup>
標籤會使得該Servlet的init()在web應用創建伊始就執行 而不是請求servlet時才執行init()
-標籤中數字的大小是啓動順序,越小啓動越早
-Servletd的線程安全:
SingleThreadModel 標記接口
實現了該接口的Servlet會使用單例訪問方式,避免資源衝突訪問