Java的Listener与Filter详解

第一部分:监听器(记住原理,组成)
1、什么是监听器
1.1 一个java类监听另一个java类的状态的变化
1.2 监听器的组成(*)
(1)事件源:汽车
(2)监听器:报警器
(3)在事件源上绑定监听器:在汽车上安装报警器
(4)事件:踢汽车一脚(事件源发生变化)
2、javaweb的监听器
2.1 javaweb监听器的分类
第一种:监听三个域对象的创建和销毁(servletcontext、httpsession、request)
(0)监听器如何创建?
= 创建servlet:实现servlet接口,继承实现类;在web.xml中配置
= 创建监听器:实现不同的接口;在web.xml中配置
1、servletcontext域:范围整个web项目,在服务器启动时候创建,服务器关闭时候销毁
(1)实现ServletContextListener 接口,监听servletcontext域的创建和销毁
(2)在接口中有两个方法
= contextInitialized(ServletContextEvent sce) :监听servletcontext域的创建,执行这个方法
= contextDestroyed(ServletContextEvent sce) :监听servletcontext域的销毁,执行这个方法
(3)在web.xml中配置,让服务器知道监听器
  <listener>
  	<listener-class>监听器类的包类路径</listener-class>
  </listener>
2、HttpSession:
(1)实现HttpSessionListener接口
= 有两个方法
== sessionCreated(HttpSessionEvent se) :session创建时候执行这个方法
== sessionDestroyed(HttpSessionEvent se):session销毁时候执行这个方法
(2)范围一次会话,在执行request.getSession()创建,
销毁有三种:非正常关闭服务器、默认过期时间30分钟、调用方法
(3)访问一个JSP会不会创建session?
= 会创建session对象
= jsp会编译成servlet,编译时候创建session对象,session就是jsp的内置对象
访问一个Servlet会不会创建session?
= 不会创建session对象
= 因为没有调用request.getSession(),没有创建session对象
访问一个html会不会创建session?
= 不会创建session对象
顺便说一下session的三种创建方式:
1、 HttpSession session = ServletActionContext.getRequest().getSession(); //创建
2、 ActionContext.getContext().getSession().put("msg", "Hello World from Session!"); //存
session.setAttribute("softtypeid", softtypeid); //存
获取:
if(session.getAttribute("softtypeid")!=null){
if(!softtypeid.equals(session.getAttribute("softtypeid")))
pager_offset=1; //如果不是同一种分类,返回是第一页
}
3、
HttpServletRequest request = ServletActionContext.getRequest();
3、request:
(1)范围一次请求,请求时候创建,请求结束销毁
(2)实现ServletRequestListener 接口
= 有两个方法
== requestInitialized(ServletRequestEvent sre) :request域创建时候执行这个方法
== requestDestroyed(ServletRequestEvent sre) :request域销毁时候执行这个方法
(3)访问JSP的时候会不会创建request对象?
= 会创建request对象
访问Servlet的时候会不会创建request对象?
= 会创建request对象
访问一个html的时候会不会创建request?
= 会创建request对象
第二种:监听三个域对象里面属性的变化(增加、替换、移除)
1、监听servletcontext域里面属性的变化
(1)servletcontext.setAttribute("name",value1); //增加
(2)servletcontext.setAttribute("name",value2); //替换
(3)servletcontext.removeAtribute("name");      //移除
(4)实现ServletContextAttributeListener接口
= 有三个方法
== attributeAdded(ServletContextAttributeEvent scab) :向域对象里面添加属性执行这个方法
== attributeRemoved(ServletContextAttributeEvent scab) :从域对象里面移除属性执行这个方法
== attributeReplaced(ServletContextAttributeEvent scab) :替换域对象里面的属性执行这个方法
2、监听httpsession域里面属性的变化
(1)实现HttpSessionAttributeListener接口
= 有三个方法
== attributeAdded(HttpSessionBindingEvent se) :向域对象里面添加属性执行这个方法
== attributeRemoved(HttpSessionBindingEvent se) :从域对象里面移除属性执行这个方法
== attributeReplaced(HttpSessionBindingEvent se) :替换域对象里面的属性执行这个方法
3、监听request域里面属性的变化
(1)ServletRequestAttributeListener
= 有三个方法
== attributeAdded(ServletRequestAttributeEvent srae) :向域对象里面添加属性执行这个方法
== attributeRemoved(ServletRequestAttributeEvent srae)  :从域对象里面移除属性执行这个方法

== attributeReplaced(ServletRequestAttributeEvent srae) :替换域对象里面的属性执行这个方法

第三种:监听HttpSession域对象里面javabean的变化(*)
4、javabean的变化包含
(1)前两种监听器需要配置,第三种监听不需要配置,自动监听到变化
(2)前两种监听器创建类实现接口,第三种监听器需要在javabean里面实现接口
4.0 使用session域里面javabean的绑定和解除绑定,实现 HttpSessionBindingListener接口
(1)有两个方法
= valueBound(HttpSessionBindingEvent event) :绑定javabean操作,执行这个方法
= valueUnbound(HttpSessionBindingEvent event) :解除绑定javabean操作,执行这个方法
4.1 绑定(把javabean放到session域里面)
4.2 解除绑定(把javabean从session移除)
(1)代码
= 在javabean里面直接实现接口 HttpSessionBindingListener,实现接口里面的两个方法
    <!-- 演示session里面javabean的绑定和解除绑定 -->
    	//创建javabean对象
    	User user = new User();
    	user.setUsername("lucy");
    	user.setPassword("250");
    	//把javabean对象放到session里面  绑定操作
    	session.setAttribute("aaa", user);


    	//把javabean从session里面移除  解除绑定操作
    	session.removeAttribute("aaa");
4.3 使用session域里面javabean的钝化和活化时候,实现HttpSessionActivationListener接口
(1)session如何销毁?
= 有三种方式可以销毁
= 关闭浏览器之后是否会销毁session?
==演示session的销毁?
(1)创建servlet,在servlet里面向session域中放一个值
(2)在servlet里面重定向到一个页面中,在页面中获取session域里面的值
(3)关闭浏览器,直接访问这个页面,值获取不到了
= 为什么获取不到?
== session实现基于cookie技术,cookie的默认分类是会话级别的cookie,关闭浏览器之后会话级别的cookie就没有了。
session本身并没有销毁。
= 使用HttpSessionActivationListener接口实现钝化和活化,在javabean中实现接口
== sessionDidActivate(HttpSessionEvent se) :活化操作
== sessionWillPassivate(HttpSessionEvent se) :钝化操作
4.4 钝化
(1)把session序列化到本地硬盘
(2)如果要把javabean通过session序列化本地,javabean必须实现序列化接口 Serializable
4.5 活化
(1)把本地的session序列化文件反序列化到项目中
4.6 如何演示钝化和活化:正常关闭服务器时候,把session序列化到本地硬盘(在tomcat的work目录)
启动服务器时候,把本地序列化的文件反序列化到项目中
=====================================================
监听器的总结
1、监听器的组成
事件源、监听器、在事件源上绑定监听器、事件
2、javaweb中有三类监听器
(1)第一类 监听三个域对象的创建和销毁
= 访问jsp、servlet、html是否会创建session对象
= 访问jsp、servlet、html是否会创建request对象
(2)第二类 监听三个域对象里面属性的变化(增加、替换、移除)
(3)第三类 监听session域里面javabean的变化
= 不需要配置
= 在javabean实现接口
= 绑定和解除绑定
= 钝化和活化:javabean实现序列化接口
第二部分:过滤器(原理和代码实现掌握)
1、过滤器的简介
1.1 过滤器:在发送请求时候,到目标资源之前,进行的操作
1.2 举生活中的例说明什么是过滤器
(1)饮水机:
= 最终目的:使用饮水机最终需要把饮水机中的水流到杯子中
= 在饮水机里面过滤网,过滤杂质
= 如果水要流到杯子中,需要经过过滤网,过滤网起到就是过滤器的作用
(2)地铁安检
= 最终目的:在地铁列车上
= 在到地铁的列车上之前,进行安检,起到检查是否有违禁物品,安检起到过滤器的作用
(3)吸烟
= 最终目的:把烟吸到体内
= 烟= 主体(纸+烟草)+过滤嘴,用嘴叼着过滤嘴,起到过滤烟中有害物质,起到过滤器的作用
1.3 举程序中的例说明过滤器
(1)论坛发表言论
= 最终目的:把写内容显示到页面中
= 过滤内容,查看内容中是否有反动言论,如果有进行屏蔽,起到过滤器的作用
2、过滤器的入门
2.1 实现的方式
(1)创建类,实现接口 Filter
(2)在web.xml中进行配置(让服务器知道是一个过滤器)
<filter>
  	<filter-name>filter01</filter-name>
  	<filter-class>cn.itcast.filter01.TestFilter01</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>filter01</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
(3)在过滤的方法里面,要进行 放行 操作,才能到达目标资源  chain.doFilter(request, response);
3、FilterChain对象的介绍
3.1 过滤器链
(1)有一个请求,这个请求可以使用多个过滤器进行过滤
(2)一个过滤器要到下一个过滤器,这个过滤器必须做 放行的操作
(3)在接口里面有一个方法,放行的方法
doFilter(ServletRequest request, ServletResponse response)
3.2 过滤器的执行顺序
(1)与filter的filter-mapping的配置有关
  <filter-mapping>
  	<filter-name>filter02</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
4、过滤器的生命周期4.1 servlet的生命周期(1)在servlet创建时候执行init方法,servlet在第一次访问时候创建,创建一次(2)每次访问servlet,调用service方法,调用多次(3)servlet销毁时候,执行destroy方法4.2 过滤器的生命周期(1)过滤器在什么时候创建,创建时候执行哪个方法?= 在服务器启动时候创建过滤器,执行init方法(2)过滤的时候执行哪个方法,执行几次?= 每次过滤时候执行doFilter方法,执行多次(3)过滤器销毁时候执行哪个方法?= 执行 destroy方法5、FilterConfig对象的介绍5.1 这个对象和servlet里面 servletConfig对象很相似

(1)servletConfig对象可以获取初始化参数、获取servlet的name....

5.2 FilterConfig做的事情(1)获取filter的name,是配置文件中 <filter-name>里面的值= getFilterName()= 代码//获取filter的name <filter-name>filterconfig</filter-name>String filterName = filterConfig.getFilterName();(2)获取初始化参数= 初始化参数的配置= 在web.xml中的filter的标签里面配置
<init-param>
  		<param-name>username</param-name>
  		<param-value>lucymary</param-value>
  	</init-param>
=  String getInitParameter(String name) :根据参数的名称得到值
= 代码
String username = filterConfig.getInitParameter("username");
String password = filterConfig.getInitParameter("password");
=  Enumeration getInitParameterNames()  :得到所有初始化参数的名称
= 代码
Enumeration<String> enumration =  filterConfig.getInitParameterNames();
	//遍历得到每一个名称
	while(enumration.hasMoreElements()) {
		String name = enumration.nextElement();
		//根据名称得到值
		String value = filterConfig.getInitParameter(name);
		System.out.println("*********** "+name+":"+value);
	}
(3)获取servletcontext对象
= getServletContext()
6、过滤器的配置
6.1 filter-mapping里面写的配置
(1)<url-pattern>
= 有三种写法
= 第一种:完全路径匹配
= 第二种:目录匹配  /*
= 第三种:扩展名匹配 *.action
(2)<servlet-name>:只是过滤某一个servlet,里面值是servlet的路径
(3)<dispatcher>:里面有四个值
REQUEST(*):过滤所有的请求,默认就是这个值
FORWARD(*):只能过滤器转发的操作
INCLUDE:包含内容
ERROR:异常
7、案例一:统一网站字符集编码过滤器
7.1 如果向页面输出中文会有乱码问题,在每个servlet里面需要设置
写过滤器,在过滤器里面设置编码方式
7.2 在过滤器里面设置request和response
7.3 代码
public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//设置中文乱码问题
		response.setContentType("text/html;charset=utf-8");
		//放行
		chain.doFilter(request, response);
	}
8、案例二:自动登录的过滤器(****)
8.1 如果登录过一次网站,下次在访问这个网站时候不需要登录直接操作
8.2 实现登录的基本功能
(1)创建登录页面,在登录页面写表单,提交到servlet
(2)创建servlet,获取输入的用户名和密码,查询数据库判断是否相同
8.3 实现自动登录分析
(1)在登录页面中,添加复选框,如果复选框选中实现自动登录,如果没有选中不实现
(2)实现登录的基本逻辑,在登录成功之后,判断是否需要自动登录
= 如何判断是否需要自动登录?
== 在servlet里面获取复选框的值,如果值不为空,就是选中状态
(3)如果复选框是选中状态,实现自动登录
= 关闭浏览器之后,打开浏览器值还能获取到
= 使用持久化cookie实现,在一定范围内一致有效
== cookie分成两类:会话cookie和持久化cookie
= cookie的操作
== 把内容放到cookie: new Cookie("name","value");
== 回写到浏览器中:   response.addCookie(cookie);
== 设置持久化cookie:setMaxAge(秒)  setPath("/")
(4)创建过滤器实现自动登录
= 最终目的:从存到cookie里面的用户名和密码获取出来
8.4 总结
1、在servlet里面如何判断复选框是否选中
(1)使用request.getParameter()得到复选框的值
如果复选框没有选中,得到null
如果选择复选框里面的value的值
2、持久化cookie的使用
cookie.setMaxAge(3600);
cookie.setPath("/");
3、向cookie中存中文数据
(1)先把中文进行编码(url编码),把编码之后内容放到cookie中
4、解码url编码之后的内容和操作cookie
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值