第8章 Servlet高级

时间:2024-03-21 07:26:46

目录

8.1 Filter 过滤器

8.1.1 什么是Filter

8.1.2 实现第一个Filter程序

8.1.3 Filter 映射

8.1.4 Filter 链

8.1.5 FilterConfig 接口

【任务8-1】使用Filter实现用户自动登录

【任务8-2】使用Filter实现统一全站编码

8.2 Listener 监听器——Servlet 事件监听器概述

【任务8-3】监听域对象的生命周期

【任务8-4】监听域对象的属性变更


8.1 Filter 过滤器

8.1.1 什么是Filter

Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行相应处理前后实现一些特殊功能。

第8章 Servlet高级

第8章 Servlet高级

doFiler()方法只要有客户端请求时就会被调用,并且Fiter所有的工作集中载doFilter()方法中。

8.1.2 实现第一个Filter程序

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

  1. <filter>根元素用于注册一个Filter。

  2. <filter-name>子元素用于设置Filter名称。

  3. <filter-class>子元素用于设置Filter类的完整名称。

  4. <filter-mapping>根元素用于设置一个过滤器所拦截的资源。

  5. <filter-name>子元素必须与<filter>中的<filter-name>子元素相同。

  6. <url-pattern>子元素用于匹配用户请求的URL,例如“/MyServlet”,这个URL还可以使用通配符“*”来表示,例如“*.do”适用于所有以".do"结尾的Servlet路径。

第8章 Servlet高级​​​​​​​

8.1.3 Filter 映射

1.使用通配符“*”拦截用户的所有请求

可以实现让浏览器过滤拦截所有的请求访问。

第8章 Servlet高级

2.拦截不同方式的访问请求

<filter-mapping>元素中有一个特殊的子元素<dispatcher>,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,<dispatcher>元素的值共有4个,具体如下。

(1)REQUEST

当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问的,name该过滤器将不会被调用。

(2)INCLUDE

如果资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

(3)FORWARD

如果目标资源是通过RequestDispatcher的forward()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

(4)ERROR

如果资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。除此之外,过滤器不会被调用。

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

8.1.4 Filter 链

多个Filter程序对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也叫过滤器链)。

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

8.1.5 FilterConfig 接口

该接口封装了程序在web.xml中的所有注册信息,并且提供了一系列获取这些配置信息的方法,具体如表8-2所示。

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

【任务8-1】使用Filter实现用户自动登录

【任务目标】

第8章 Servlet高级

使用Cookie实现用户自动登录后,当客户端访问服务器的Servlet时,所有的Servlet都需要对用户的Cookie信息进行检验,这样势必会导致在Servlet程序中书写大量重复的代码。

为解决上面的问题,可以在Filter程序中实现Cookie的校验。由于Filter可以对服务器的所有请求进行拦截,因此,一旦请求通过Filter程序,就相当于用户信息校验通过,Servlet程序根据获取到的用户信息,就可以实现自动登录了。

【实现步骤】

1.编写User类

第8章 Servlet高级

第8章 Servlet高级

2.实现登录页面和首页

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

3.创建Servlet

(1)编写LoginServlet类

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

4.创建过滤器

第8章 Servlet高级

第8章 Servlet高级

5.配置映射信息

第8章 Servlet高级

第8章 Servlet高级

6.运行项目,查看结果

(1)访问login.jsp页面

第8章 Servlet高级

(2)实现用户登录

第8章 Servlet高级

(3)注销用户

第8章 Servlet高级

【任务8-2】使用Filter实现统一全站编码

【任务目标】

在Web开发中,经常会遇到中文乱码问题,按照前面所学的知识,解决乱码的通常做法都是在Servlet程序中设置编码方式,但是如果多个Servlet程序都需要设置编码方式,势必会书写大量重复的代码。为了解决上面的问题,可以在Filter中对获取到的请求和响应消息进行编码,从而统一全站的编码方式。通过本任务的学习,读者将学会如何使用Filter统一全站编码。

【实现步骤】

1.编写form.jsp页面

第8章 Servlet高级

第8章 Servlet高级

2.创建Servlet

第8章 Servlet高级

3.创建过滤器

第8章 Servlet高级

第8章 Servlet高级

第8章 Servlet高级

4.配置映射信息

第8章 Servlet高级

5.启动项目,测试结果

第8章 Servlet高级

POST

第8章 Servlet高级

GET

第8章 Servlet高级

GET方式提交表单域POSY方式提交表单的效果是一样的,同样不会出现乱码问题。因此,可以说明使用Filter过滤器可以方便地文成统一全站的编码功能。

8.2 Listener 监听器——Servlet 事件监听器概述

监听器在监听的过程中会涉及几个重要组成部分,具体如下

(1)事件(Event):用户的一个操作,如单击一个按钮、调用一个方法、创建一个对象等。

(2)事件源:产生事件的对象。

(3)事件监听器(Listener):负责监听发生在事件源上的事件。

(4)事件处理器:监听器的成员方法,当事件发生的时候会触发对应的处理器(成员方法)。

当用户进行一个操作触发事件源上的事件时,就会被事件监听器监听到。当监听器监听到事件发生时,相应的事件处理器就会对发生的事件进行处理。

事件监听器在进行工作时,可分为几个步骤,具体如下。

(1)将监听器绑定到事件源,也就是注册监听器。

(2)事件发生时会触发监听器的成员方法,即事件处理器,传递事件对象。

(3)事件处理通过实践对象获得事件源,并对事件源进行处理。

在开发Web应用时,也经常会使用监听器,这个监听器也被称为Servlet事件监听器。Servlet事件监听器就是一个实现了特定接口的Java程序,专门用于监听Web应用程序中ServletContext、HttpSession和ServletRequest等域对象的创建和销毁过程,监听这些域对象属性的修改以及感知绑定到HttpSession域中某个对象的状态。

第8章 Servlet高级

HttpSession对象从内存中转移至硬盘的过程称为钝化。HttpSession对象从持久化的状态变为运行状态的过程称为活化。

上述监听器根据监听事件的不同可以将其分为3类,具体如下。

(1)用于监听域对象创建和销毁的事件监听器(ServletContextListener接口、HttpSessionListener接口、ServletRequest接口)

(2)用于监听域对象属性增加和删除的事件监听器(ServletContextAttributeListener接口、HttpSessionAttributeListener接口、ServletRequestAttributeListener接口)。

(3)用于监听绑定到HttpSession域中某个对象状态的事件监听器(HttpSessionBindingListener接口、HttpSessionActivationListener接口)。

【任务8-3】监听域对象的生命周期

【任务目标】

要相对Servlet域对象的生命周期进行监听,首先需要实现域对应的ServletContextListener、HttpSessionListener和ServletRequestListener接口,这些接口中的方法和执行过程非常类似。可以为每一个监听器编写一个单独的类,,也可以用一个类来实现这3个接口,从而让这个类具有3个事件监听器的功能。通过本任务的学习,读者将学会如何监听3个域对象的生命周期。

【实现步骤】

1.创建监听器

第8章 Servlet高级

2.添加监听器类信息

第8章 Servlet高级

3.启动项目,查看ServletContext对象创建信息

第8章 Servlet高级

4.关闭项目,查看ServletContext对象销毁信息

第8章 Servlet高级

5.创建测试页面

第8章 Servlet高级

6.设置监听超时信息(整数)

第8章 Servlet高级

超时时间为2分钟,如果为0或负数整数,则session永远不会超时。

7.重启项目,查看结果

第8章 Servlet高级

第8章 Servlet高级

Web容器会为每次访问请求都创建一个新的ServeltRequest对象,而对于同一个浏览器在会话期间的后续访问是不会再创建新的HttpSession对象的。关闭访问myjsp.jsp页面的浏览器窗口或保持浏览器窗口不再刷新,与之对应的HttpSession对象将在2min之后被销毁。

【任务8-4】监听域对象的属性变更

【任务目标】

通过所学监听器知识,读者应学会使用监听域对象的属性变更。

【实现步骤】

1.创建测试页面

第8章 Servlet高级

2.创建监听器

第8章 Servlet高级

第8章 Servlet高级

3.添加监听信息

第8章 Servlet高级

4.启动项目,查看结果

第8章 Servlet高级