1、Servlet 類javax.servlet.http.HttpServlet; 1.是單例模式,一個web容器中只有一個實例。服務器調用它的service方法進行請求處理, service方法又根據請求的類型分別調用doGet,doPost等方法。 2.因爲是單例模式,因此線程不安全 3.自定義Servlet需繼承HttpServlet,並重寫相應的doGet等方法。方法體內不能調用父類的該方法。 web.xml註冊: <servlet> <servlet-name>myservlet</servlet-name> <servlet-class>com.zk.baseservlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myservlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 2、Filter 接口javax.servlet.Filter; 1.過濾器首先執行init方法,從web.xml中的filter配置中讀取信息進行初始化。只執行一次。 2.客戶端的每次請求,都會通過doFilter方法。過濾器必須配置攔截路徑。 3.多個過濾器執行流程
控制檯輸出: init2 method init3 method init method MyFilter1 before MyFilter2 before MyFilter3 before servlet doget method MyFilter3 after MyFilter2 after MyFilter1 after 是個U型流程
Filter1類源碼
public class MyFilter1 implements Filter { public MyFilter1() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("MyFilter1 before"); chain.doFilter(request, response); System.out.println("MyFilter1 after"); } public void init(FilterConfig fConfig) throws ServletException { System.out.println("init method1"); } }
MyFilter2,
MyFilter3同上
web.xml註冊,3個過濾器都攔截/a路徑:
<filter-mapping> <filter-name>myfilter1</filter-name> <url-pattern>/a</url-pattern> </filter-mapping> <filter-mapping> <filter-name>myfilter2</filter-name> <url-pattern>/a</url-pattern> </filter-mapping> <filter-mapping> <filter-name>myfilter3</filter-name> <url-pattern>/a</url-pattern> </filter-mapping>
分析:init方法在容器啓動時候,只執行一次。doFilter則每訪問一次路徑就執行一次。java
3、Listener 接口ServletContextListener 監聽器用於監聽並接收被監聽對象的變化 1.容器啓動通知contextInitialized方法在filter和servlet前調用。 2.contextDestroyed方法在容器關閉後,filter和servlet銷燬後調用。
不完善的地方歡迎你們補充web