(一)Listener
一.概述
- 监听器
- 监听器的内部机制 : 其实就是接口回调
二.接口回调
- 事先先将一个对象传递给A,当A执行到符合某个条件时,通过这个对象,来调用B中的方法,
但是要主义的是,不是直接传递B的实例,而是传递一个接口的实例过去
三.Web监听器
总共8个,分为三种类型
-1- 定义一个类,实现接口
-2- 注册 || 配置监听器 //在web.xml中<listenner> <listenner-class> 定义类的路径 </listenner-class> </listenner>
- - - 监听三个作用域创捷和销毁
三个作用域
request ---httpServletRequest
session ---httpSession
application ---ServletContext
监听器
1. ServletRequestListener
2. HttpSessionListener
3. ServletContextListener
作用:
ServletContextListener : 可以利用它在servletContext创建的时候,完成初始化工作,执行自定义任务调度:Timer
HttpSessionListener :统计在线人数 - - - 监听三个作用域属性状态变更
request ---ServletRequestAttributeListener
session ---HttpSessionAttributeListener
application ---ServletContextAttributeListener
可以监听在作用域中值 添加 | 替换 | 移除的动作 - - - 监听httpSession里面存值的状态变更
这一类监听器不用注册
HttpSessionBindingListener : 用于监听绑定和解除绑定
HttpSessionActivationListener : 用于监听现在session的值 是 钝化(序列化)还是活化(反序列化)的动作
钝化(序列化) : 把内存中的数据 存储到硬盘上
活化(反序列化) : 把硬盘中的数据读取到内存中
session的钝化活化目的:
session中的值可能会很多,并且长时间不使用这个内存中的值,可以将session的值存在硬盘上[钝化],
等下次使用的时候,在从硬盘上提取出来 [活化]
四.优化session(配置钝化活化)
三种配置方式
- 在tomcat里面 conf/context.xml 里面配置
作用范围: 对所有的运行在这个服务器的项目生效 - 在 conf/catalina/locahost/context.xml 配置
作用范围: 对localhost生效 locahost:8080 - 在web工程项目中的 META-INF/context.xml
作用范围: 只对当前的工程生效
maxIdleSwap : 1 代表1分钟不用就钝化
directory : 钝化后的那个文件存放的目录位置<Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="mine"/> </Manager> </Context>
(二)Filter
一.概述
- Filter: 过滤器, 其实就是对客户端发出来的请求进行过滤, 浏览器发出,然后服务器派servlet处理,
在中间就可以过滤, 其实过滤器起到的是拦截的作用.
二.使用
- 定义一个类, 实现Filter接口 implements Filter
- 注册过滤器 //在web.xml里面
三.生命周期
- 创建
服务器启动的时候就创建 - 销毁
服务器停止的时候
四.Filter执行顺序
- 客户端发出请求,先经过过滤器,放行然后到Servlet
- 如果有多个过滤器,那么会按照注册的映射顺序来排队,有一个不放行,那么后边的过滤器与Servlet都收不到请求
五.细节
- init方法的参数FilterConfig,可以用于获取filter在注册的名字,以及初始化参数
- 如果想放行,那么在doFilter方法里边操作,使用参数chain
chain.doFilter(request , response); 放行 ,让请求到达下一个目标 - <url-pattern>/*</url-pattern> 写法格式与servlet一样
- 针对 dispatcher设置
REQUEST : 只要是请求过来,就都拦截 ,默认是REQUEST
FORWARD : 只要是转发都拦截
ERROR : 页面出错发生跳转
INCLUDE : 包含页面的时候就拦截
六.BeanUtils的使用
- 注册自己的日期转换器
ConvertUtils.register(new MyDateConverter() , Date.class );
//转化数据
Map map = request.getParameterMap();
UserBean bean = new UserBean();
//转化map中的数据,放置到bean中
BeanUtils.populate( bean , map);
七.自动登陆中过滤器的思路
- 先判断session是否有效,如果有效,就不用取cookie了,直接放行 chain.doFilter(request , response);
- 如果session失效了,那么就取cookie
- - 没有cookie放行
- - 有cookie
1.取出来cookie的值,然后完成登录
2.把这个用户的值存储到session中
3.放行