Servlet与Filter的区别

来源:互联网 发布:python matplotlib安装 编辑:程序博客网 时间:2024/06/05 15:49


    在我们写代码时,在web.xml中总能发现类似下面的代码:

[html] view plain copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>     
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"    
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee      
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">     
  6.     <welcome-file-list>     
  7.         <welcome-file>index.jsp</welcome-file>     
  8.     </welcome-file-list>     
  9.     <filter>     
  10.         <filter-name>firstFilter</filter-name>     
  11.         <filter-class>com.test.filter.FirstFilter</filter-class>     
  12.     </filter>     
  13.     <filter>     
  14.         <filter-name>secondFilter</filter-name>     
  15.         <filter-class>com.test.filter.SecondFilter</filter-class>     
  16.     </filter>     
  17.     <filter-mapping>     
  18.         <filter-name>secondFilter</filter-name>     
  19.         <url-pattern>/*</url-pattern>     
  20.     </filter-mapping>     
  21.     <filter-mapping>     
  22.         <filter-name>firstFilter</filter-name>     
  23.         <url-pattern>/*</url-pattern>     
  24.     </filter-mapping>     
  25.     
  26.     <servlet>     
  27.         <servlet-name>firstServlet</servlet-name>     
  28.         <servlet-class>com.alimama.servlet.FirstServlet</servlet-class>     
  29.     </servlet>     
  30.     <servlet-mapping>     
  31.         <servlet-name>firstServlet</servlet-name>     
  32.         <url-pattern>/firstServlet</url-pattern>     
  33.     </servlet-mapping>     
  34. </web-app>  
  35. </span></span>  

    这个web.xml就涉及到了filter与servlet,那么他们两个有什么区别与联系呢?

1. Filter
    实现javax.servlet.Filter接口,在web.xml中配置与标签指定使用哪个Filter实现类过滤哪些URL链接。只在web启动时进行初始化操作。

    filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。

    在filter接口要实现三个方法:init(),destroy(),dofilter();分别是初始化,析构,和过滤,其中大部分时间花费在doFilter()方法上

    特点:可以在响应之前修改Request和Response的头部,只能转发请求,不能直接发出响应。filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等   

    1).filter的init方法在容器初始化时加载。第一次加载容器执行顺序随机,以后再次加载顺序以第一次加载顺序为准。

    2).filter的doFilter方法在请求url时执行,如果有多个filter匹配,则按照<filter-mapping>顺序执行(前提是doFilter方法里面最后要调用FilterChain的doFilter方法,这个方法作用是继续执行下个filter,如果没有加,则不执行下面的filter)


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

    servlet继承与servlet接口,实现方法:init(),service(),destroy(),getServletConfig(),getServletInfo()方法。在调用时service方法时会根据请求方式调用doget()或者dopost()方法;

    serlvet的init方法

    1).如果web.xml中配置了<load-on-startup>属性,则在Tomcat初始化时按其值从小到大的顺序加载所有servlet的init方法。

    2).如果没有配置<load-on-startup>属性,容器初始化时不加载。在请求匹配的url时进行加载,并且只加载最后一个servlet的init方法。其他的servlet不加载。

    3).servlet的doGet、doPost方法:在请求匹配的url路径时加载,而且只加载最后一个servlet的方法,其他方法不加载。

    filter和servlet同时存在,且容器初始化都要加载,则先加载filter再加载servlet的init方法。

    如果请求的url既匹配filter又匹配servlet,并且servlet的init方法没有在容器初始化加载,则先加载匹配的servlet的最后一个servlet的init方法,再按顺序执行filter方法,最后再执行匹配的最后一个servlet方法

     在网上看到一张图与大家分享: 

 

Filter

Servlet

接口

实现Filter接口

实现Servlet接口

使用步骤

1、创建类,继承接口

2、实现方法

init()

doFilter()

destroy()

 

 

3、配置WEB-INF/web.xml

1、创建类,继承接口

2、实现方法

init()

service()

destroy()

getServletConfig()

getServletInfo()

3、配置WEB-INF/web.xml

初始化时间

Servlet容器启动之后即初始化

Servlet类被调用之后初始化、先于Filter调用。

初始化可以在容器启动后被调用但需要配置。

调用顺序

1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用

2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容

3. 调用Servlet中的service()方法

4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反

 

按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题

销毁

服务器停止后销毁,晚于Servlet销毁之后

服务器停止后销毁

作用

1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。

2. 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。

3. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。

4. 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

主要是处理客户端的请求并将其结果发送到客户端。

    filter的初始化是在servlet容器启动时,而Servlet类被调用之后初始化、先于Filter调用。初始化可以在容器启动后被调用但需要配置。(filter的初始化根据在web.xml中filter的声明顺序,注意filtermapping必须放在filter声明之后使用。servlet被调用初始化,先于filter调用,是指chain.fiter(),service(),chainfiter()之后的代码)

    调用顺序:filter的调用顺序:

    1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用

    2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容(filter-mapping的name先调用doFilter方法,但是每个dofilter方法的内部存在chain.dofilter会调用下一个filter-mapping,一直到不存在下一个filter后在返回,执行chain.dofilter()后面的代码)(相当于递归调用)

    3. 调用Servlet中的service()方法

    4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反

    servlet的调用顺序:

    按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题

    当然咱们通俗易懂的来讲,filter就是用来拦截进行一些日志类似aop的功能,而servlet就是转发到别的页面。filter我们可以不配置也就不用,但是目前所有代码基本上都配置了servlet。

一、概念: 
1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且 
可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。 
2、filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter 
不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。 
二、生命周期: 
1、servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入 
servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭 
或重新结束。 
(1)、装入:启动服务器时加载Servlet的实例; 
(2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化 
工作有init()方法负责执行完成; 
(3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法; 
(4)、销毁:停止服务器时调用destroy()方法,销毁实例。 
2、filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、 
destroy(),空实现也行) 
(1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例; 
(2)、每一次请求时都只调用方法doFilter()进行处理; 
(3)、停止服务器时调用destroy()方法,销毁实例。 
三、职责 
1、servlet: 
创建并返回一个包含基于客户请求性质的动态内容的完整的html页面; 
创建可嵌入到现有的html页面中的一部分html页面(html片段); 
读取客户端发来的隐藏数据; 
读取客户端发来的显示数据; 
与其他服务器资源(包括数据库和java的应用程序)进行通信; 
通过状态代码和响应头向客户端发送隐藏数据。 
2、filter: 
filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应: 
在执行servlet之前,首先执行filter程序,并为之做一些预处理工作; 
根据程序需要修改请求和响应; 
在servlet被调用之后截获servlet的执行 
四、区别: 
1,servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它 
主要用来在 业务处理之前进行控制. 
2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个 
filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按 
照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。 
filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等

原创粉丝点击