javaWeb(十二)監聽器(Listener)和過濾器(Filter)
阿新 • • 發佈:2019-01-10
Listener
1、Listener定義 :
監聽器內部實現其實就是介面回撥.
就像老闆寫介面方法,然後員工寫實現類,父類介面指向子類物件,多型的一種體現
2、Listener分類 :
總共有8個 劃分成三種類型
- 【監聽三個作用域建立和銷燬】
需要在web.xml裡面註冊
三個作用域 | Web中類的體現 | Listener介面 | 建立 | 銷燬 |
request | httpServletRequest | ServletRequestListener | 只要訪問伺服器,就會有請求;html: 會; jsp: 會; servlet : 會 | 對請求做了響應後 |
session | httpSession | HttpSessionListener | 呼叫getSession;html: 不會; jsp: 會; servlet : 會 | 超時(預設30分鐘)、非正常關閉(銷燬)、正常關閉伺服器(序列化) |
application | ServletContext | ServletContextListener | 啟動伺服器時 | 關閉伺服器、從伺服器移除專案 |
- 【監聽三個作用域屬性狀態變更】
需要在web.xml裡面註冊
可以監聽在作用域中值 新增 | 替換 | 移除的動作。(setAttribute/removeAttribute)
-
request — ServletRequestAttributeListener
-
session — HttpSessionAttributeListener
-
servletContext — ServletContextAttributeListener
- 【監聽httpSession裡面存值的狀態變更】
不需要在web.xml裡面註冊,但是需要Bean實現下面這個介面
- HttpSessionBindingListener(監聽物件與session 繫結和解除繫結 的動作)
- 讓javaBean 實現該介面即可
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("物件被繫結進來了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("物件被解除繫結");
}
- HttpSessionActivationListener(用於監聽現在session的值 是 鈍化 (序列化)還是活化 (反序列化)的動作)
session中的值可能會很多, 並且我們有很長一段時間不使用這 個記憶體中的值, 那麼可以考慮把session的值可以儲存到硬碟上【鈍化】,等下一次在使用的時候,在從硬碟上提取出來。 【活化】
1. 在tomcat裡面 conf/context.xml 裡面配置
對所有的執行在這個伺服器的專案生效
2. 在conf/Catalina/localhost/context.xml 配置
對 localhost生效。 localhost:8080
3. 在自己的web工程專案中的 META-INF/context.xml
只對當前的工程生效。
maxIdleSwap : 1分鐘不用就鈍化
directory : 鈍化後的那個檔案存放的目錄位置。
D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\demo1
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="javaStudy"/>
</Manager>
</Context>
Filter
過濾器 , 其實就是對客戶端發出來的請求進行過濾。 瀏覽器發出, 然後伺服器派servlet處理。 在中間就可以過濾, 其實過濾器起到的是攔截的作用。
在伺服器啟動的時候就建立。伺服器停止的時候銷燬
1、如何使用Filter:
- 定義一個類, 實現Filter
public class FilterDemo implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("來到過慮器了。。。");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
- 註冊過濾器
<filter>
<display-name>FilterDemo</display-name>
<filter-name>FilterDemo</filter-name>
<filter-class>com.itheima.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、配置Filter:
- 全路徑匹配 以 / 開始
/LoginServlet
- 以目錄匹配 以 / 開始 以 * 結束
/demo01/*
- 以後綴名匹配 以 * 開始 以後綴名結束
*.jsp *.html *.do
3、配置引數Dispachers:
REQUEST : 只要是請求過來,都攔截,預設就是REQUEST
FORWARD : 只要是轉發都攔截。
ERROR : 頁面出錯發生跳轉
INCLUDE : 包含頁面的時候就攔截。