Servlet、Filter、Listener的簡介

一、   Servlet

Servlet是一個與協議無關的、跨平臺的web組件,由java語言開發,由servlet容器管理,可以生成動態的Web頁面。 它接收Web瀏覽器或其它HTTP客戶端發出請求,是HTTP服務器上的數據庫或應用程序之間的中間層。

javax.servlet.http.HttpServlet實現了專門用於響應HTTP請求的Servlet

自定義的servlet只需繼承HttpServlet,並覆蓋以下方法其中之一即可

  •   doGet(HttpServletRequest,HttpServletResponse) //響應HTTP GET的請求
  •  doPost(HttpServletRequest,HttpServletResponse) //響應HTTP POST的請求
public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //應用代碼
    }
}

Web.xml中配置

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.alibaba.test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

二、   Filter

Filter相當於一個過濾器。它會在請求到達Servlet之前,以及響應返回給瀏覽器之前,被激活。因此,

1.     Filter可以改變被傳遞到Servlet中的Request和Response對象。

2.     Filter可以改變由Servlet返回給瀏覽器的內容。

3.     Filter可以決定是否把控制傳遞給其後的Servlet。

4.     每個Servlet可以掛接多個Filter。

5.     每個Servlet和Filter並不知道其它的Filter存在。

一個filter必須實現javax.servlet.Filter接口並定義三個方法:

  • public void init (FilterConfig config)  //設置filter 的配置對象
  • public void destroy()  //filter銷燬資源
  • void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) //執行filter 的工作

  服務器每次只調用一次init方法初始化filter,調用doFilter方法多次以處理不同的請求。FilterConfig接口有方法可以找到filter名稱及初始化參數信息。服務器可以設置FilterConfig爲空來指明filter已經終結。

每一個filter從doFilter()方法中得到當前的request及response。在這個方法裏,可以進行任何的針對request及response的操作(包括收集數據、包裝數據等)。Filter接口的doFilter方法取一個FilterChain對象作爲它的一個參數,調用FilterChain對象的doFilter方法,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。

Filter的用途很廣泛,例如:驗證授權、加密、壓縮等。

下面是Filter的例子:

public class SetLoggingContextFilter extends Filter{
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    {
     //做servlet執行之前做的事
     chain.doFilter(request, response);//執行下一個filter或servlet、jsp
    //做servlet執行之後做的事
    }
}

Web.xml中的配置

<filter>
   <filter-name>LoggingFilter</filter-name>
   <filter-class>com.alibaba…SetLoggingContextFilter </filter-class>
</filter>
<filter-mapping>
    <filter-name>LoggingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Filter的攔截在servlet 的之前和之後。


三、   Listener

Listener可以監聽WEB應用中的各種事件,J2EE API中包含以下接口:

1.     ServletContextListener– 當Servlet容器(Context)被創建時、被第一次訪問時、被銷燬時,得到通知。

a)contextDestroyed(ServletContextEvent)

b) contextInitialized(ServletContextEvent)

2.     ServletContextAttributesListener– 當ServletContext.attributes被增、刪、改時,得到通知。

a) attributeAdded(ServletContextAttributeEvent)

b) attributeRemoved(ServletContextAttributeEvent)

c) attributeReplaced(ServletContextAttributeEvent)

3.     HttpSessionListener– 當Session被創建、作廢、超時的時候,得到通知。

a) sessionCreated(HttpSessionEvent)

b) sessionDestroyed(HttpSessionEvent)

4.     HttpSessionAttributesListener– 當Session中的數據被增、刪、改時,得到通知。

a) attributeAdded(HttpSessionBindingEvent)

b) attributeRemoved(HttpSessionBindingEvent)

c) attributeReplaced(HttpSessionBindingEvent)

下面是Listener的例子:

public class WebxControllerListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) { 
   //可以寫初始化框架代碼
}   
public void contextDestroyed(ServletContextEvent event) {
   //可以銷燬框架釋放資源
}
}

Web.xml中的配置

<listener>
    <listener-class>com.alibaba.webx.WebxControllerListener</listener-class>
</listener>

Listener在配置時不需要配置url映射,他不是針對客戶端的某一請求觸發的,而由服務器某些特定事件觸發的。目前我們應用使用WebxControllerListener就是實現ServletContextListener接口,在web服務器初始化和銷燬時分別調用 contextInitialized(ServletContextEvent)、contextDestroyed(ServletContextEvent) 進行初始化和銷燬的工作。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章