概念
Servlet
Servlet是一种运行于服务器端的Java应用程序,具有独立于平台和协议的特性,并且可以动态的生成Web页面,它工作在客户端请求与服务器响应的中间层,具有跨平台与可移植性强等优点。
Filter
Filter是一个可重复使用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一资源的响应。
Listener
Listener是监听器,通过Listener可以监听Web服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的来说就是在Application,Session,Request三个对象创建、消亡或者往其中添加、修改、删除属性时自动执行代码功能的组件。
Interceptor
Interceptor是拦截器,在JavaWeb中主要是面向切面编程时使用,一般在调用一个方法前亦或是调用一个方法后执行该Interceptor拦截器中的方法。在JavaWeb中应用拦截器,比如说我们想得知一个完整请求的响应时间,我们就可以通过添加拦截器的方式,在请求开始前记录一个开始时间,在请求结束后,记录一个结束时间,用结束时间减去开始时间,即可获取该次请求所消耗的时间。这样以来就可以更加方便我们对于程序的优化处理。
添加位置
Servlet、Filter、Listener是配置在web.xml中,而Interceptor则是根据程序框架不同,而配置到不同的配置文件中,比如说我们现在在开发JavaWeb应用程序时,主流的开发框架中一般使用Spring,所以说我们一般将其配置到Spring的spring-servlet.xml中。
生命周期
Servlet生命周期
Servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入Servlet时结束。Servlet一旦被装入web服务器,其一般被加载到web服务器中是不会被删除的,只有web服务器重启或关闭时才会被删除,另外Servlet生命周期包含如下4个过程:
- 加载和实例化
启动服务器时加载Servlet实例。加载和实例化Servlet是由Servlet容器来实现的。加载Servlet之后,容器会通过Java反射机制来创建Servelt实例。
- 初始化
在Servlet实例创建后,Servlet容器会调用Servlet的init() 方法来初始化该Servlet对象。初始化的目的是可以让Servlet对象在处理客户端请求之前完成一些初始化工作,对于每个Servlet实例,其只会调用一次init()方法。
- 执行
当客户端请求来到后,Servlet一般会调用容器中的doGet()或doPost()方法。Servlet容器首先针对该请求创建ServletRequest和ServletResponse两个对象,然后Servlet容器会自动调用Servelt的service()方法来响应客户端的请求,同时把ServletRequest和ServletResponse两个对象传给service()方法。通过ServletRequest对象,Servlet实例可以获取客户端请求信息,处理完请求后,则将信息放置在ServletResponse对象中。最后销毁ServletRequest和ServletResponse对象。
- 销毁
当Servelt实例需要从服务中移除,容器会调用destroy()方法,让该实例释放掉它所拥有的资源,并将实例中的数据保存到持久的存储设备中。之后Servlet实例便会被Java垃圾回收机制回收。
Filter生命周期
- 每个Filter一定要实现
javax.servlet.Filter
接口中的init()
、doFilter()
、destroy()
三个方法。 - 启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
- 每一次请求时都只调用方法doFilter()进行处理;
- 停止服务器时调用destroy()方法,销毁实例。
Listener生命周期
Listener的生命周期类似于Servlet和Filter,在这里不做过多论述,不过在这里,我们应该更多的关注其在web服务器中的执行顺序,在web服务器中,它们的执行顺序如下:
context-param
——>listener
——>filter
——>servlet
Interceptor生命周期
以Spring为例,在项目中加载了spring-servlet.xml以后,即开始初始化相应的拦截器,当页面请求action时,在开始前调用preHandle()
,在截止后调用afterCompletion()
,以此完成相应的拦截操作。
职责
Servlet的职责
- 创建并返回一个包含基于客户请求性质完整动态的HTML页面。
- 创建可嵌入现有的HTML页面中的一部分HTML页面(HTML片段)。
- 可以接受客户端发来的隐藏或显示数据。
- 与其他服务器资源(包括数据库和java的应用程序)进行通信。
- 通过状态代码和响应头向客户端发送隐藏数据进行响应客户端的请求。
Filter的职责
- Filter可以在一个请求到达Servlet之前预处理用户请求,也可以在离开Servlet时处理HTTP响应。
- 在执行Servlet之前,首先执行Filter程序,并做一下处理预处理工作。
- 根据程序需要修改响应和请求。
- 在Servelt被调用之后截获Servlet的执行。
Listener的职责
职责跟概念差不多,他们的区别如下:
- 与ServletContext有关的Listener接口。包括:ServletContextListener、ServletContextAttributeListener。
- 与HttpSession有关的Listner接口。包括:HttpSessionListener、 HttpSessionAttributeListener、HttpSessionBindingListener、HttpSessionActivationListener。
- 与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener。
Interceptor的职责
Interceptor的职责与过滤器十分相似,通过层层拦截,处理用户的请求和响应。