Java servlet、filter、listener、interceptor之间的区别和联系_java

servlet、filter、listener、interceptor之间的区别和联系

一、概念

1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。

2.filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

3.listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。

通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。

4.interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法。

比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

5.servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。

二、加载顺序

web.xml 的加载顺序是:context- param -> listener -> filter -> servlet

三、职责

1.servlet:

(1)创建并返回一个包含基于客户请求性质的动态内容的完整的html页面

(2)创建可嵌入到现有的html页面中的一部分html页面(html片段)

(3)读取客户端发来的隐藏数据

(4)读取客户端发来的显示数据

(5)与其他服务器资源(包括数据库和java的应用程序)进行通信

(6)通过状态代码和响应头向客户端发送隐藏数据。

2.filter:

(1)filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应

(2)在执行servlet之前,首先执行filter程序,并为之做一些预处理工作

(3)根据程序需要修改请求和响应

(4)在servlet被调用之后截获servlet的执行。

3.listener:

servlet2.4规范中提供了8个 listener 接口,可以将其分为三类,分别如下:

(1)与 servletContext 有关的 listne r接口。包括:ServletContextListener、ServletContextAttributeListener

(2)与 HttpSession 有关的 Listner 接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener

(3)与 ServletRequest 有关的 Listener 接口,包括:ServletRequestListner、ServletRequestAttributeListener

四、区别

1.servlet:servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在业务处理之前进行控制。

2.filter:流程是线程性的,url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而 servlet 处理之后,不会继续向下传递。

filter 功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。可以将 Filter 看成是 servlet 的一个补充(擦屁股的)。

Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。

它与Servlet的区别在于:它不能直接向用户生成响应。

完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

3.匹配规则

当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html(我的应用上下文是test),

容器会将http://localhost/tes去掉,将剩下的/aaa.html部分拿来做servlet的映射匹配,也就是拿这剩下的部分与web.xml中配置的servlet的url-pattern进行匹配。

注意:这个映射匹配过程是有一定的规则的,而且每次匹配最终都只匹配一个 servlet。(这一点和filter不同)

servlet 匹配规则:当一個servlet匹配成功后就不会在往下去匹配了

精确路径的匹配:

例子:比如servletA 的url-pattern为 /test,servletB的url-  pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,

这个时候容器就会先 进行精确 路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。

最长路径的匹配:

例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,

容器会选择路径最长的servlet来匹配,也就是这里的servletB。

扩展匹配:如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。

例子:servletA的url-pattern:*.action

4.servlet,filter 都是针对 url 之类的,而 listener 是针对对象的操作的,如 session 的创建,session.setAttribute 的发生,在这样的事件发生时做一些事情。

可用来进行:Spring整合Struts,为Struts的action注入属性,web应用定时任务的实现,在线人数的统计等

5.interceptor 拦截器,类似于filter,不过在struts.xml中配置,不是在web.xml,并且不是针对URL的,而是针对action,当页面提交action时,

进行过滤操作,相当于struts1.x提供的plug-in机制,可以看作,前者是struts1.x自带的filter,而interceptor 是struts2 提供的filter。

与filter不同点:

(1)不在web.xml中配置,而是在struts.xml中完成配置,与action在一起
(2)可由action自己指定用哪个interceptor 来在接收之前做事

6.struts2中的过滤器和拦截器的区别与联系:

(1)拦截器是 Struts2 提供的,而过滤器是由 Servlet 标准提供的

(2)拦截器拦截目标 Action 的目标方法,而过滤器针对各种 web 资源

(3)拦截器在 struts.xml 中配置,而过滤器在 web.xml文件中配置

(4)拦截器使用拦截器栈组织在一起,而过滤器是根据被拦截的资源联系在一起,由他们在配置文件中的位置决定了先后执行顺序

(5)拦截器是基于java反射机制的,而过滤器是基于函数回调的。
(6)过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
(7)拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
(8)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
(9)在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-09-12 01:45:19

Java servlet、filter、listener、interceptor之间的区别和联系_java的相关文章

servlet/filter/listener/interceptor区别与联系

下面从几个方面阐述一下题目中四个概念的区别与联系:         1.概念          2.生命周期          3.职责          4.执行过程                   一.概念:          1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.          2.filter:filter是一个可以复用的代码片段,可以用来转换HTT

Servlet和Filter之间的区别与联系_java

filter是一个可以复用的代码片段,可以用来转换HTTP请求.响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应. 最近使用插装的时候,改用cookie对计算机进行识别,加入了过滤,仔细研究了一下servlet和filter,区别主要是: 过滤器的生命周期一般都要经过下面三个阶段: servlet的特点是: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Con

JAVA中list,set,数组之间的转换详解_java

JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.collections.CollectionUtils;    String[] strArray = {"aaa", "bbb", "ccc"};    List strList = new ArrayList();    Set strSet = new

Java列出2到100之间所有素数的方法_java

本文实例讲述了Java列出2到100之间所有素数的方法.分享给大家供大家参考.具体实现方法如下: //TestPrime.java: public class TestPrime { public static boolean isPrime(int num) { for(int i = 2; i <= Math.sqrt(num); i++) { //程序默认2是素数,当j=2时,循环不执行 if(num % i == 0) { return false; } } return true; }

java servlet手机app访问接口(一)数据加密传输验证_java

前面几篇关于servlet的随笔,算是梳理了servlet的简单使用流程,接下去的文章将主要围绕手机APP访问接口这块出发续写,md5加密传输--->短信验证--->手机推送--->分享--->百度云图---->支付....第三方的业务 ...由于我是新手我也是一边学一边写,不足地方希望谅解. 今天这篇文章主要涉及到 javaservlet传输数据的加密,客户端请求参数的组合,并且会附带上我中途遇到的所有问题以及解决方法.  由于手机访问接口是公布出来的,所以不管用什么语言编

深入理解JAVA中的聚集和组合的区别与联系_java

选自<JAVA语言程序设计-基础篇(原书第8版)> 定义:一个对象可以包含另一个对象.这两个对象之间的关系称为组合(composition). 组合实际上是聚集关系的一种特殊形式.聚集模拟了具有(has-a)关系,表示两个对象之间的归属关系.归属关系中的所有者对象称为聚集对象(aggregation object),而它的类称为聚集类(aggregating class).归属关系中的从属对象称为被聚集类(aggregated object),而它的类被称为被聚集类(aggregated cl

Java线程中sleep和wait的区别详细介绍_java

Java中的多线程是一种抢占式的机制,而不是分时机制.抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行. 共同点: 1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回. 2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException. 如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法.如果此刻线程B正在wait/sleep/

Java修饰符 abstract,static,final 的区别详解_java

static 表示静态,它可以修饰属性,方法和代码块. 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有.这个属性就是全类公有.(共有的类变量与对象无关,只和类有关). 类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件(字节码文件)读入JVM(java虚拟机),这个过程成为类的加载.JVM(java虚拟机)会通过类路径(CLASSPATH)来找字节码文件. 类变量,会

java中public class与class的区别详解_java

在编写类的时候可以使用两种方式定义类:public class定义类:class定义类:如果一个类声明的时候使用了public class进行了声明,则类名称必须与文件名称完全一致.范例:定义一个类(文件名称为:Hello.java) 复制代码 代码如下: public class HelloDemo{    //声明一个类,类名称的命名规范:所有单词的首字母大写    public static void main(String args[]){    //主方法        System.