Filter:过滤器
1.概念
指对客户端访问资源的过滤,符合条件的放行,否则不放行,且能对目标资源访问前后进行逻辑处理。(当访问服务器资源时,过滤器可以讲请求进行拦截并完成一些特殊的功能。)
2. 步骤:
step1. 定义一个类,实现接口Filter
step2. 复写方法
step3. 配置拦截路径(web.xml;注解)
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo01 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
System.out.println("filterDemo01被执行了......");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
3. 过滤器细节:
-
过滤器执行流程:
step1. 执行过滤器
step2. 执行放行后的资源
step3. 回来执行过滤器放行代码下边的代码 -
web.xml 配置:
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
- 过滤器生命周期方法:
- init:服务器启动后,会先创建Filter对象,然后调用init方法。只执行一次,用于加载资源。
- doFilter:当每一次请求被拦截资源时会执行。执行多次。
- destroy:在服务器关闭后,Filter对象被销毁。若服务器正常关闭会执行destroy方法。只执行以此,用于释放资源。
- 过滤器配置注解 :
- 拦截路径配置:
- 拦截方式配置:资源被访问的方式
- 注解配置:
- 配置dispatcherTypes属性:
- web.xml配置:设置标签即可。
- 过滤器链(配置多个过滤器)
- 执行顺序:假设由两个过滤器:过滤器1和过滤器2
- 过滤器先后顺序问题:
1. 注解配置:按照类名的字符串标胶规则进行比较,值小的先执行。(eg:CFilter与HFilter,Cfilter先执行。)
2. web.xml配置:谁定义在上面则谁先执行。
4.增强对象的功能:
- 设计模式:一些通用的剞劂固定问题的方式。
1. 装饰模式
2. 代理模式:
- 概念:
1. 真实对象:被代理的对象
2. 代理对象:一种可以继承部分或全部的源代码的属性和方法,同时可以为了不同应用需要而增加源对象中没有的属性和方法的一类对象。
3. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 实现方式:
1. 静态代理:有一个类文件描述代理模式。
2. 动态代理:再内存中形成代理类。
动态代理的实现步骤:
1. 代理对象和真实对象实现相同的接口。
2. 代理对象=Proxy.newProxyInstance();
3. 使用代理对象调用方法。
4. 增强方法 - 动态代理的增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
Listener:监听器
- 概念: 由事件类和监听接口组成,自定义一个事件前,必须提供一个事件的监听接口以及一个事件类。
- 事件监听机制:
- 事件:一件事情
- 事件源:事件发生的地方
- 监听器:一个对象
- 注册监听:将事件、事件源、监听器绑定在一起,当事件源发生某个事件后,执行监听代码。
ServletContextListener
-
ServletContextListener:监听ServletContext对象的创建和销毁。
-
方法:
-
void contextDestroyed(ServletContextEvent sce)
:ServletContext对象被销毁之前会调用该方法。 -
void contextInitialized(ServletContextEvent sce)
:ServletContext对象创建后会调用该方法。 -
步骤:
step1. 定义一个类,实现ServletContextListener接口。
step2. 复写方法。
step3. 配置:
1)web.xml
<listener>
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
</listener>
- 指定初始化参数
<context-param>
- 注解:@WebListener