java web的三大组件:
- Filter:过滤器
- Listener:监听器
- Servlet
Filter
过滤器是处于客户端与服务器资源文件之间的一道过滤网,当访问服务器资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用
用于完成通用的操作。如:登陆验证、统一编码处理、敏感字符过滤...便于代码重用,不必每个servlet中还要进行相应的操作。
步骤
-
定义一个类,实现接口Filter
-
重写方法
-
配置拦截路径
- 注解
import javax.servlet.*;//Filter包不要导错 import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*")//拦截所有请求 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("过滤器执行了"); filterChain.doFilter(servletRequest,servletResponse);//过滤器放行 } @Override public void destroy() { } }
- web.xml
在web.xml中,监听器 > 过滤器 > servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。
<filter> <filter-name>demo1</filter-name><!--过滤器名称--> <filter-class>com.gs.loginFilter</filter-class><!--过滤器类的包路径--> <async-supported>true</async-supported><!--servlet 3.0后推出的新特性,支持异步处理。--> <init-param><!--可选--> <param-name>参数名</param-name><!--过滤器初始化参数--> <param-value>参数值</param-value> </init-param> </filter> <filter-mapping><!--过滤器映射--> <filter-name>loginFilter</filter-name> <url-pattern>指定过滤器作用的对象</url-pattern> </filter-mapping>
过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 执行过滤器放行代码后的代码
过滤器生命周期
- init:服务器启动时,会创建Filter对象。然后调用init()方法,用于加载资源,只执行一次。
- doFilter:每次请求资源被拦截时,调用doFilter()方法。
- destroy:服务器关闭后,Filter对象被销毁,如果服务器正常关闭,执行destroy()方法,释放资源,只执行一次。
拦截路径配置
- 具体资源路径:
/index.jsp
访问index.jsp资源时,过滤器执行 - 拦截目录:
/user/*
访问/user下的所有资源时,过滤器执行 - 后缀名拦截:
*.jsp
访问所有jsp资源时,过滤器执行 - 拦截所有资源:
/*
拦截方式的配置
设置dispatcherTypes属性
-
REQUEST:默认值,浏览器直接请求访问资源
-
FORWARD:转发访问资源
-
INCLUDE:包含访问资源
-
ERROR:错误跳转资源
-
ASYNC:异步访问资源
- 注解
//浏览器直接请求访问index.jsp页面时,该过滤器执行。 @WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)
//浏览器转发访问index.jsp页面时,该过滤器执行。 @WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.FORWARD)
//浏览器直接请求访问index.jsp页面 或 转发访问index.jsp页面时,该过滤器执行。 @WebFilter(value = "/index.jsp", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})
-
web.xml
添加dispatcher标签,
<filter-mapping><!--过滤器映射--> <filter-name>demo1</filter-name> <url-pattern>指定过滤器作用的对象</url-pattern> <dispatcher>REQUEST</dispatcher><!--FORWARD, INCLUDE, REQUEST, ASYNC, ERROR--> </filter-mapping>
过滤器链
配置多个过滤器
-
执行步骤
假如有两个过滤器,A和B,A先执行,B后执行
graph LR A执行-->B执行 B执行-->资源执行 资源执行-->B执行 B执行-->A执行 -
执行顺序
-
注解配置:
按照类名的字符串比较,字符串逐个字符比较大小,值小的先执行
-
web.xml配置:
按照定义的先后顺序执行
-
案例
1. 登录验证
需求
- 访问登陆案例的资源,验证其是否登录
- 如果登录,则直接放行
- 如果没有登陆,则跳转到登陆页面,提示“尚未登陆,请先登录”
Listener
概念:
web三大组件之一
事件监听机制
-
事件:一件事情
-
事件源:事件发生的地方
-
监听器:一个对象
-
注册监听:将事件、事件源、监听器绑定在一起,当事件源上发生某个时间后,执行监听代码。
步骤
-
定义一个类,实现ServletContextListener接口
-
重写方法
-
配置
-
web.xml
<!-- 配置监听器 --> <listener> <listener-class>com.java.listener.FirstListener</listener-class> </listener> <!-- 配置初始化参数 --> <context-param> <param-name>initParam</param-name> <param-value>listener</param-value> </context-param>
-
注解
@WebListener
-
ServletContextListener
监听ServletContext对象的创建和销毁
方法:
void contextInitialized(ServletContextEvent sce)//ServletContext对象创建后,会调用
void contextDestroyed(ServletContextEvent sce)//ServletContext对象被销毁之前,会调用该方法