1.須要掌握Servlet,Filter以及Listener各自的用途及最佳使用場合java
2.Servlet的生命週期 *補充圖
服務器加載servlet——servlet構造函數——@PostConstruct修飾的方法——init()方法——service()方法——destroy()方法——@PreDestroy修飾的方法——服務器卸載servlet完畢。web
3.Servlet之間的跳轉
Servlet的跳轉能夠實現程序模塊化。MVC框架中都使用了servlet跳轉。其中有轉向、重定向和自動刷新瀏覽器
...3.1轉向(Forward):
轉向(Forward)是經過RequestDispatcher對象的forward()方法實現的。
...3.1.1 RequestDispatcher的得到方法
1)HttpServletRequest.getRequestDispatcher()
2)ServletContext.getRequestDispatcher()
...3.1.2 RequestDispatcher的參數說明
其中的參數必須以/開始,/表示本webApp的根目錄。能夠Forward到servlet、jsp頁面,甚至能夠跳轉到另一個文件或WEB-INF文件夾下的文件。
...3.2重定向(Redirect):
重定向(Redirect)是利用服務器返回的狀態碼實現的。客戶端瀏覽器請求服務器時,服務器端會返回一個狀態碼。服務器端經過response的setStatus()方法設置狀態碼
...3.2.1 狀態碼:
200表示一切正確; 30一、302表示該資源已不存在或換了地址,客戶端需重定向到一個新的資源,服務器響應中會附帶這個新資源地址;401表示沒有權限訪問;404表示資源不存在;
...3.2.2 獲取方法
1)HttpServletResponse.setStatus() + HttpServletResponse.setHeader()
其中,setStatus用來設置狀態碼,而setHeader用來設置新資源的地址
2)HttpServletResponse.sendRedirect(),其實 HttpServletResponse.sendRedirect()= HttpServletResponse.setStatus() + HttpServletResponse.setHeader()
...3.3 自動刷新(Refresh):
不只能夠實現一段時間後自動跳轉到另外一個頁面,還能夠實現一段時間後自動刷新本頁面,如:安全
response.setHeader("Refresh", "1000; URL=http://www.baidu.com" );服務器
URL指定的網址是1s後跳轉的頁面。當URL設置的路徑爲servlet本身的路徑時,就會每隔1s自動刷新本頁面一次。自動實現和重定向原理同樣,當爲時間設爲0,URL設爲一個網址,效果就是重定向。session
4.Servlet的線程安全問題
servlet是線程不安全的。要謹慎使用類的變量。一個servlet類只會有一個實例,而當多個用戶同時請求同一個servlet時,Tomcat會派生出多條線程執行servlet的代碼。所以servlet是線程不安全的。
...4.1多線程併發的讀寫會致使數據不一樣步的問題
...4.2多線程併發的讀寫servlet類屬性會致使數據不一樣步,但若只是併發地讀取屬性而不寫入,則不存在數據不一樣步問題
...4.3對於併發性的讀寫,最好的方法是synchronized這個屬性,這樣帶來的開銷將是最小的多線程
5.Fileter
Filter、Listener是servlet規範裏德兩個高級特性。不一樣於servlet,它們不用於處理客戶端請求,只用於對request、response進行修改或者對context、session、request事件進行監聽。
...5.1多個Filter就組成了一個FilterChain。併發
...5.2一個Filter必須實現javax.servlet.Filter接口。Filter須要配置在web.xml中才能生效。其中<dispatcher>配置到達servlet的方式。默認爲request。app
...5.2.1 request:表示僅當直接請求servlet時才生效。
...5.2.2 forward:表示僅當某servlet經過forward到該servlet時才生效。框架
...5.3多個Filter的執行有前後順序,規則是<filter-mapping>配置在前面的Filter執行要早於配置在後面的Filter
...5.4頁面編碼方式與Filter編碼方式必須一致。此外,若表單是get方式提交的,須要修改Tomcat的/conf/server.xml文件,指定URIEncoding,默認爲ISO-8859-1,不然依然會亂碼。
...5.5Filter中,若在chain.doFilter()上加一個try....catch語句,就能捕捉servlet中拋出的異常,而後根據不一樣的異常進行不一樣的異常處理。
...5.6Filter和特定的URL關聯,只有當客戶請求訪問此URL時,纔會觸發過濾器調用doFilter方法!
...5.7過濾器的初始化,即被調用init()方法是webApp應用被Tomcat加載就執行
...5.8Filter配置多個url-pattern
方法一:(Servlet規範 2.5+)
<filter> <filter-name>authority</filter-name> <filter-class>com.util.AuthorityFilter</filter-class> </filter> <filter-mapping> <filter-name>authority</filter-name> <url-pattern>/pages/cmm/*</url-pattern> <url-pattern>/pages/genbill/*</url-pattern> </filter-mapping>
方法二:
<filter> <filter-name>authority</filter-name> <filter-class>com.util.AuthorityFilter</filter-class> </filter> <filter-mapping> <filter-name>authority</filter-name> <url-pattern>/pages/genbill/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>authority</filter-name> <url-pattern>/pages/cmm/*</url-pattern> </filter-mapping>
6.Listener
Listener用於監聽Java Web程序中的事件,如建立、屬性修改、刪除session、request、context等,並觸發相應的事件。Java web程序只要記住該類事件觸發時必定會調用相應的Listener相應方法,並傳回一個Event對象。觸發時,服務器會順次執行各個Listener的相應方法。
...6.1HttpSessionListener接口、ServletContextListener、ServletRequestListener分別用於監控session、context、request的建立和銷燬。
1)HttpSessionListener:監聽session的建立和銷燬。建立session時執行sessionCreated()方法。超時或執行session.invalidate()時執行sessionDestroyed()方法。
2)ServletContextListener:監聽context的建立和銷燬。context表明當前的web應用程序。服務器啓動或熱部署war包時執行contextInitialized()方法。服務器關閉或只關閉該web時會執行contextDestroyed()方法。該listener可用於啓動時獲取web.xml裏配置的初始化參數。
3)ServletRequestListener:監聽request的建立和銷燬。用戶每次請求request都會執行requestInitialized()方法。request處理完畢自動銷燬前執行requestDestroyed()方法。
...6.2HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener用於監聽session、context、request的屬性變化。當向被監聽對象中添加、修改、刪除屬性時,會分別執行對應的方法。
...6.3HttpSessionBindingListener和HttpSessionActivationListener用於監控session內的對象。此兩個Listener不須要在web.xml中聲明。
1)HttpSessionBindingListener:當對象被放到session裏時,執行valueBound()方法。當對象被從session裏移除時,執行valueUnbound()方法。對象必須實現該Listener接口。
2)HttpSessionActivationListener:服務器關閉時,會將session裏的內容保存到硬盤上。服務器從新啓動時,會將session內容從硬盤上從新加載。當session裏的對象被鈍化時,執行sessionWillPassivate()方法。當對象被從新加載時,執行sessionDidActtivate()。對象必須實現該Listener接口。
...6.4HttpSessionIdListener
...6.5AsyncListener
...6.6<listener>標籤通常配置在<servlet>標籤的前面。
7.ServletContext
servlet容器在啓動時會加載web應用,併爲每一個web應用建立惟一的ServletContext對象,被同一個web應用中全部組件共享.在web運行期間,ServletContext設置的屬性一直存在。當web應用被關閉時(如關閉Tomcat),servlet容器銷燬ServletContext對象。
8.filter、listener、servlet啓動順序 1).啓動一個WEB項目的時候,容器(如:Tomcat)會去讀它的配置文件web.xml.讀兩個節點: <listener></listener> 和 <context-param></context-param> 2).緊接着,容器建立一個ServletContext(上下文),這個WEB項目全部部分都將共享這個上下文. 3).容器將<context-param></context-param>轉化爲鍵值對,並交給ServletContext. 4).容器建立<listener></listener>中的類實例,即建立監聽(經過contextInitialized(ServletContextEvent args)這個方法). listener的類實例須要實現 javax.servlet.ServletContextListener接口。 5).容器初始化<filter></filter>。filter的類實例須要實現 javax.servlet.Filter接口 6).容器加載<load-on-startup>的<serlvet/>。 servlet實現javax.servlet.Servlet接口 7).容器銷燬時,按照servlet-->filter-->listener的順序銷燬servlet、filter和listener