Servlet、Filter、Listener

本文详细介绍了Servlet、Filter和Listener在JavaWeb中的应用。过滤器(Filter)主要用于拦截用户对资源的访问,实现权限控制和数据处理等功能。文章通过实例演示了过滤器的开发步骤、配置以及核心方法。监听器(Listener)则用于监听对象状态变化,包括ServletContext、HttpSession和ServletRequest等。文章阐述了监听器的开发和注册过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 过滤器
1.1 过滤器概述
1.1.1 什么是过滤器?
Servlet技术规范中,定义了Servlet、Filter、Listener三门技术, 其中Filter也叫做过滤器,通过过滤器技术,开发人员可以实现用户在访问某个资源之前或之后,对访问的请求和响应进行拦截,从而做一些相关的处理。

总结:

1.所谓的过滤器,就是拦截用户对资源的访问

2.一个过滤器可以拦截多个资源,一个资源也可以配置多个过滤器进行拦截

3.其实所谓的拦截,就是将代表请求的request对象和代表响应的response对象拦截下来,拦截下来后:

(1)控制是否允许访问 – 比如:用户登陆之后才能访问自己的订单或购物车

(2)在访问资源之前或之后做一些处理 比如: 全站乱码解决

1.2 开发过滤器
1.2.1 开发过滤器的步骤
Servlet API中提供了一个Filter接口,开发web应用时,如果编写一个类实现了这个接口,则这个类就是一个过滤器类。

(1)写一个类实现Filter接口,并实现其中的方法

(2)在web应用的web.xml中配置过滤器所拦截的路径

1.2.2 过滤器的配置
在创建完Filter类之后,需要在web应用的web.xml文件中配置过滤器所要拦截的资源路径,具体配置如下:

1.2.3 过滤器案例1
1、需求:创建两个Servlet,分别为ServletDemo1和ServletDemo2.分别来处理不同的请求。创建一个过滤器并配置过滤器拦截浏览器对ServletDemo1和ServletDemo2的访问.

2、实现步骤:

(1)创建两个Servlet,分别是ServletDemo1和ServletDemo2。

(2)ServletDemo1代码实现如下

(2)ServletDemo2代码实现如下

(3)测试ServletDemo1:

(4)测试ServletDemo2:

(5)创建一个过滤器,实现Filter接口

(6)FilterDemo1中doFilter方法的实现:

(7)配置过滤器对两个Servlet进行拦截.

(8)分别访问ServletDemo1和ServletDemo2,查看FilterDemo是否会对这两资源的请求进行拦截处理.

1.2.4 过滤器案例2
改造上面的过滤器案例,允许用户在访问之前,在请求中携带两个“暗号“,接着配置两个过滤器对访问ServletDemo1和ServletDemo2的请求进行拦截,拦截之后判断输入的暗号。例如第一个过滤器判断第一个暗号,第二个过滤器判断第二个暗号。只有当两个暗号都正确时,才允许访问ServletDemo1和ServletDemo2。只要有一个过滤器判断暗号错误,将会跳转到提示页面提示暗号错误。

(1)编写code.jsp用来让用户输入暗号

(2)编写error.jsp用来提示(当用户输入的暗号不正确时,跳转到error页面进行提示)

(2)修改FilterDemo1中doFilter方法,对拦截的请求进行处理:获取请求中携带的暗号并判断暗号是否正确,如果不正确就跳转到error.jsp提示用户暗号错误,如果正确就放行访问ServletDemo1。

(3)测试访问

(4)创建FilterDemo2判断第二个暗号是否正确(自己实现)

1.3 过滤器中的方法
1.3.1 init方法
public void init(FilterConfig arg0)

– 当Filter实例创建之后,服务器立即调用init方法进行初始化的操作.

1.3.2 doFilter方法
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException

– 当过滤器拦截到对资源的访问时,服务器会调用doFilter方法进行处理.

参数FilterChain代表多个过滤器组成的过滤器链对象.

(1)一个资源可以配置多个过滤器进行拦截,多个过滤器执行的顺序是按照Filter在web.xml中对应的filter-mapping标签的先后配置顺序执行的.多个过滤器就组成了一条过滤器链.

(2)当过滤器拦截到对资源的访问时,如果处理之后放行过滤器,即调用FilterChain中的doFilter方法来放行过滤器. 接着才可以执行后面的资源

(3)如果后面仍然是过滤器,则也需要在过滤器的doFilter方法中调用FilterChain.doFilter方法才可以放行过滤器,执行后面的资源.

(4)如果后面没有过滤器,则访问对应的资源. 也就是说当所有的过滤器都调用了FilterChain的doFilter方法时,才可以放行所有的过滤器,才可以访问到对应的资源.

1.3.3 destroy方法
public void destroy()

– 在Filter实例销毁之前,执行destroy方法进行善后的处理

1.3.4 过滤器的生命周期(了解)
当服务器启动时,web应用加载后会立即创建出当前web应用中的所有的Filter对象,创建出来后,立即调用init方法进行初始化出操作. 从此以后这个Filter对象一直驻留在服务器的内存中, 为后续所拦截的请求服务,每次过滤到对资源的访问时,都会执行doFilter这个方法进行拦截处理,直到服务器关闭或者web应用移出容器为止,随着web应用的销毁,过滤器实例也跟着销毁,在销毁之前会调用destroy方法执行善后的处理.

2 监听器
2.1 监听器概述
2.1.1 监听器概述
Listener也叫做监听器,是JavaWeb的三大组件之一。

所谓的监听器就是一个实现特定接口的java程序。这个程序专门用于监听另一个 java 对象状态变化(比如:对象的创建、销毁或属性改变等),当被监听对象发生上述事件后,就会通知监听器,监听器中的某个方法就会立即执行,来处理该事件。

1.监听器:

(1)事件源:按钮、车

(2)事件:按钮被点击、车被偷

(3)监听器:listener、警察

2.监听器的特点:

(1)通常是一个接口,其中的内容由我们开发人员来实现

(2)通常需要将监听器注册到事件源上

(3)监听器中的方法会在特定事件触发时执行.

2.1.2 监听器案例:按钮被点击
public static void main(String[] args) {

//1.创建一个窗口

JFrame frame = new JFrame();

//2.设置窗口的大小

frame.setSize(250, 200);

//3.设置窗口的位置

frame.setLocation(350, 250);

//4.创建一个按钮, 并添加到窗口中

JButton btn = new JButton("按钮");

/*

 * 需求: 当按钮被点击时, 在控制台打印"hello btn~~!!"

 * 事件源: 按钮

 * 事件: 按钮被点击

 * 监听器: 当把监听器注册到事件源开始, 监听器会一直

 * 监听着事件源(按钮), 直到按钮被点击事件发生, 就会

 *  激活监听器, 执行监听器中对应的方法, 从事实现特定功能

 */

//>>创建一个监听器(行为监听器)

ActionListener listener = new ActionListener() {

   //处理事件的方法(事件处理器)

   public void actionPerformed(ActionEvent e) {

       String dateStr = new Date(e.getWhen()).toLocaleString();

       System.out.println(dateStr);

       System.out.println("hello btn~!!");

   }

};



//>>将监听器注册到按钮上(此后监听器会一直监听按钮的状态)

btn.addActionListener(listener);

//5.将按钮添加到窗口中

frame.add(btn);

//6.设置窗口为显示状态

frame.setVisible(true);

System.out.println("执行完成...");

}

2.2 开发监听器
2.2.1 开发监听器的步骤
(1)写一个类(比如: MyServletContextListener),必须要实现对应的监听器接口(如: ServletcontextListener)

(2)在web应用的web.xml文件配置监听器完成注册

2.2.2 JavaWeb中的监听器
ServletContextListener:ServletContext对象的生命周期监听器,其中提供两个方法,一个是在ServletContext对象创建时调用,另一个是在ServletContext对象销毁时调用!

void contextInitialized(ServletContextEvent sce) 在创建ServletContext对象时调用

void contextDestroyed(ServletContextEvent sce) 在销毁ServletContext对象时地调用

2.2.3 监听器案例
写一个类实现ServletContextListener(生命周期监听器)接口,实现contextInitialized和contextDestroyed方法,查看ServletContext对象何时创建以及何时销毁。

(1)写一个类MyServletContextListener,实现ServletContextListener接口

(2)在web.xml中配置监听器完成注册.

(3)实现contextInitialized和contextDestroyed方法并测试访问。

配置:
一.Filter
1.Filter概述
1.1.什么是过滤器?
过滤器和之前学过的Servlet以及监听器,统称为JavaWeb的三大组件
过滤器也叫作Filter,通过过滤器技术,开发人员可以在用户访问某一个资源之前或者之后,对发送的请求和响应进行拦截,从而实现某些功能
总结:
1.所谓的过滤器,就是拦截用户对资源的访问
2.一个过滤器可以拦截多个资源,一个资源也可以配置多个过滤器进行拦截
3.其实所谓的拦截,就是将代表请求的request对象和代表响应的response对象拦截下来,拦截下来后:
(1)控制是否允许访问 – 比如:用户登陆之后才能访问自己的订单或购物车
(2)在访问资源之前或之后做一些处理 比如: 全站乱码解决

2.如何开发过滤器
(1)写一个类, 实现一个Filter接口, 并添加未实现的方法
(2)在web.xml文件中配置Filter所拦截的资源路径.

3.如何配置过滤器

FilterDemo1 com.tedu.filter.FilterDemo1 FilterDemo1 /ServletDemo1 /ServletDemo2 /index.jsp *.jsp *.html /*

4.过滤器中的方法
4.1.init方法
public void init(FilterConfig filterConfig) throws ServletException {
}
– 该方法是在Filter实例创建之后立即执行, 进行初始化的操作.
– Filter实例创建: 在服务器启动, Web应用被加载之后, 服务器会创建出当前Web应用内部的所有的过滤器实例!
4.2.doFilter方法
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException, ServletException
– 对过滤器所拦截到的请求进行处理的核心方法.
FilterChain – 表示过滤器链对象, 作用是用于放行过滤器

4.3.destroy方法
– 该方法是在Filter实例销毁之前执行, 进行善后处理的操作
– Filter实例销毁: 在服务器关闭, 或者Web应用被移出了容器, 随着Web应用的销毁, Filter实例也会跟着销毁

4.4.过滤器的生命周期
当服务器启动时,web应用加载后会立即创建出当前web应用中的所有的Filter对象,创建出来后,立即调用init方法进行初始化出操作. 从此以后这个Filter对象一直驻留在服务器的内存中, 为后续所拦截的请求服务,每次过滤到对资源的访问时,都会执行doFilter这个方法进行拦截处理,直到服务器关闭或者web应用移出容器为止,随着web应用的销毁,过滤器实例也跟着销毁,在销毁之前会调用destroy方法执行善后的处理.

二.Listener
1、监听器概述
1.1.什么是监听器?
监听器一般是一个实现特定接口的Java程序, 这个程序需要监听另外一个Java对象的属性状态变化(对象的创建、销毁、对象上属性的变化等),当监听的对象发生了上述变化,就会通知监听器,监听器将会调用特定的方法来处理!
GUI(图形界面编程)

1.2.监听器:
(1)事件源:按钮、车
(2)事件:按钮被点击、车被偷
(3)监听器:listener、警察

1.3.监听器的特点:
(1)通常是一个接口,其中的内容由我们开发人员来实现
(2)通常需要将监听器注册到事件源上
(3)监听器中的方法会在特定事件触发时执行.

2、如何开发监听器
(1)写一个类, 实现一个监听器接口
(2)在web.xml文件中完成注册


com.tedu.listener.MyServletContextListener

3、JavaWeb中的监听器(一共有八个)
ServletContextListener
HttpSessionListener
ServletRequestListener
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值