Java Web組件Servlet、Filter、Listener

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

相關文章
相關標籤/搜索