Java的Tomcat和Servlet的运行原理详解

 更新时间:2022年03月21日 15:13:18   作者:富春山居_ZYY  
这篇文章主要为大家详细介绍了Java的Tomcat和Servlet,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

在从前的时候,想要运行一个Java代码,就必须要实现main方法,这是程序的入口,通过初识 Servlet 就会发现没有实现 main 方法,程序就被成功调用,并且还能够在浏览器除看见想要看见的结果,这是为什么呢?

事实就是,main 方法在Tomcat 中,Servlet 程序是配合Tomcat上运行的,Tomcat 就有了main 方法,就会拖着 Servlet 运行起来。

在这里插入图片描述

Servlet 是上是Tomcat 提供的一组API,因此其代码的实现是基于 Tomcat 的。Tomcat 通过 HTTP协议来和浏览器进行交互,交互主要分成三个步骤:请求接收处理请求返回响应

一、客户端(浏览器)与服务器之间的交互

请求接收:

1.当用户在浏览器端输入一个网址后,浏览器就会构造一个HTTP请求

2.该HTTP请求就会通过种种手段转换成光电信号被传输到服务器端(具体的转换涉及通信知识)

3.服务器主机接收到这些光电信号后对其进行解析,还原成原本的HTTP请求,并交给Tomcat 进行处理

4.Tomcat 对HTTP请求进行解析,把请求交给 Servlet的代码进行处理

处理请求:

1.Tomcat 会通过 Content Path和Servlet Path来确定到某webapp的某类,在根据请求的方法(doXXX方法)来确定调用该类的具体方法,代码中的HttpServletRequest对象就包含着HTTP请求的详细内容,根据代码进行结果的计算

返回响应:

1.Servlet 根据代码计算生成响应对象(HttpServletResponse)

2.Tomcat 在把该响应对象构造成HTTP响应,通过光电信号的方式传输到浏览器主机

3.浏览器主机在对光电信号进行解析还原成原本的HTTP响应,交给浏览器进行处理

4.浏览器解析该HTTP响应,将数据显示在界面上

二、Tomcat启动过程

1.首先,我们实现的 Servlet 代码,只是单纯的创建了Servlet类而已,想要让这些类真正的被使用,需要Tomcat进行实例化,Tomcat就会根据@WebServlet注解来获取到需要被实例化的类,通过反射的方式创建实例,并集中放在一数组中。

2.Tomcat持有了Servlet实例后,需要调用 Servlet 中的init()方法进行初始化操作(只会进行一次初始化操作)

3.然后进行绑定端口号,创建线程池,来并发的处理请求

4.在服务器运行结束前,就会调用 Servlet对象中的destroy()方法,进行资源回收操作

三、Tomcat处理请求过程

1.Tomcat 接收到请求之后,就会按照 HTTP协议的格式将其构造成 HttpServletRequest对象

2.Tomcat 根据 URL 来判断该请求书否为一静态资源(比如图片、HTML文件之类的),如果是,就直接返回该静态资源,如果是动态资源就执行接下来的Servlet 部分

3.根据 Content Path 和 Servlet Path来找到请求的Servlet对象,并调用Servlet中的service方法判断请求类型,调用到程序员自己写的doXXX方法

四、Servlet的service方法

伪代码:

class Servlet {
    public void service(HttpServletRequest req, HttpServletResponse resp) {
    	String method = req.getMethod();
        if (method.equals("GET")) {
          	doGet(req, resp);
        } else if (method.equals("POST")) {
          	doPost(req, resp);
        } else if (method.equals("PUT")) {
         	 doPut(req, resp);
        } else if (method.equals("DELETE")) {
          	doDelete(req, resp);
        }
       ......
     }
}

service 会根据请求的方法,调用对应的方法,当调用doXXX方法时,触发多态机制,执行到程序员自己写的代码。

程序员自己写的 Servlet 类继承自 HttpServlet 类,HttpServlet 类继承自 Servlet 类,因此程序员写的类是 Servlet 的子类。在前面有介绍到 Tomcat 在启动时会将需要被实例化的类都放在了Servlet数组中,因此实际上我们是通过父类的引用来获取到被实例化的类的,从而触发多态。

类似于

Servlet ins = new HelloServlet();//HelloServlet 类是程序员自己实现的类的类名
ins.doGet(req,resp);

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!  

相关文章

  • Java几种常用JSON库性能比较详解

    Java几种常用JSON库性能比较详解

    这篇文章主要介绍了Java几种常用JSON库性能比较详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Java实现excel动态列导出的示例代码

    Java实现excel动态列导出的示例代码

    这篇文章主要为大家详细介绍了如何使用Java实现excel动态列导出,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • SQLSyntaxErrorException-ExecutorException报错解决分析

    SQLSyntaxErrorException-ExecutorException报错解决分析

    这篇文章主要为大家介绍了SQLSyntaxErrorException-ExecutorException报错解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 分析ThreadLocal内存泄漏问题

    分析ThreadLocal内存泄漏问题

    ThreadLocal的作用是提供线程内的局部变量,这种变量在线程生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量传递的复杂度,但是如果滥用ThreadLocal可能会导致内存泄漏,所以本文将为大家分析ThreadLocal内存泄漏问题
    2023-07-07
  • java爬取并下载酷狗TOP500歌曲的方法

    java爬取并下载酷狗TOP500歌曲的方法

    这篇文章主要介绍了java爬取并下载酷狗TOP500歌曲的方法,非常具有实用价值,需要的朋友可以参考下
    2019-01-01
  • idea配置gradle全过程

    idea配置gradle全过程

    安装Gradle首先需要解压安装包到指定目录,随后配置环境变量GRDLE_HOME和GRADLE_USER_HOME,这里的GRADLE_USER_HOME是指文件下载的路径,安装后,通过命令行输入gradle -v来测试是否安装成功,对于Idea的配置,需要通过File->Setting->Gradle进行
    2024-10-10
  • 深入了解Java中的类加载机制

    深入了解Java中的类加载机制

    通常,在关于Java的类加载部分会遇到以上疑问,本文将对类加载重要部分做详细介绍,包括重要的基础概念和应用场景,在编写过程中也帮助作者重新熟悉并加固了知识点,希望在看完后对大家能有所帮助
    2022-11-11
  • 新建springboot项目时,entityManagerFactory报错的解决

    新建springboot项目时,entityManagerFactory报错的解决

    这篇文章主要介绍了新建springboot项目时,entityManagerFactory报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • String类型传递是值传递,char[]类型传递是引用传递的实现

    String类型传递是值传递,char[]类型传递是引用传递的实现

    下面小编就为大家带来一篇String类型传递是值传递,char[]类型传递是引用传递的实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看不
    2016-09-09
  • SpringBoot中的自定义starter详解

    SpringBoot中的自定义starter详解

    这篇文章主要介绍了SpringBoot中的自定义starter详解,SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,需要的朋友可以参考下
    2024-01-01

最新评论