Java Fileter & Java Listener 笔记
Java Fileter
当浏览器发送请求访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
- 过滤器的作用
- 一般用于完成通用的操作。如:登陆验证、统一编码处理、敏感字符过滤
快速入门:
-
步骤:
- 定义一个类,实现接口 Fileter
- 复写方法
- 配置拦截路径
import javax.sevrlet.Filter; // 注意正确引包 /** * 过滤器入门程序 */ @WebFilter("/*") // 访问所有资源之前,都会执行该过滤器 // @WebFilter("/demo.jsp") // 只有访问 demo.jsp 的时候才会执行该过滤器 public class FilterDemo implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("filterDemo被执行了...."); // 放行 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
-
过滤器细节:
-
web.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <web-app> <filter> <filter-name>demo</filter-name> <filter-class>cn.itcast.web.FilterDemo</filter-class> </filter> <filter-mapping> <filter-name>demo</filter-name> <!-- 拦截路径--> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
-
过滤器执行流程
/** * 每一次请求被拦截资源时会执行。 * 执行多次 */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 对 request 对象的请求消息增强 System.out.println("filterDemo被执行了...."); // 放行 filterChain.doFilter(servletRequest, servletResponse); // 对 response 对象的响应消息增强 System.out.println("filterDemo回来了...."); }
- 过滤器生命周期方法
/** * 在服务器启动后,会创建 Filter 对象,然后调用 init 方法。 * 只执行一次,用于加载资源 */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init...."); }
/** * 在服务器关闭后,filter 对象被销毁。如果服务器时正常关闭,则会执行 destroy 方法。 * 只执行一次,用于释放资源 */ @Override public void destroy() { System.out.println("destroy...."); }
- 过滤器配置详解
-
拦截路径的配置
拦截类型 字段 解释 具体的资源路径 /index.jsp 只有访问 index.jsp 资源时,过滤器才会执行 目录拦截 /user/* 访问 /user 下的所有资源时,过滤器都会被执行 后缀名拦截 *.jsp 访问所有后缀名为 jsp 的资源时,过滤器都会被执行 拦截所有资源 /* 访问所有资源时,过滤器都会被执行 - 拦截方式的配置
资源被访问的方式
-
注解配置:
字段 描述 REQUEST 默认值。浏览器直接请求资源 FORWARD 转发访问资源 INCLUDE 包含访问资源 ERROR 错误跳转资源 ASYNC 异步访问资源 - 设置 dispatcherType 属性
// 浏览器直接请求资源时,该过滤器会被执行 @WebFilter(value = "/*", dispatcherType = DispatcherType.REQUEST)
- web.xml 配置
<filter-mapping> <filter-name>demo</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern> <!-- 加入 dispatcher 标签 --> <dispatcher>REQUEST</dispatcher> </filter-mapping>
- 过滤器链(配置多个过滤器)
-
执行顺序
-
如果有两个过滤器(过滤器 1 和过滤器 2)
-
过滤器先后问题
-
注解配置
-
按照类名的字符串的比较规则比较,值小的先执行
-
如 AFilter 和 BFilter
/** * 先比较靠前的,若一样则往后逐次移位比较。 * 那么这次的比较在第一个字符就出结果了,即: */ String X = new ["A","F","i","l","t","e","r"]; String Y = new ["B","F","i","l","t","e","r"]; X[0] > Y[0] ? Y[0] : X[0] == Y[0] ? X[1] > Y[1] ? ... X[0];
-
-
-
web.xml配置
- 谁的
<filter-mapping>
定义在上边谁先执行
- 谁的
-
-
-
Java Listener
-
事件监听机制
- 事件:一件事情
- 事件源:事件发生的地方
- 监听器:一个对象
- 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件的时候,执行监听器代码
-
ServletContextListener(监听 ServletContext 对象的创建和销毁)
-
方法:
/** * ServletContext对象被销毁之前会调用该方法 */ void contextDestroyed(ServletContextEvent sce); /** * ServletContext对象创建后会调用该方法 */ void contextInitialized(ServletContextEvent sce);
-
步骤:
-
定义一个类,实现
ServletContextListener
接口@WebListener public class ContextLoaderListener implements ServletContextListener { /** * 监听 ServletContext 对象创建的。ServletContext 对象服务器启动后自动创建。 * * 在服务器启动后自动调用 */ @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { // 加载资源文件 // 1. 获取 ServletContext 对象 ServletContext servletContext = servletContextEvent.getServletContext(); // 2. 加载资源文件 String initParameter = servletContext.getInitParameter("contextConfigLocation"); // 3. 获取真实路径 String realPath = servletContext.getRealPath("contextConfigLocation"); // 4. 加载进内存 try { FileInputStream fileInputStream = new FileInputStream(realPath); System.out.println(fileInputStream); } catch (Exception e){ e.printStackTrace(); } } /** * 在服务器关闭后,ServletContext 对象被销毁。当服务器正常关闭后该方法被调用。 */ @Override public void contextInitialized(ServletContextEvent servletContextEvent) { } }
-
复写方法
@Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("ServletContext对象被创建了...."); }
@Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("ServletContext对象被销毁了...."); }
-
配置
-
web.xml配置方式
<?xml version="1.0" encoding="UTF-8"?> <web-app> <listener> <listener-class>cn.itcast.web.ContextLoaderListener</listener-class> </listener> <!-- 指定初始化参数--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> </web-app>
-
注解配置方式
@WebListener public class ContextLoaderListener implements ServletContextListener { ... }
-
-
-