tomcat中Servlet的工作机制详细介绍

 更新时间:2016年12月31日 11:43:07   投稿:lqh  
这篇文章主要介绍了tomcat中Servlet的工作机制详细介绍的相关资料,需要的朋友可以参考下

tomcat中Servlet的工作机制

在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而对客户端请求处理时则调用service方法。对于这些机制的支持都必须由Tomcat内部去支持,具体则是由Wrapper容器提供支持。

在tomcat中消息流的流转机制是通过四个不同级别的容器管道机制进行流转的,对于每个请求都是一层一层处理的。如下图,当客户端请求到达服务端后请求被抽象成request对象后向四个容器进行传递,首先经过Engine容器的管道通过若干阀门,最后通过StandardEngineValve阀门流转到Host容器的管道,处理后继续往下流转,通过StandardHostValve阀门流转到Context容器的管道,继续往下流转,通过StandardContextValve阀门流转到Wrapper容器的管道,而对Servlet的核心处理也正是在StandardWrapperValve阀门中。StandardWrapperValve阀门调用Servlet的service方法队请求进行处理,然后对客户端响应。

下面更深入了解下StandardWrapperValve阀门调用Servlet的过程。

web应用的Servlet类都是根据Servlet接口,例如一般我们在写业务处理Servlet类时都会继承HttpServlet类,为了遵循Servlet规范,它其实最终也是实现了Servlet接口,只是HttpServlet定义了HTTP协议的Servlet,将协议共性的东西抽离出来复用。Servlet处理客户端请求的核心方法为service方法,所以对于HttpServlet来说,它需要针对http协议的GET、POST、PU、DELETE、HEAD、OPTIONS、TRACE等请求方法做出不同的分发处理,为方便理解,下面用个简化的代码展示:

public abstract class HttpServlet extends Servlet{
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    String method = req.getMethod();
    if (method.equals("GET")) {
      doGet(request, response);
    }else if (method.equals("POST")) {
      doPost(request, response);
    }else if (method.equals("HEAD")) {
      doHead(request, response);
    } 
  }
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

service方法将请求对象和响应对象转换成HttpServletRequest和HttpServletResponse,然后获取请求方法,根据请求方法调用不同的处理方法,例如如果为GET方法则调用doGet方法,那么在继承了HttpServlet类的Servlet只需重写doGet或doPost方法完成业务逻辑处理,这就是我们熟悉的Servlet了。

这样一来,StandardWrapperValve阀门调用Servlet的工作其实就是通过反射机制实现对Servlet对象的控制,例如在不配置load-on-startup情况下,客户端首次访问该Servlet时由于还不存在该Servlet对象,需要通过反射机制实例化出该Servlet对象,并且调用初始化方法,所以这也是为什么第一次访问某个Servlet时会比较耗时的原因,后面客户端再对该Servlet访问时都会使用该Servlet对象,无需再做实例化和初始化操作。有了Servlet对象后调用其service方法即完成了对客户端请求的处理。

实际上通过反射机制实例化Servlet对象是一个比较复杂的过程,它除了完成实例化和初始化工作外还要解析该Servlet类包含的各种注解并作处理,另外,对于实现了SingleThreadModel接口的Servlet类,它还要维护一个该Servlet对象池。

综上所述,Servlet工作机制大致流程是:request -> StandardEngineValve -> StandardHostValve -> StandardContextValve -> StandardWrapperValve -> 实例化并初始化Servlet对象 -> 调用该Servlet对象的service方法 -> response。

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

相关文章

  • tomcat配置虚拟路径的实现步骤

    tomcat配置虚拟路径的实现步骤

    本文主要介绍了tomcat配置虚拟路径的实现步骤,主要是在localhost文件中进行配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • IDEA2022创建Web项目配置Tomcat的详细图文说明

    IDEA2022创建Web项目配置Tomcat的详细图文说明

    因为学习JavaEE需要配置Tomcat,所以抽出时间对IDEA进行配置与创建,下面这篇文章主要给大家介绍了关于IDEA2022创建Web项目配置Tomcat的详细图文说明,需要的朋友可以参考下
    2023-04-04
  • Linux小技巧分享之如何重新启动tomcat

    Linux小技巧分享之如何重新启动tomcat

    在Linux系统下,如何重启Tomcat呢?答曰:使用命令操作的!咳咳,这不是废话吗。其实tomcat的安装目录有关闭,重启的脚本的,只要执行他们就可以了,下面我们来详细说明下
    2014-08-08
  • eclipse配置Tomcat和Tomcat出现无效端口解决办法

    eclipse配置Tomcat和Tomcat出现无效端口解决办法

    本文主要介绍了eclipse配置Tomcat和Tomcat出现无效端口解决办法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Linux上tomcat的虚拟主机IP映射配置(图片服务器)

    Linux上tomcat的虚拟主机IP映射配置(图片服务器)

    有时候我们会使用tomcat作为一个图片资源服务器,本文主要介绍了Linux上tomcat的虚拟主机IP映射配置,通过tomcat服务器来访问我们的图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 项目启动tomcat失败的几种可能原因和解决方法(小结)

    项目启动tomcat失败的几种可能原因和解决方法(小结)

    本文主要介绍了项目启动tomcat失败的几种可能原因和解决方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 解析Tomcat的启动脚本--catalina.bat

    解析Tomcat的启动脚本--catalina.bat

    本文主要对Tomcat的三个最重要的启动脚本之一--catalina.bat脚本做了详细分析,具有很好的参考价值,需要的朋友可以看下
    2016-12-12
  • 详述 tomcat 中的 server.xml 配置文件示例

    详述 tomcat 中的 server.xml 配置文件示例

    本文将通过实例,介绍server.xml中各个组件的配置,并详细说明 Tomcat 各个核心组件的作用以及各个组件之间的相互关系。对tomcat server.xml 配置文件相关知识感兴趣的朋友一起看看吧
    2017-08-08
  • 怎么减少本地调试tomcat重启次数你知道吗

    怎么减少本地调试tomcat重启次数你知道吗

    这篇文章主要为大家详细介绍了怎么减少本地调试tomcat重启次数,使用Groovy,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • org.apache.tomcat.util.http.fileupload.IOUtils报错对应jar问题

    org.apache.tomcat.util.http.fileupload.IOUtils报错对应jar问题

    这篇文章主要介绍了org.apache.tomcat.util.http.fileupload.IOUtils报错对应jar问题,通过本文学习知道jar位置为tomcat8.0 引入lib下的jar包:tomcat-coyote.jar,文中通过图例给大家讲解需要的朋友可以参考下
    2022-11-11

最新评论