zoukankan      html  css  js  c++  java
  • Java Web 深入分析(8) Servlet工作原理解析

    Servlet

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

    Servlet容器

    • servlet容器启动过程:
      在tomcat容器管理等级中,Context直接管理着Servlet在容器中的包装类Wrapper,所以Servelt容器如何运行就影响这servlet,下面就是servlet容器启动过程
      Servlet容器启动时,触发servletContextEvent事件,并通知相应的监听器servletContextListener;
      Servlet容器在启动的过程中通过servletContextListener监视servletContext的状态(初始化或者销毁servletContext);
      servletContextListener中通过contextInitialized初始化方法,根据web.xml对servletContext进行配置,即将Context容器的属性缓存在内存中,供Service服务利用;
    • web应用初始化工作:
      web的初始化是在contextConfig中实现的,应用的初始化主要是对web.xml进行解析,这个文件描述了Web应用的关键信息,也是整个Web应用的入口。
      Tomcat将web.xml文件解析后,将其中的属性设置到Context容器中,这里包括创建Servlet实例,Filter和Listener。将Servlet包装成Context中的包装类Wrapper。
      Tomcat的context容器中的StrandWrapper对象就是tomcat中对于Servlet的包装也就是,Servlet是一种JavaWeb规范而不是直接耦合成一个类包装在tomcat容器里面,这是standwapper对象的设计初衷。

    Servlet实例

    • 创建Servlet对象
      如果Servlet在web.xml中load-on-startup的配置大于0,那么在Context容器启动时就会被实例化。在tomcat/conf/web.xml文件中,配置了2个load-on-startup为1,3的默认启动类,分别是Servlets.DefaultServlet、org.apache.servlet.JspServlet
    • 初始化Servlet
      前面讲了Servlet规范在tomcat的实现就是context中StandardWrapper。所以初始化的时候就是通过调用Servlet的init方法,同时把包装了StandarWrapper对象的StandarWrapperFacade作为ServletConfig传给Servlet。
      Servlet从web.xml被解析到初始化。ServletConfig 和 ServletContext的区别ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。

    Servlet体系结构

    • 如果说javaweb规范,概况来讲肯定离不开 servlet规范。而servlet规范主要有这3个类ServletConfig、ServletRequest、ServletResponse。ServletConfig在servlet初始化的过程中就传给了servlet了,而ServletRequest和ServletResponse在servlet运行中我很清楚的知道他们的用法。这个Servletconfig对象和Servlet采用典型的“握手型的交互”根据交互场景来组装数据。而实际上servletconfig通过其门面设计模式的servletcontext类给servlet引用,通过servletcontext 可以获得context容器的相关信息如路径 和最小版本。servletRequest和servletresponse又通过web容器封装成了 httpservletRequest和httpservletresponse对象

    Servlet如何工作

    • 先看一个典型的访问路径 http://localhost:80/test ,HTTP协议 +host名+port端口+url ,其中HTTP和host名用于服务器和客户机之间建立TCP/IP连接,而后面的url就是确立这个客户机浏览器将访问服务器web容器里面哪个servlet的。服务器的web容器中有一个mapper专门管理这种url<->servlet的映射关系!

    • 然后这个请求URL进入到这个servlet容器中之后,就会调用相应的的service方法,通常我们不是直接去实现javax.servlet.servlet类,而是实现简单点的httpservlet或者genericServlet类,然后选择性覆盖相应方法去实现我们的功能。

    • 然后再现在的MVC框架中,对于所有请求的处理的基本原理就是将它们都映射到一个Servlet,然后再去实现其service方法,这个方法也就是MVC的入口。

    • 最后当servlet从web容器中移除后,这个servlet的生命周期也就相应的结束了由容器调用相应的destroy方法。

    Servlet中的Listener

    • 在整个tomcat容器的设计中,其实很多容器诸如此类,listener使用的非常广泛,它是基于观察者模式而设计的。类图如下

    Filter如何工作

    • 其实在web.xml 中,filter也是一个常用的配置项,与servlet对象相比 ,除了有request和response对象,它还有一个filterchain对象,类图如下。
    • 在tomcat容器中,FilterConifg 和FilterChain的实现类分别是ApplicationFilterConfig和ApplicationFilterChain,而Filter接口由用户自己去实现,是这3个接口与Servlet中的类似,只不过ApplicationFilterChain可以把这些Filter串联起来,组成一个Filter链,这点和Jetty的Handler链在设计上有异曲同工之妙。
    • 再看下如图的Filter类三个接口方法:
    • Filter的一个比喻,如果有2条往返的加工流水线,我们可把这2条流水线看做 web交互中的request和response ,即请求和响应,在这2条流水线的远转图中,Filter就好比一个流水线工人对流动的产品进行处理,可以在某个工位存放或者取出或者拦截一些数据。

    Servlet中的url-pattern

    • 前面我们说过 Servlet 和 URL之间的对象关系 ,在tomcat有一个Mapper类实现请求访问时去对应哪个Servlet。而Filter的url匹配是在创建 ApplicationFilterChain时,对匹配的Url相应的Filter放入到ApplicationFilterChain对象的Filters数组中,然后FilterChain依次调用这些Filter。
    • Url在web.xml被加载时会校验这些url-pattern是否合法,这个检查是在StandardContext的ValidateURLPattern中进行,吐过不通过就会报这个java.lang.IllegalArgumentException:Invalid ...
    • 解析规则如下
  • 相关阅读:
    C# 抽象(3)
    C# 抽象(2)
    C# 抽象
    将 varchar 值 'ACCE5057EC423F7C' 转换成数据类型 int 时失败
    处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表
    方法调用 Controller的Action 参数
    A problem has been detected and windows has been shut down to prevent damage to your computer.他么啥意思?看这里!【蓝屏】
    自己搭建了一个简单实用的Web版记事本
    GRPC
    Ocelot Consul
  • 原文地址:https://www.cnblogs.com/humi/p/8168665.html
Copyright © 2011-2022 走看看