Servlet、Listener、Filter、Interceptor

Servlet、Listener、Filter、Interceptor

1、tomcat 和 Servlet 关系

  Java的Web应用是基于Servlet规范运转的,而Servlet规范的核心接口即是Servlet接口,它是所有Servlet类必须实现的接口,描述了Servlet 生命周期为从创建直到销毁的整个过程。
  有的人往往以为就是servlet直接处理客户端的http请求,其实并不是这样,servlet并不会去监听80端口;直接与客户端打交道是“容器”,比如常用的tomcat。
  客户端的请求直接打到tomcat,它监听端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,所以一个Tomcat中可以起多个servlet,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。
在这里插入图片描述
在这里插入图片描述

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

  当请求来容器第一次调用某个servlet时,需要先初始化init(),但当某个请求再次打到给servlet时,容器会起多个线程同时访问一个servlet的service()方法,提供web服务。

2、Servlet和ServletContext

  ServletContext代表是一个web应用的上下文对象(web应用对象),里面封装的都是web应用信息,一个ServletContext对应一个应用(可以这么理解)。
  一个web应用中可以会有多个Servlet,每个Servlet有其独立的ServletConfig,用于配置该Servlet(项目载入<servlet.init-param>),多个ServletConfig相互独立。如果希望所配置的参数,能够被应用中的各个servlet和jsp访问到。这时候,就需要用到ServletContext(项目载入<context-param>)。

3、web.xml加载顺序

  1. 启动WEB项目的时候,容器首先会去读取web.xml配置文件中的两个节点: <listener>和<context-param>
  2. 紧接着,容器创建一个ServletContext(application),这个web项目的所有部分都将共享这个上下文。容器以<context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。
  3. 容器创建<listener>中的类实例,根据配置的<listener-class>类来创建监听,在监听中会有初始化方法,启动Web应用时,系统调用Listener的该方法 contextInitialized(ServletContextEvent args),在这个方法中获得:
ServletContext application =ServletContextEvent.getServletContext(); 
context-param的值= application.getInitParameter(“context-param的键”);
  1. 容器会读取<filter>,根据指定的类路径来实例化过滤器
  2. Servlet并没有实例化,直到第一个http请求来的时候再实例化

  总结:web.xml加载顺序,<context-param> -> <listener> -> <filter> -> <servlet>,如果web.xml中出现了相同的元素,则按照在配置文件中出现的先后顺序来加载。

4、Filter

  Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给 Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。所以他一定是在Servlet之前的架构。
在这里插入图片描述
  当客户端请求目标资源的时候,容器会筛选出符合 filter-mapping 中的 url-pattern 的 filter,并按照声明 filter-mapping 的顺序依次调用这些 filter 的 doFilter 方法。在这个链式调用过程中,可以调用 chain.doFilter(ServletRequest, ServletResponse) 将请求传给下一个过滤器(或目标资源),web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

5、Listener

  Listener可以理解为比较独立部分。Servlet,Filter都是针对url之类的,而Listener是响应事件的操作的,如session的创建,session.setAttribute的发生,或者在启动服务器的时候将你需要的数据加载到缓存等,在这样的事件发生时做一些事情。下面是几个例子。

  • ServletContextAttributeListener:监听Web应用上下文中是否增加、删除或者替换了一个属性。
  • HttpSessionListener:跟踪会话活动。
  • ServletRequestListener:监听请求到来,以便建立日志。
  • ServletRequestAttributeListener:监听请求属性是否有增加、替换或者删除。
  • HttpSessionAttributeListener:监听会话属性是否被删除、替换或者新增。
  • HttpSessionBindingListener:有一个属性类,如果希望这个类型的对象在绑定到一个会话,或者从一个会话删除时得到通知。应使用这个监听。
  • ServletContextListener:监听应用上下文创建或者撤销。

6、Interceptor

  拦截器(Interceptor)是Spring框架中的一个功能。它常常拿来和Filter对比。官方解释说:
  HandlerInterceptor基本上类似于Servlet Filter,但与后者相反,它仅允许自定义预处理以及禁止执行处理程序本身和自定义后处理的选项。Filter功能更强大,例如,它们允许交换传递到链中的请求和响应对象。 请注意,在应用程序上下文中的HandlerInterceptor web.xml中配置了Filter。
  作为基本准则,与处理程序相关的细粒度预处理任务是HandlerInterceptor实现的候选对象,尤其是分解出的公共处理程序代码和授权检查。 另一方面,Filter非常适合请求内容和视图内容处理,例如多部分表单和GZIP压缩。 这通常显示何时需要将Filter映射到某些内容类型(例如图像)或所有请求。

发布了63 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/myt0929/article/details/104303528