JavaWeb学习笔记之Filter和Listener

在JavaWeb开发中,Filter和Listener是重要的组件,它们能够解耦和重用代码,实现更高效的处理请求和响应。

JavaWeb学习笔记之Filter和Listener

在JavaWeb开发中,Filter和Listener是重要的组件,它们能够解耦和重用代码,实现更高效的处理请求和响应。

一、Filter

Filter可以认为是一个拦截器,用于过滤HTTP请求和响应。Filter常用于进行一些通用的操作,例如安全检查、日志记录、字符编码转换等等。

1. Filter接口

Filter接口属于javax.servlet包,定义了三个方法用于处理请求和响应:

public interface Filter {
    public void init(FilterConfig filterConfig) throws ServletException;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
    public void destroy();
}
  • init:在Filter创建时调用,用于初始化Filter。
  • doFilter:在每个请求被处理之前进行调用,用于处理请求和响应。
  • destroy:在Filter销毁时调用,用于清理操作。

2. Filter的配置

为了使用Filter,在web.xml文件中需要进行配置。示例如下:

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.example.filter.MyFilter</filter-class>
    <init-param>
        <param-name>param1</param-name>
        <param-value>value1</param-value>
    </init-param>
    <init-param>
        <param-name>param2</param-name>
        <param-value>value2</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/example/*</url-pattern>
</filter-mapping>

上述配置中,首先定义了Filter类MyFilter和其对应的配置参数param1和param2,然后定义了Filter映射到的URL路径/example/*。

3. Filter的示例

下面介绍一个使用Filter的示例,将请求中的字符编码转换为UTF-8。

public class EncodingFilter implements Filter {

    private String encoding;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.encoding = filterConfig.getInitParameter("encoding");
        if (this.encoding == null) {
            this.encoding = "UTF-8";
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding(this.encoding);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // do nothing
    }
}

二、Listener

Listener监听器是一种特殊的组件,用于监听JavaWeb中的事件,例如ServletContext、HttpSession和ServletRequest等等。

1. Listener接口

Listener接口也属于javax.servlet包,定义了多个接口用于监听不同的事件。常见的接口有:

  • ServletContextListener:监听ServletContext的创建和销毁事件。
  • HttpSessionListener:监听HttpSession的创建和销毁事件。
  • ServletRequestListener:监听ServletRequest的创建和销毁事件。

每个Listener接口都包含了一些方法,例如:

public interface ServletContextListener extends EventListener {
    public void contextInitialized(ServletContextEvent sce);
    public void contextDestroyed(ServletContextEvent sce);
}
  • contextInitialized:在ServletContext创建时调用。
  • contextDestroyed:在ServletContext销毁时调用。

2. Listener的配置

与Filter一样,Listener也需要在web.xml中进行配置。示例如下:

<listener>
    <listener-class>com.example.listener.MyListener</listener-class>
</listener>

3. Listener的示例

下面介绍一个ServletContextListener的示例,用于加载Web应用程序配置文件。

public class ConfigListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        String configPath = context.getRealPath("/WEB-INF/config.properties");
        Properties props = new Properties();
        try (InputStream in = new FileInputStream(configPath)) {
            props.load(in);
        } catch (IOException e) {
            throw new RuntimeException("Failed to load config file from " + configPath, e);
        }
        context.setAttribute("config", props);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // do nothing
    }
}

该Listener的作用是在Web应用程序启动时加载/config.properties文件,并将其转换为Properties对象保存到ServletContext中。这样就可以在整个Web应用程序中使用该对象了。

本文标题为:JavaWeb学习笔记之Filter和Listener

基础教程推荐