Servlet的執行流程
1. 從瀏覽器輸入地址(發起請求)開始分析: http://localhost:80/xx/hello
- localhost 也可能是ip 或者域名 ---》定位服務器主機
- 80 定位到tomcat
- xx 上下文路徑,tomcat/conf/server.xml 中的
<Context docBase=”F:\workspace\day11-servlet\webapp” path=”xx” /> 中的path
通過上面的步驟找到了 docBase後面的項目的真實路徑
根據約定去找到項目中的配置文件 web.xml
2. web.xml內容分析:
- 找到url-pattern的值爲 /hello
- 通過上一步中對應servlet-name 找到對應的servlet標籤
- 找到對應的Servlet的全限定類名(包名+類名), com.gs.controller.HelloServlet
僅僅是一個字符串而已,交給Tomcat進行處理, 並通過反射來創建對象並調用方法
3. Tomcat對Servlet的創建:
- 通過上獲得 servlet的完全限定名爲參數使用反射來創建一個對象
Class clz = Class.forName(“com.gs.controller.HelloServlet”)
Clz.newInstance() 要求自己的Servlet類必須有公共的無參數的構造方法,否則會包NoSuchMethodException異常
2.如果是第一次訪問,就會創建一個Servlet的對象,並緩存起來
3. 如果是第二次訪問 (或者 n 次訪問) 直接先從緩存中看有沒有,有直接使用調用service方法
<welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <!-- 給servlet可以任意取名,一般類名相同 --> <servlet-name>HelloServlet</servlet-name> <!-- servlet的全限定類名,也就是servlet的位置 --> <servlet-class>com.gs.controller.HelloServlet</servlet-class> </servlet> <servlet-mapping> <!-- 跟上面的servlet名字相同 --> <servlet-name>HelloServlet</servlet-name> <!-- 瀏覽器通過該url找到servlet,斜槓別丟 --> <url-pattern>/helloServlet</url-pattern> </servlet-mapping>
Servlet的生命週期
javax.servlet.Servlet接口中的方法:
public void init(ServletConfig config): 初始化方法
public void service(ServletRequest req, ServletResponse res):服務方法
public void destroy():銷燬方法
public ServletConfig getServletConfig():返回當前Servlet的配置信息對象.
public String getServletInfo():該方法返回Servlet的信息(作者,版權等).
--------------------------------------------------------------------
Servlet的生命週期方法:
public void init(ServletConfig config):初始化方法,在第一次請求時調用,只在最初的時候調用一次.
public void service(ServletRequest req, ServletResponse res):服務方法
public void destroy():銷燬方法
Servlet生命週期可分爲5個步驟
- 加載Servlet。當Tomcat第一次訪問Servlet的時候,Tomcat會負責創建Servlet的實例
- 初始化。當Servlet被實例化後,Tomcat會調用init()方法初始化這個對象
- 處理服務。當瀏覽器訪問Servlet的時候,Servlet 會調用service()方法處理請求
- 銷燬。當Tomcat關閉時或者檢測到Servlet要從Tomcat刪除的時候會自動調用destroy()方法,讓該實例釋放掉所佔的資源。一個Servlet如果長時間不被使用的話,也會被Tomcat自動銷燬
- 卸載。當Servlet調用完destroy()方法後,等待 jvm 垃圾回收。如果有需要再次使用這個Servlet,會重新調用init()方法進行初始化操作。
細節注意點:
1:構造器先執行,創建Servlet對象:init,service,destory方法,都是非static方法,都得使用對象調用.
2:一個Servlet類在整個生命週期中最多隻有一個對象.
3:init在構造器執行之後,立馬執行,只執行一次,爲對象做初始化操作.
4:service方法在每次請求都會執行.
5:destroy方法只有在正常關閉Tomcat時,纔會執行,不要期望該方法一定執行,不要在該方法編寫掃尾操作.
6:Servlet類必須使用public修飾,Servlet的構造器,必須是公共無參數的。(上面執行流程提到過)
get方式和post方式有何區別
1. 數據長度上:
- GET方式:在URL地址後附帶的參數是有限制的,其數據容量通常不能超過1K。
- POST方式:可以在請求的實體內容中向服務器發送數據,傳送的數據量無限制。
2.請求參數的位置上:
- GET方式:請求參數放在URL地址後面,以?的方式來進行拼接
- POST方式:請求參數放在HTTP請求包中
3.用途上:
- GET方式一般用來獲取數據,多用於超鏈接請求,(因爲提交的數據在地址欄可見,所以不安全)
- POST方式一般用來提交數據,多用於HTML的表單提交,等用於錄入數據,並傳遞給Web服務器,提交的數據在地址欄不可見,安全。(處理訂貨表單、在數據庫中加入新數據行)