1.servlet是Javaweb三大元件之一,它是javaweb的最為基礎的元件。(其他兩種元件:Filter和Listener)
2.javaweb請求響應原理:
當tomcat接收到請求(http://localhost:8080/servlet_demo/login)後,tomcat會找到servlet_demo項目中的web.xml檔案,然後通過login這個請求路徑,查找處理這個請求的Servlet類型。這剛好與<url-pattern>/login</url-pattern>比對,這說明存在一個可以通過這個請求的Servlet。然後再通過<url-pattern>/longin</url-pattern>查找到<servlet-name>login</servlet-name>,然後再通過<servlet-name>login</servlet-name>找到查找到<servlet-class>com.syx.servlet.LoginServlet</servlet-class>。這時tomcat已經得到了一個servlet類的名字(一個字元串而已)。
tomcat通過servlet類名字去查找記憶體中是否存在servlet對象,如果存在,那麼就不用再去建立,直接擷取這個servlet執行個體,調用它的service()方法完成請求!
如果這個servlet不存在,那麼tomcat會通過反射來建立servlet執行個體,并把servlet執行個體放到servlet池中,再去調用servlet的service方法處理請求。
3.servlet的聲明周期:
servlet執行個體并非我們手動建立,而是由web容器建立。
void init():預設情況當servlet被第一次通路的時候init會被調用;servlet是單例模式;
void service():每次請求都會調用;
void destory():當servlet執行個體銷毀時被調用;
4.專注HTTP請求的Servlet
接口Servlet下有兩個主要的實作類:GenericServlet和HttpServlet.
1>GenericServlet是一個抽象類,不限制具體的傳輸方式,通用的servlet類,包含很多方法。
2>HttpServlet是一個抽象類,提供将要被子類內建的以建立web站點的用Http協定傳輸的類,其中包含兩個重要的方法:doGet()和doPost()。。
HttpServlet抽象類的繼承類中的init()方法,實際上是調用了父類的init()方法,如果沒有初始化内容,可以不重寫。
HttpServlet抽象類的繼承類中的service()方法,其實是調用了doGet()和doPost()方法,是以在繼承類中隻需要重寫抽象類的doGet()和doPost()方法。
5.tomcat啟動時建立servlet:
使得servlet随着tomcat的啟動而建立,就需要在web.xml檔案中的<servlet>标簽中配置<load-on-startup>元素,這個元素的值必須是大于等于0的整數,以定義多個servlet加載順序。【先建立的先銷毀】
6.初始化方法init(ServletConfig config),參數config來自于web.xml檔案中<servlet>标簽<init-param>标簽的值。
【注意:在eclipse裡面複制一個項目,需要修改項目的webroot路徑值。這樣才是一個新的項目】
7.servlet路徑映射:
關于url-pattern的配置:
>完全路徑比對:以/開頭,例如 /aaa /aaa/bbb
>目錄比對:以/開頭,例如 /aaa/* /*
>以擴充名比對:不能以/開頭,例如 *.do *.action ...
【優先級:完全路徑比對>目錄比對>擴充名比對】
8.ServletContext
>WEB容器在啟動時,它會為每個WEB應用程式都建立一個對應的ServletContext對象,它代表目前WEB應用。
>由于一個web應用中的所有servlet共享一個servletContext,是以同一個ServletContext中的servlet之間可以通訊。
【建立servletContext:在<webapp>标簽中配置<context-param>标簽,這樣所有的servlet類都可以放到servletContext中。】
9.獲得classpath下的資源檔案的流有兩種方式:
>通過ServletContext()方法擷取的對象調用getResourceAsStream(path1)方法,path1則為src目錄下的類編譯後在webapps下的路徑,即/web-inf/classess/test1.properties。
>直接通過類的加載器表示classpath下的資源檔案,即this.getClass().getClassLoader().getResourceAsStream(filename)。
10.Servlet是由tomcat建立的,且隻會建立一個執行個體,是以是單例模式,單例模式下的預設servlet并非是安全的。(圖檔來源于菜鳥教程)