1.1、Listener概述
- 他是一个接口,内容由自己实现
- 他需要注册
- 监听器中的方法,会在特殊事件发生时被调用
1.2、JavaWeb中的监听器(三大域)
- ServletContext
- 生命周期监听:ServletContextListener,有两个方法,一个在出生时调用,一个在死亡时调用
- void contextInitialized(ServletRequest sr);创建 context的时候
- void contextDestroyed(ServletRequest sr);销毁 context的时候
- 属性监听:ServletContextAttributeListener,有三个方法,分别在创建属性,替换属性,移除属性时调用
- 生命周期监听:ServletContextListener,有两个方法,一个在出生时调用,一个在死亡时调用
- HttpSession
- 生命周期监听:HttpSessionListener,有两个方法,一个在出生时调用,一个在死亡时调用
- void sessionCreated(HttpSessionEvent se):创建session时被调用
- void sessionDestroyed(HttpSessionEvent se):销毁session时被调用
- 属性监听:HttpSessionAttributeListener,有三个方法,分别在创建属性,替换属性,移除属性时调用
- 生命周期监听:HttpSessionListener,有两个方法,一个在出生时调用,一个在死亡时调用
- ServletRequest
- 生命周期监听:ServletRequestListener,有两个方法,一个在出生时调用,一个在死亡时调用
- void requestInitialized(ServletRequest sr);创建Request的时候
- void requestDestroyed(ServletRequest sr);销毁Request的时候
- 属性监听:ServletRequestAttributeListener,有三个方法,分别在创建属性,替换属性,移除属性时调用
- 生命周期监听:ServletRequestListener,有两个方法,一个在出生时调用,一个在死亡时调用
1.3、JavaWeb中编写监听器
-
写一个监听器类,要求必须去实现某个监听器接口(三大域接口);
-
注册,是在web.xml中配置来完成注册;
<listener> <listener-class></listener-class> </listener>
1.4、事件对象
- ServletContextEvent:ServletContext getServletContext();
- HttpSessionEvent:HttpSession getSession();
- ServletRequest:
- ServletContext getServletContext();
- ServletRequest getServletRequest();
1.5、感知监听
- 它用来添加到JavaBean上,而不是添加到三大域上!
- 无需再web.xml中注册
(1)HttpSessionBindingListener:监听Javabean是否被添加到session中
(2)HttpSessionActivationListener:监听Session的钝化和活化
2.1、Filter概述
- 他会在一组资源(jsp、servlet、.css、.html)被访问之前执行,拥有拦截请求的能力,是单例的
2.2、过滤器的编写
-
写一个类实现Filter接口
-
在web.xml中进行配置
<filter> <filter-name>aFilter</filter-name> <filter-class>com.arivan.filter.AFilter</filter-class> </filter> <filter-mapping> <filter-name>aFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
2.3、Filter接口
-
void init(FilterConfig);
- 创建之后立马执行,Filter会在服务器启动时就创建
-
void destroy();
- 销毁之前执行!Filter在服务器关闭前销毁
-
void doFilter(ServletRequest,ServletResponse,FilterChain);
- 每次过滤时都会执行,FilterChain可以做放行操作
2.4、多个过滤器
如果没有下一个过滤器,则执行目标资源,如果有,自执行下一个过滤器
2.5、过滤器的四种拦截方式
- 拦截请求 REQUEST
- 拦截转发 FORWARD
- 拦截包含 INCLUDE
- 拦截错误 ERROR
2.6、过滤器的应用场景
- 执行目标资源之前做预处理工作,例如设置编码
- 通过条件判断决定是否放行,例如校验当前用户是否已经登录
- 在执行目标资源后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理
2.7、过滤器解决全站编码问题
public class BFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
if (httpServletRequest.getMethod().equals("GET")) {
//解决GET请求的乱码
EncodingRequest encodingRequest = new EncodingRequest(httpServletRequest);
chain.doFilter(encodingRequest, response);
} else if (httpServletRequest.getMethod().equals("POST")){
//解决POST请求的乱码
response.setCharacterEncoding("utf-8");
}
}
public void init(FilterConfig config) throws ServletException {
}
}
public class EncodingRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
public EncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
String parameter = this.request.getParameter(name);
try {
parameter = new String(parameter.getBytes("iso-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return parameter;
}
}