过滤器filter,监听器Listener
过滤器(filter)
将浏览器请求的数据进行过滤,对于服务器向浏览器的相应进行过滤
//TODO:当访问/servlet1时,会先经过MyFilter1过滤器,再经过MyServlet1
@WebFilter("/servlet1")
public class MyFilter1 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter1过滤器执行了");
// 放行,继续执行下一个过滤器或目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
Filter的生命周期:
初始化方法(init):
Filter的创建和销毁由Web服务器负责(Tomcat)
拦截请求方法(doFilter):
当浏览器客户端访问与过滤器有关联的URL的时候,Servlet过滤器会先执行doFilter方法,在通过FilterChain参数
去访问后续的过滤器或者直接访问对应的资源
销毁方法(destroy):
Filter对象在创建了之后会驻留在内存中,当Web应用移除的时候或者服务器停止的时候才会销毁,在Web容器卸载Filter对象之前被调用,用于释放过滤器使用的资源。
@WebFilter("/servlet1")
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter2过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter2过滤器执行了");
// 放行,继续执行下一个过滤器或目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
//关闭Tomcat的时候会执行该方法
@Override
public void destroy() {
System.out.println("MyFilter2过滤器销毁");
}
}
过滤器实现设置字符编码
//过滤器实现设置字符编码
@WebFilter("/servlet2")
public class MyFilter3 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// TODO:设置为utf-8编码
HttpServletRequest request = (HttpServletRequest) servletRequest;
request.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}
通过Filter实现页面总的统计量PV:通过Ctrl+shift+delete去进行清除缓存
//TODO:通过Filter实现统计页面总的访问量PV
@WebFilter("/*")
public class MyFilter4 implements Filter {
private final static String PV_COUNT = "pvCount";
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
ServletContext application = request.getServletContext();
Integer count = (Integer)application.getAttribute(PV_COUNT);
if (count == null){
//第一次访问
application.setAttribute(PV_COUNT,1);
}else {
//不是第一次访问
int count1 = count;
application.setAttribute(PV_COUNT,count1+1);
}
System.out.println("当前的页面访问量为:"+ application.getAttribute(PV_COUNT));
filterChain.doFilter(servletRequest,servletResponse);
}
}
监听器(Listener)
在Javaweb中用于监听Servlet的三个作用域的程序就是监听器,Javaweb的Servlet作用域对象:ServletContext/HttpSession/HttpServletRequest
三个对象
(应用程序/会话/请求)—》三个对象
监听器的基础:
监听生命周期的变化:
ServletContextListener:监听ServletContext生命周期
HttpSessionListener:监听HttpSession生命周期
HttpServletRequestListener:监听HttpServletRequest生命周期
监听属性变化:(setAttribute,getAttribute,removeAttribute)
ServletContextAttributeListener:监听ServletContext属性变化
HttpSessionAttributeListener:监听HttpSessionListener属性变化
HttpServletRequestAttributeListener:监听HttpServletRequest属性变化
Request域的监听器:–一次请求的时间是很短的
两个监听器的接口
ServletRequestListener:生命周期监听
ServletRequestAttributeListener:属性监听
@WebListener
public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener {
// 请求初始化监听
public void requestInitialized(javax.servlet.ServletRequestEvent servletRequestEvent) {
System.out.println("请求初始化");
}
// 请求销毁监听
public void requestDestroyed(javax.servlet.ServletRequestEvent servletRequestEvent) {
System.out.println("请求销毁");
}
// 请求属性添加监听
public void attributeAdded(javax.servlet.ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("添加属性");
}
// 请求属性删除监听
public void attributeRemoved(javax.servlet.ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("删除属性");
}
// 请求属性替换监听
public void attributeReplaced(javax.servlet.ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("替换属性");
}
}
Session域的监听器:
两个监听器的接口
HttpSessionListener:生命周期监听
HttpSessionAttributeListener:属性监听
@WebListener
public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("SessionListener监听到属性添加了");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("SessionListener监听到属性删除了");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("SessionListener监听到属性替换了");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("SessionListener监听到session创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("SessionListener监听到session销毁了");
}
}
ServletContext域的监听器:
两个监听器的接口
ServletContextListener:生命周期监听—Tomcat一启动就监听
ServletContextAttributeListener:属性监听
public class ContextListener implements ServletContextListener, ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("ServletContextAttributeListener监听器监听到ServletContext的属性被添加了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener监听器监听到ServletContext被销毁了");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextListener监听器监听到ServletContext被创建了");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("ServletContextAttributeListener监听器监听到ServletContext的属性被替换了");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("ServletContextAttributeListener监听器监听到ServletContext的属性被移除了");
}
}