监听器与过滤器
监听器
监听器主要是用于监听某个对象状态变化的组件。
监听器相关术语:
-
事件源:被监听的对象
-
监听器:监听事件源的对象(主要有八个)
-
注册监听器:监听器与事件源绑定
-
响应:监听事件源发生变化时,产生的行为
监听器划分:
- 域监听器
- 属性监听器
域监听器
域监听器主要有ServletContextListener监听器、HttpSessionListener监听器和ServletRequestListener监听器(由于请求太频繁很少使用)三个。
以ServlettContextListener为例建立一个监听器。其他的与之类似。
package com.pony.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @author pony
* @date 2020/4/21
*/
/**
* 创建一个监听器必须要实现对应的接口。还要在web.xml中去做关联如下
<listener>
<listener-class>com.pony.listener.ServletContextListenerTest</listener-class>
</listener>
*/
public class ServletContextListenerTest implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
/**
* 获取当前监听对象:
*/
ServletContext servletContext = sce.getServletContext();
ServletContext source = (ServletContext) sce.getSource();
// System.out.println("init servlet");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// System.out.println("destory servlet");
}
}
属性监听器
主要有三个:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttriListener。用法与
域监听器相同。
过滤器
当访问资源时可以设置一些过滤器从而对一些请求进行筛选,过滤器嘛,顾名思义。
实现步骤
-
实现filter接口
package com.pony.web.filter; import javax.servlet.*; import java.io.IOException; /** * @author pony * @date 2020/4/21 */ public class FirstFilter 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("来到了firstservlet过滤器"); /** * 放行 */ filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
-
web.xml配置
<filter> <filter-name>myfilter</filter-name> <filter-class>com.pony.web.filter.FirstFilter</filter-class> </filter> <filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
生命周期
init()方法在服务器开启的时候就创建
destory()方法在服务器关闭时调用
doFilter()方法当匹配到mapping时才调用