(一)监听器的概述
1、什么是监听器
监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java类的方法调用,或者属性的改变。当被监听对象发生上述事件后,监听器某个方法将会立即被执行
2、监听器的用途
用来监听其他对象的变化的,主要应用在图形化界面的开发上
例如Java中的GUI、Android等,都有大量的监听器的使用
3、监听器的术语
事件源:指的是被监听对象(汽车)
监听器:指的是监听的对象(报警器)
事件源和监听器绑定:在汽车上安装报警器
事件:指的是事件源对象的改变(踹了汽车一脚),主要功能是获得事件源对象
(二)监听器的入门
1、监听器的入门程序
2、监听器的执行过程
(三)Servlet中的监听器
一、Servlet中的监听器简介
在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和ServletRequest这三个域对象
二、Servlet中的监听器的分类
1、一类:监听三个域对象的创建和销毁的监听器(三个)
2、二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)
3、三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)
(四)ServletContextListener监听器的使用
一、ServletContextListener监听器的作用
用来监听ServletContext域对象的创建和销毁的监听器
二、ServletContext创建和销毁
1、创建:在服务器启动的时候,为每个Web应用创建单独的ServletContext对象
2、销毁:在服务器关闭的时候,或者项目从Web服务器中移除的时候
三、ServletContextListener监听器的方法
1、监听ServletContext对象的创建
contextInitialized(ServletContextEvent sce)
2、监听ServletContext对象的销毁
contextDestroyed(ServletContextEvent sce)
四、编写监听器
1、监听器的代码
2、监听器的配置
五、ServletContextListener的企业用途
1、加载框架的配置文件
Spring框架提供了一个核心监听器叫ContextLoaderListener
2、定时任务调度
(五)HttpSessionListener监听器的使用
一、HttpSessionListener监听器作用
用来监听HttpSession对象的创建和销毁
二、HttpSession创建和销毁
创建:
服务器端第一次调用getSession()方法的时候
销毁:
非正常关闭服务器(正常关闭服务器Session会被序列化)
Session过期(默认过期时间30分钟)
手动调用session.invalidate()方法
三、HttpSessionListener监听器的方法
1、监听HttpSession对象创建
sessionCreated(HttpSessionEvent se)
2、监听HttpSession对象销毁
sessionDestroyed(HttpSessionEvent se)
四、编写监听器监听HttpSession对象创建和销毁
1、监听器的代码
2、监听器的配置
3、问题:
访问HTML是否会创建Session?不会
访问JSP是否会创建Session?会
访问Servlet是否会创建Session?不会(默认没有调用getSession方法)
(六)ServletRequestListener监听器的使用
一、ServletRequestListener监听器的作用
用于监听ServletRequest对象的创建和销毁
二、ServletRequest对象的创建和销毁
创建:从客户端向服务器发送一次请求,服务器就会创建Request对象
销毁:服务器对这次请求作出了响应之后,Request对象就销毁了
三、ServletRequestListener监听器的方法
1、监听ServletRequest对象的创建
requestInitialized(ServletRequestEvent sre)
2、监听ServletRequest对象的销毁
requestDestroyed(ServletRequestEvent sre)
四、编写监听器代码
1、监听器代码
2、监听器配置
3、问题:
访问HTML页面是否创建请求对象?会
访问JSP页面是否创建请求对象?会
访问Servlet是否创建请求对象?会
(七)统计当前在线人数的案例
一、案例分析
在服务器启动的时候需要有一个初始值为零。
当浏览器访问服务器上的某个JSP了,就会创建Session,
此时获取初始值,进行+1操作。
如果Session销毁了,获取该值进行-1操作
二、代码实现
1、创建ServletContextListener进行初始化
2、创建HttpSessionListener
3、配置监听器
4、创建JSP页面
(八)监听三个域对象的属性变更的监听器
一、三类监听器
1、ServletContextAttributeListener
监听ServletContext对象中的属性变更(属性添加、移除、替换)的监听器
attributeAdded(ServletContextAttributeEvent event)
attributeRemoved(ServletContextAttributeEvent event)
attributeReplaced(ServletContextAttributeEvent event)
2、HttpSessionAttributeListener
监听HttpSession对象中的属性变更(属性添加、移除、替换)的监听器
attributeAdded(HttpSessionBindingEvent event)
attributeRemoved(HttpSessionBindingEvent event)
attributeReplaced(HttpSessionBindingEvent event)
3、ServletRequestAttributeListener
监听ServletRequest对象中的属性变更(属性添加、移除、替换)的监听器
attributeAdded(ServletRequestAttributeEvent srae)
attributeRemoved(ServletRequestAttributeEvent srae)
attributeReplaced(ServletRequestAttributeEvent srae)
二、演示第二类监听器
1、演示HttpSessionAttributeListener
2、配置监听器
3、编写测试的JSP
(九)监听HttpSession中Java类状态改变的监听器
一、第三类监听器概述
1、保存在Session域中的Java类可以有多种状态:绑定到Session中、从Session中解除绑定、随Session对象持久化到一个存储设备中(钝化)、随Session对象从一个存储设备中恢复(活化)
2、Servlet规范中中定义了两个特殊的监听的接口,来帮助Java类了解自己在Session域中的状态,分别是:
HttpSessionBindingListener接口
HttpSessionActivationListener接口
实现了这两个接口的类,是不需要在web.xml中进行配置的
二、HttpSessionBindingListener监听器
1、监听Java类在HttpSession中的绑定和解除绑定的状态的监听器
valueBound(HttpSessionBindingEvent event)
valueUnbound(HttpSessionBindingEvent event)
2、测试代码
三、HttpSessionActivationListener监听器
1、监听HttpSession中Java类的钝化和活化的监听器
sessionDidActivate(HttpSessionEvent se)
sessionWillPassivate(HttpSessionEvent se)
2、测试代码
3、配置完成Session的序列化和反序列化
Context标签可以配置在:
Tomcat/conf/context.xml:所有Tomcat下虚拟主机和虚拟目录下的工程都会序列化Session
Tomcat/conf/Catalina/localhost/context.xml:只有localhost虚拟主机下的所有项目会序列化Session
工程/META-INF/context.xml:只有当前工程才会序列化Session
(十)Filter
一、Filter的概述
1、什么是Filter
Filter称为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对Web服务器所管理的资源(JSP、Servlet、静态图片、静态html文件等)进行拦截,从而实现一些特殊的功能
Filter就是过滤从客户端向服务器发送请求
2、为什么学习过滤器
二、Filter的入门
1、第一步:编写一个类实现Filter接口
2、第二步:对过滤器进行配置
三、FilterChain对象的概述
1、什么是FilterChain
FilterChain过滤器链:在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链
Web服务器根据Filter在web.xml文件中的注册顺序(mapping的配置顺序)决定先调用哪个Filter,依次调用后面的过滤器,如果没有下一个过滤器,则调用目标资源
2、FilterChain的演示
四、Filter的生命周期
1、Filter的生命周期描述
Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,Web服务器创建Filter的实例对象,并调用其init方法进行初始化的操作(Filter对象只会创建一次,init方法也只会执行一次)
每次Filter进行拦截的时候,都会执行doFilter的方法
当服务器关闭的时候,或者应用从服务器中移除的时候,服务器会销毁Filter对象
2、FilterConfig对象的概述
(1)FilterConfig对象的作用:
用来获得Filter的相关的配置的对象
(2)FilterConfig对象的API
getFilterName()
getInitParameter(String name)
getInitParameterNames()
getServletContext()
3、FilterConfig的演示
五、过滤器的相关配置
1、
完全路径匹配:以/开始,例如/aaa /aaa/bbb
目录匹配:以/开始,例如/* /aaa/* /aaa/bbb/*
扩展名匹配:不能以/开始,以*开始,例如*.jsp *.do *.action
2、
专门以Servlet的配置的名称拦截Servlet
3、
默认的情况下,过滤器会拦截请求,如果进行转发(需要拦截这次转发)
dispatcher的取值有四个:
REQUEST:默认值。默认过滤器拦截的就是请求
FORWARD:转发
INCLUDE:页面包含的时候进行拦截
ERROR:页面出现全局错误页面跳转的时候进行拦截
(十一)权限验证过滤器
一、案例需求
现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录,直接在地址栏上输入后台页面地址
编写一个过滤器,可以对没有登录的用户进行拦截(没有登录,回到登录页面;如果已经登录,放行)
二、案例登录功能
1、创建表(MySQL执行如下语句)
create database web05 charset utf8;
use web05;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20)
)charset utf8;
insert into user values (null,'aaa','123');
2、搭建项目的环境
3、代码实现
三、权限验证的过滤器实现
(十二)通用的字符集编码过滤器的分析
一、案例需求
假设网站需要向后台提交中文的数据(有可能是GET,也有可能是POST),中文处理根据不同的请求方式,处理的方式也是不同的
需要调用request.getParameter();方法接收数据,但是这时会存在乱码,如果想调用request.getParameter()方法,无论是get还是post请求,提交的中文都没有乱码
二、增强一个类的方法
1、通过上面的分析,现在要增强request的getParameter方法,增强的过程要写在过滤器当中
(1)如何增强一个类中的方法?
1)继承
必须要能够控制这个类的构造
2)装饰者
被增强的类和增强的类需要实现相同的接口
在增强的类中获得被增强的类的引用
缺点:接口中的方法过多,会导致要重写很多其他的方法
3)动态代理
类需要实现接口
三、通用的字符集编码过滤器的代码实现
1、过滤器的代码
2、增强类的代码