您好,登錄后才能下訂單哦!
Filter聲明周期和FilterConfig
我們前面學習過Servlet的生命周期,同樣FilterConfig的生命周期也差不多。這篇來學習Filter的生命周期和FilterConfig這兩個知識點。
Filter的生命周期
我們先來復習下Servler的生命周期:實例化->初始化-> 服務->銷毀
Servlet是這樣,只有在第一次訪問該servlet的時候,才會進行實例化,然后初始化,然后執行service方法中的代碼,最后app卸載或者tomcat服務關機,才會銷毀。
Filter的生命周期有點類似:
??當服務器啟動,會創建Filter對象,并調用init方法,只調用一次。
??當訪問資源時,路徑與Filter的攔截路徑匹配,會執行Filter中的doFilter方法,這個方法時真正攔截操作的方法。
??當服務器關閉,會調用Filter的destory方法進行銷毀操作。
這里我們來代碼練習一下,利用前面這個MyFilter.java來修改下代碼。
package?com.kaigejava.filter;
import?java.io.IOException;
import?javax.servlet.Filter;
import?javax.servlet.FilterChain;
import?javax.servlet.FilterConfig;
import?javax.servlet.ServletException;
import?javax.servlet.ServletRequest;
import?javax.servlet.ServletResponse;
public?class?MyFilter?implements?Filter {
????public?MyFilter() {
????????System.out.println("MyFilter對象實例化了");
????}
????
????@Override
????public?void?destroy() {
????????System.out.println("MyFilter對象銷毀了");
????}
????@Override
????public?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain)
????????????throws?IOException,?ServletException?{
????????System.out.println("doFilter執行了攔截");
????????//?放行
????????chain.doFilter(request,?response);
????}
????@Override
????public?void?init(FilterConfig?filterConfig)?throws?ServletException?{
????????System.out.println("MyFilter對象初始化了");
????}
}
重新部署下Tomcat,看看控制臺這幾句話是否打印出來。
1.%2?先看看啟動Tomcat的時候實例化和初始化是否執行
2.%2?執行攔截操作
我們訪問一下/servletDemo1,應該會執行攔截,打印消息
這里的doFilter方法,訪問一次servlet就好執行一次doFilter中代碼。
3.%2?關閉tomcat服務器,執行銷毀方法
在Servers Tab,右鍵Tomcat服務器,點擊stop,相當于關閉tomcat服務器。
2.FilterConfig
在Filter生命周期方法中init()方法有一個參數就是FilterConfig,我們來學習下這個對象的功能的基本使用。
FilterConfig它時Filter的配置對象,它可以完成下列功能
??獲取Filter名稱
??獲取Filter初始化參數
??獲取ServletContext對象
下面我們來代碼演示下第二個獲取初始化參數的功能。
這里新建一個FilterConfigTest.java,也需要實現Filter接口。
先在web.xml中配置一下Filter和初始化參數。
<filter>
?????<filter-name>FilterConfigTest</filter-name>
?????<filter-class>com.anthony.filter.FilterConfigTest</filter-class>
?????<init-param>
?????????<param-name>encoding</param-name>
?????????<param-value>UTF-8</param-value>
?????</init-param>
?</filter>
?
?<filter-mapping>
?????<filter-name>FilterConfigTest</filter-name>
?????<url-pattern>/*</url-pattern>
?</filter-mapping>
在原有基礎上加上上面配置,保存web.xml文件,然后在FilterConfigTest.java寫入如下代碼。
package?com.anthony.filter;
import?java.io.IOException;
import?javax.servlet.Filter;
import?javax.servlet.FilterChain;
import?javax.servlet.FilterConfig;
import?javax.servlet.ServletException;
import?javax.servlet.ServletRequest;
import?javax.servlet.ServletResponse;
public?class?FilterConfigTest?implements?Filter {
????
????private?FilterConfig?filterConfig;
????@Override
????public?void?init(FilterConfig?filterConfig)?throws?ServletException?{
????????this.filterConfig?=?filterConfig;
????}
????
????@Override
????public?void?destroy() {
????????
????}
????@Override
????public?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain)
????????????throws?IOException,?ServletException?{
????????String?encoding?=?filterConfig.getInitParameter("encoding");
????????System.out.println(encoding);
????????
????????chain.doFilter(request,?response);
????}
}
在瀏覽器刷新之后訪問
控制臺是可以打印UTF-8這個值。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。