美文网首页从零学Java笔录凯哥Java-工作总结
javaweb之Filter生命周期和FilterConfig

javaweb之Filter生命周期和FilterConfig

作者: 凯哥Java | 来源:发表于2019-08-07 09:51 被阅读0次

    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这个值。

    相关文章

      网友评论

        本文标题:javaweb之Filter生命周期和FilterConfig

        本文链接:https://www.haomeiwen.com/subject/stmndctx.html