1.Listener
[1]監聽器簡介
> Listener是JavaWeb的三大組件之一,Servlet、Filter、Listener
> Listener翻譯過來就是監聽器
> 現實生活中的監聽器:
- 監聽誰:明星
- 監聽器:朝陽群眾
- 監聽事件:干壞事
- 回調函數:報警
> JavaWeb中的監聽器:
- 監聽誰:ServletContext、HttpSession、ServletRequest
- 監聽器:自己寫
- 監聽的事件:生命周期、屬性的變化
- 回調函數:自己寫
> JavaWeb中的監聽器,共分為三大類,一共8個:
> WEB組件的特點:
1.都需要創建一個類並實現某個接口
2.都要在web.xml文件中進行配置
[2]監聽器分類
1.生命周期監聽器(3個)
2.屬性變化監聽器(3個)
3.session中指定類屬性變化監聽器(2)
[3]生命周期監聽器:
> 監聽ServletContext、HttpSession、ServletRequest三個對象創建和銷毀
> javax.servlet.ServletContextListener --> 監聽ServletContext的生命周期變化
- 方法:
void contextDestroyed(ServletContextEvent sce)
- 在ServletContext對象銷毀前調用
void contextInitialized(ServletContextEvent sce)
- 在ServletContext對象創建后調用
- 參數:
ServletContextEvent
- 可以用來獲取ServletContext對象
> javax.servlet.http.HttpSessionListener --> 監聽HttpSession對象的生命周期變化
- 方法:
void sessionCreated(HttpSessionEvent se)
- 在HttpSession對象創建以后調用
void sessionDestroyed(HttpSessionEvent se)
- 在HttpSession對象銷毀前調用
- 參數:
HttpSessionEvent
- 可以用來獲取HttpSession對象
> javax.servlet.ServletRequestListener --> 監聽request對象的生命周期的變化
- 方法:
void requestDestroyed(ServletRequestEvent sre)
- 在request對象銷毀前調用
void requestInitialized(ServletRequestEvent sre)
- 在request對象創建后調用
- 參數:
ServletRequestEvent
- 可以用來獲取ServletContext對象
- 可以用來獲取ServletRequest對象
[4]屬性監聽器
> ServletContext屬性變化監聽器
javax.servlet.ServletContextAttributeListener
- 方法:
void attributeAdded(ServletContextAttributeEvent scab)
- 當我們向application域中添加屬性時調用
void attributeRemoved(ServletContextAttributeEvent scab)
- 當我們從application域中移除屬性時調用
void attributeReplaced(ServletContextAttributeEvent scab)
- 當application域中一個屬性被替換時調用
> HttpSession的屬性變化監聽器
javax.servlet.http.HttpSessionAttributeListener
- 方法:
void attributeAdded(HttpSessionBindingEvent se)
- 當我們向session域中添加屬性時調用
void attributeRemoved(HttpSessionBindingEvent se)
- 當我們從session中移除屬性時調用
void attributeReplaced(HttpSessionBindingEvent se)
- 當session域中的一個屬性被替換時調用
參數:
HttpSessionBindingEvent:
作用:
1.獲取發生變化的屬性的名字 getName()
2.獲取發生變化的屬性的值 getValue() 注意屬性替換時,獲取到是舊的屬性值
3.獲取HttpSession對象 getSession() 可以通過session對象獲取到新的屬性值
> ServletRequest屬性變化監聽器
-javax.servlet.ServletRequestAttributeListener
- 方法:
void attributeAdded(ServletRequestAttributeEvent srae)
- 當我們向request域中添加屬性時調用
void attributeRemoved(ServletRequestAttributeEvent srae)
- 當我們從request域中移除屬性時調用
void attributeReplaced(ServletRequestAttributeEvent srae)
- 當request域中的一個屬性被替換時調用
> 監聽Session中指定類的實例屬性變化的監聽器
- 這兩個監聽器的接口,由一個JavaBean去實現,而且不用編寫配置文件
[5]HttpSessionBindingListener
void valueBound(HttpSessionBindingEvent event)
- 當該類實例設置進session域中時調用
void valueUnbound(HttpSessionBindingEvent event)
- 當該類的實例從session域中移除時調用
HttpSessionBindingEvent:
作用:
1.獲取發生變化的屬性的名字 getName()
2.獲取發生變化的屬性的值 getValue()
3.獲取HttpSession對象 getSession()
[6]HttpSessionActivationListener
> 監聽某個類的實例和session一起活化和鈍化的監聽器
- 方法:
void sessionDidActivate(HttpSessionEvent se)
- 當該類實例和session一起活化時調用
void sessionWillPassivate(HttpSessionEvent se)
- 當該類實例和session一起鈍化時調用
- 參數:
HttpSessionEvent
- 可以用來獲取HttpSession對象
2.Filter
[1] Filter簡介
- Filter直譯過來就是過濾器的意思
- JavaWeb中的Filter是用來過濾請求
- Filter是JavaWeb中三大組件之一:Servlet、Filter、Listener
- 三大組件都需要運行在服務器端
- 編寫WEB組件有一個共同的特點:
1.編寫一個類實現某個接口
2.在web.xml文件中進行配置
- Filter的作用:
1.過濾器可以在請求到達目標資源(JSP、HTML、Servlet等等)之前攔截請求
2.過濾器也可以放行請求,使請求到達目標資源
3.在響應到達瀏覽器之前對響應做一個處理
[2] Filter的HelloWorld
1.創建一個類實現Filter接口
2.編寫web.xml配置文件
<filter>
<filter-name>Filter的別名</filter-name>
<filter-class>filter的全類名</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter的別名</filter-name>
<url-pattern>要攔截的請求的地址</url-pattern>
</filter-mapping>
- url-pattern的配置規則:
1.精確匹配:只有訪問的路徑和url-pattern配置的路徑完全一致時,才會調用Filter攔截請求
如: /index.jsp 只會攔截項目根目錄下index.jsp的請求
2.路徑匹配:只要訪問的地址在url-pattern配置的路徑下,就會調用Filter攔截請求
如: /hello/* 只要訪問項目根目錄下hello路徑下的資源,就會調用Filter
/* 只要是當前項目下的請求都會調用Filter
3.后綴匹配: 只要訪問的地址后綴和url-pattern一致,就會調用Filter攔截請求
如: *.jsp 只要訪問的地址以.jsp結尾,就會調用Filter
注意:所有的url-pattern必須符合上述規則。
以上規則同樣適用於Servlet的url-pattern
當使用Filter去攔截一個Servlet時,只需要將Filter的url-pattern配置和Servlet的一樣即可,
同時也可以在filter-mapping中設置一個servlet-name標簽,來指定要攔截的Servlet,
這樣即使Servlet的url-pattern發生改變,Filter也會照常攔截
[3] Filter的生命周期
> Filter的生命周期是Filter由被創建到被銷毀的過程
> Filter的生命周期方法:
構造器:服務器一啟動就會創建Filter的實例,只會調用一次,Filter是單例。
init(): 構造器調用之后,馬上調用,用來初始化Filter,只會調用一次。
FilterConfig:代表當前Filter的配置信息,可以獲取當前Filter的初始化參數。
還可以獲取ServletContext對象。
doFilter():每次攔截請求時都會調用,會調用多次。
ServletRequest:代表瀏覽器發送給服務器的請求報文,和Servlet中的request是一樣的。
ServletResponse:代表的是服務器響應給瀏覽器的響應報文,和Servlet中的response是一樣的。
FilterChain: 用來放行請求:
chain.doFilter(request,response) --> 放行請求,
當調用該方法時,相當於調用了目標資源的service方法。
destroy():項目卸載Filter對象銷毀前調用,用來做一些如釋放資源等收尾的工作,只會調用一次。
[4] Filter的執行順序
- 為同一個WEB資源可以設置多個Filter攔截請求,多個Filter就組成了一個Filter鏈。
當有多個Filter時,在去調用chain.doFilter()時,
如果Filter之后還有Filter,就相當於調用下一個Filter的doFilter方法
如果Filter之后沒有Filter,就相當於調用了目標資源的service()方法
- 多個Filter的執行順序,有filter-mapping的順序決定,filter-mapping靠前的先攔截,靠后的后攔截。
- 注意:filter-mapping一定要在filter標簽的下邊
[5]
dispatcher
- Filter默認只會攔截直接向目標資源發送的請求。
- 我們可以在filter-mapping中通過dispatcher標簽來指定攔截請求的類型:
<dispatcher>REQUEST</dispatcher>
- request表示會攔截直接向目標資源發送的請求,如果不配置dispatcher則默認值就是request
如果寫了dispatcher則以寫的為准
<dispatcher>FORWARD</dispatcher>
- forward表示會攔截通過轉發向目標資源發送的請求
<dispatcher>INCLUDE</dispatcher>
- include表示會攔截通過動態包含向目標發送的請求
<dispatcher>ERROR</dispatcher>
- error表示會攔截通過錯誤頁面的形式向目標發送的請求
<error-page>
<error-code>404</error-code>
<location>/4.jsp</location>
</error-page>
[6] HttpFilter
轉載請注明出處!
http://www.cnblogs.com/libingbin/
感謝您的閱讀。如果文章對您有用,那么請輕輕點個贊,以資鼓勵。