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 - Python技术站