第一章 Filter
1.1 概述
- 当访问服务器的资源的时候,过滤器可以将请求拦截下来,完成一些特殊的功能。
1.2 作用
- 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤……
1.3 快速入门
- 步骤:
- ①定义一个类,实现接口Filter。
- ②复写方法。
- ③配置拦截路径。
- 示例:
package com.sunxiaping.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(filterName = "DemoFilter", urlPatterns = "/*") public class DemoFilter implements Filter { public void init(FilterConfig config) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //放行 chain.doFilter(req, resp); } public void destroy() { } }
1.4 Filter的配置详解
1.4.1 拦截路径配置
- 具体资源路径:
/index.jsp
只有访问index.jsp的时候,过滤器才会被执行
- 拦截目录:
/user/* 访问/user目录下的所有资源的时候,过滤器才会被执行
- 后缀名拦截:
*.jsp
访问所有jsp页面都会被拦截
- 拦截所有资源:
/*
1.4.2 拦截方式的配置
- 资源被访问的方式(转发、重定向)。
- 设置DispatcherType属性:
- ①REQYEST:默认值。浏览器直接请求资源。
- ②FORWARD:转发。
- ③INCLOUD:包含。
- ④ERROR:错误跳转资源。
- ⑤ASYNC:异步访问资源。
- 示例:
package com.sunxiaping.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * dispatcherTypes = {DispatcherType.REQUEST}表示浏览器直接请求资源的时候,该过滤器会拦截 */ @WebFilter(filterName = "DemoFilter", urlPatterns = "/*", dispatcherTypes = {DispatcherType.REQUEST}) public class DemoFilter implements Filter { public void init(FilterConfig config) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //放行 chain.doFilter(req, resp); } public void destroy() { } }
1.5 过滤器链
1.5.1 执行顺序
- 如果有两个过滤器:过滤器1和过滤器2,
- 执行顺序:过滤器1-->过滤器2-->资源-->过滤器2-->过滤器1。
1.5.2 过滤器先后顺序问题
- 注解配置:按照类名的字符串比较规则比较,值小的先执行。
第二章 Listener
2.1 概念
- web的大三组件之一。
2.2 事件监听机制
- 事件:一件事情。
- 事件源:事件发生的地方。
- 监听器:一个对象。
- 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码。
2.3 ServletContextListener
- 监听ServletContext对象的创建和销毁。
- ServletContext对象创建后会调用此方法:
public void contextInitialized(ServletContextEvent sce);
- ServletContext对象销毁前会调用此方法:
public void contextDestroyed(ServletContextEvent sce);
2.4 开发步骤
- ①定义一个类,实现监听器接口。
- ②复写方法。
- ③配置。
2.5 应用示例
- 示例:
package com.sunxiaping.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class ContextLoadListener implements ServletContextListener { public ContextLoadListener() { } /** * 监听ServletContext对象的创建 * * @param sce */ public void contextInitialized(ServletContextEvent sce) { ServletContext servletContext = sce.getServletContext(); System.out.println(servletContext); } /** * 监听ServletContext对象的销毁 * * @param sce */ public void contextDestroyed(ServletContextEvent sce) { } }