第六章:监听器与过滤器
第1节:监听器
知识点1:监听器的作用
1.定义
当事件发生的时候,需要进行一些处理,就可以使用监听器处理.
2.作用
监听器监听的是事件,当事件发生的时候,监听器进行相应的处理.
知识点2:监听器相关API
1.事件类
事件类定义了事件类型
Servlet API定义了6种事件类型:
(1)上下文相关事件
①ServletContextEvent:上下文事件
1)触发时机
当上下文对象发生改变,比如:创建上下文,销毁上下文的时候,会触发上下文事件
2)创建上下文
服务器启动的时候会触发创建上下文事件
3)销毁上下文
服务器停止的时候会触发销毁上下文事件
②ServletContextAttributeEvent:上下文属性事件
1)触发时机
当上下文的属性发生改变,如添加,删除,覆盖上下文的属性时,会触发上下文属性事件
2)添加上下文的属性
调用servletContext.setAttribute(name,value)方法的时候会触发上下文属性事件
3)删除上下文属性
调用servletContext.removeAttribute(name)方法的时候会触发上下文属性事件
4)覆盖上下文属性
调用servletContext.setAttribute(name,value)方法的时候会触发上下文属性事件
(2)请求相关事件
①ServletRequestEvent:请求事件
1)触发时机
请求对象发生改变的时候,创建请求对象,销毁请求对象的时候会触发请求事件.
2)创建请求对象
当客户端浏览器请求一个servlet的时候就会创建请求对象,就会触发请求事件
3)销毁请求对象
当服务器将响应发送给客户端浏览器以后请求对象被销毁,也会触发请求事件
②ServletReqeustAttributeEvent:请求属性事件
1)触发时机
当请求属性发生改变,如:添加,删除,覆盖请求的属性,会触发请求属性事件
2)添加请求属性
调用request.setAttribute(name,value)方法时会触发请求属性事件
3)删除请求属性
调用request.removeAttribute(name)方法时会触发请求属性事件
4)覆盖请求属性
调用request.setAttribute(name,value)方法时会触发请求属性事件
(3)会话相关事件
①HttpSessionEven会话事件
会话对象发生改变,创建会话对象,销毁会话对象,活化或者钝化会话对象,会触发会话事件.
1)创建会话对象
调用request.getSession()方法或者request.getSession(true)创建session会话对象,会触发会话事件
2)销毁会话对象
默认30分钟.销毁会话对象,会触发会话事件
web.xml配置 50分钟 销毁会话对象,会触发会话事件
调用session.invalidate()方法销毁会话对象,会触发会话事件
调用session.setMaxInactiveInterval(多少秒)方法销毁会话对象,会触发会话事件
3)活化会话对象
session会话对象从磁盘取出反序列化到内存形成session会话对象,活化会话对象,会触发会话事件
4)钝化会话对象
session会话对象序列化到磁盘,钝化会话对象,会触发会话事件
②HttpSessionBindingEvent会话绑定事件
1)触发时机
当会话属性发生改变,如:添加,删除,覆盖会话的属性,会触发会话绑定事件
2)添加会话属性
调用session.setAttribute(name,value)方法时会触发请求绑定事件
3)删除会话属性
调用session.removeAttribute(name)方法时会触发请求绑定事件
4)覆盖会话属性
调用session.setAttribute(name,value)方法时会触发请求绑定事件
2.监听器接口
监听器接口定义了监听事件的方法
Servlet API中定义了8种监听器接口,用来监听不同的事件类型
(1)上下文相关的监听器
①上下文监听器ServletContextListener,监听上下文事件ServletContextEvent
②上下文属性监听器ServletContextAttributeListener,监听ServletContextAttributeListener上下文属性事件
(2)请求相关的监听器
①请求监听器ServletRequestListener
②请求属性监听器ServletRequestAttributeListener
(3)会话相关的监听器
会话监听器HttpSessionListener
会话活化监听器HttpSessionActivationListener
会话属性监听器HttpSessionAttributeListener
会话绑定监听器 HttpSessionBindingListener
知识点3:监听器的开发与配置
写一个类实现XXXListener接口
重写接口中的方法,实现监听的功能
web.xml配置listener
1、创建MyContextListner
2、重写接口中的方法,实现监听的功能
package com.tjetc.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Application Lifecycle Listener implementation class MyContextLisener
*
*/
public class MyContextLisener implements ServletContextListener {
/**
* Default constructor.
*/
public MyContextLisener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("MyContextLisener.contextDestroyed()..."+sce.getServletContext());
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("MyContextLisener.contextInitialized()..."+sce.getServletContext());
}
}
输出:
信息: 正在启动 Servlet 引擎:[Apache Tomcat/9.0.34]
MyContextLisener.contextInitialized()…
知识点4:上下文相关监听器
①创建MyContextAttributeListener,实现ServletContextAttributeListener接口
②重写接口的方法
③写MyContextAttributeServlet,向上下文添加属性,覆盖属性,删除属性
④运行MyContextAttributeServlet
package com.tjetc.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
* Application Lifecycle Listener implementation class MyContextAttributeLisener
*
*/
public class MyContextAttributeLisener implements ServletContextAttributeListener {
/**
* Default constructor.
*/
public MyContextAttributeLisener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextAttributeListener#attributeAdded(ServletContextAttributeEvent)
*/
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("MyContextAttributeLisener.attributeAdded():"+scae.getName()+"="+scae.getValue());
}
/**
* @see ServletContextAttributeListener#attributeRemoved(ServletContextAttributeEvent)
*/
public void attributeRemoved(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
System.out.println("MyContextAttributeLisener.attributeRemoved():"+scae.getName()+"="+scae.getValue());
}
/**
* @see ServletContextAttributeListener#attributeReplaced(ServletContextAttributeEvent)
*/
public void attributeReplaced(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
System.out.println("MyContextAttributeLisener.attributeReplaced():"+scae.getName()+"="+scae.getValue());
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到上下文对象
ServletContext servletContext = getServletContext();
//向上下文中添加属性
servletContext.setAttribute("name", "zs");
//覆盖属性
servletContext.setAttribute("name", "lisi");
//删除属性
servletContext.removeAttribute("name");
response.getWriter().append("Served at: ").append(request.getContextPath());
}
输出:
MyContextAttributeLisener.attributeAdded():name=zs MyContextAttributeLisener.attributeReplaced():name=zs MyContextAttributeLisener.attributeRemoved():name=lisi
知识点5:会话相关监听器
HttpSessionListener:会话监听器,当会话对象被创建后或销毁前需要一些自定义处理时,可以用此监听器监听;
HttpSessionActivationListener:会话活化监听器,会话对象存在于服务器端,只要没有失效,服务器就得分配空间给其使用;为了能够提高使用效率,服务器有内在的活化钝化机制,可以将暂时不使用的会话对象钝化到外存,需要使用时再活化到内存。当活化后或钝化前需要一些自定义处理时,可以使用该监听器;
HttpSessionAttributeListener:会话属性监听器,当会话中的属性被添加、删除、替换时,要进行一些自定义处理时,可以使用该监听器,使用时可以用事件对象获取属性的名字等信息。
HttpSessionBindingListener:会话绑定监听器,当类实现了HttpSessionBindingListener接口后,该类对象绑定或解除绑定到会话时,就会被该监听器监听。绑定指的是调用setAttribute方法,解除绑定指的是调用removeAttribute方法,或者会话超时、会话失效等。
第2节:过滤器
知识点1:过滤器的作用
把通用的、相同的处理代码用过滤器实现,可以共享,然后在web.xml中将过滤器配置给相关的资源使用即可
知识点2:过滤器的开发方法
1.写一个类实现Filter接口
2.重写Filter接口的三个方法

知识点3:过滤器的各个方法执行顺序
1.构造方法
2.init(filterConfig)初始化方法
3.doFilter()方法
4.destroy()方法
package com.tjetc.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
*/
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
知识点4:FilterConfig接口方法
MyFilter的初始化方法:
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("MyFilter.init()方法:"+fConfig);
String filterName = fConfig.getFilterName();
System.out.println(filterName);
//得到初始化参数的值
String name = fConfig.getInitParameter("name");
System.out.println(name);
//得到所有初始化参数的名字
Enumeration<String> names = fConfig.getInitParameterNames();
while (names.hasMoreElements()) {
String string = (String) names.nextElement();
System.out.println(string);
}
//得到上下文对象
ServletContext servletContext = fConfig.getServletContext();
System.out.println(servletContext);
}
知识点5:FilterChain接口的方法
知识点6:编码过滤器
package com.tjetc.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* Servlet Filter implementation class CodeFilter
*/
public class CodeFilter implements Filter {
FilterConfig filterConfig;
/**
* Default constructor.
*/
public CodeFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
String encoding = filterConfig.getInitParameter("encoding");
System.out.println(encoding);
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
filterConfig=fConfig;
}
}
输出:
UTF-8
赵六