Tomcat 简单了解

本文介绍了Tomcat的基础知识,包括其作为轻量级Web应用服务器的角色,主要组件(服务器Server、服务Service、连接器Connector和容器Container)的工作原理,以及HTTP请求的处理过程。连接器负责接收和处理请求,而容器则通过责任链模式管理Servlet的生命周期。Tomcat的HTTP请求处理涉及从Connector接收请求,经过Engine、Host、Context到Wrapper的层层传递,最终执行Servlet的业务逻辑。
摘要由CSDN通过智能技术生成

Tomcat

概念

Tomcat服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下普遍使用,是开发和调试Servlet、JSP程序的首选

原理

img

Tomcat主要组件:服务器Server,服务Service,连接器Connector、容器Container

连接器Connector和容器Container是Tomcat的核心

一个Container容器和一个或多个Connector组合在一起,加上其他一些支持的组件共同组成一个Service服务,有了Service服务便可以对外提供能力了,但是Service服务的生存需要一个环境,这个环境便是Server,Server组件为Service服务的正常使用提供了生存环境,Server组件可以同时管理一个或多个Service服务

两个组件

1.Connector连接器

一个Connector将在某个指定的端口上侦听客户请求,接收浏览器发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户
Tomcat中有两个经典的Connector,一个直接侦听来自Browser的HTTP请求,另外一个来自其他的WebServer请求

2.Container

img

Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。
Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎

  • Engine 容器
    Engine 容器比较简单,它只定义了一些基本的关联关系
  • Host 容器
    Host 是 Engine 的子容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。
  • Context 容器
    Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host
  • Wrapper 容器
    Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。
    Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道

3.其他组件

​ Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务

HTTP请求过程

img

Tomcat Server处理一个HTTP请求的过程

1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。
2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。
5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。
7、Context把执行完之后的HttpServletResponse对象返回给Host。
8、Host把HttpServletResponse对象返回给Engine。
9、Engine把HttpServletResponse对象返回Connector。
10、Connector把HttpServletResponse对象返回给客户Browser

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我无法为您提供完整的手写Tomcat代码。Tomcat是一个开源的Java Web服务器,它的源代码可以在官方网站上找到。如果您对Tomcat的实现感兴趣,可以通过研究Tomcat源代码来了解它的内部工作原理。但是,编写自己的Web服务器涉及到很多复杂的知识和技能,如果您不具备相应的经验和能力,建议不要尝试编写自己的Web服务器。 ### 回答2: Tomcat是一种开源的Java Web服务器,用于处理HTTP请求和响应。以下是一个简单的手写版Tomcat代码示例: ```java import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SimpleTomcat { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("Tomcat已启动,监听端口8080..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("接收到请求..."); BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream()); String request = reader.readLine(); System.out.println("接收到请求:" + request); String response = "HTTP/1.1 200 OK\r\n\r\nHello, World!"; writer.println(response); writer.flush(); socket.close(); System.out.println("请求处理完成,连接已关闭。"); } } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码是一个简单Tomcat服务器示例。它创建了一个ServerSocket对象,监听端口8080。当有请求到达时,它接受Socket连接,并通过BufferedReader读取请求内容。然后,它创建一个PrintWriter对象,将HTTP响应写入输出流,最后关闭连接。 此示例中的响应仅为简单的"Hello, World!"字符串。在实际情况下,可以根据请求路径和参数来进行动态处理,例如返回动态生成的HTML页面或进行数据库操作等。 需要注意的是,该代码只是一个非常简单的示例,实际的Tomcat服务器要复杂得多,并具备更多功能,如连接池、线程池、Servlet容器等。另外,由于安全性和性能等因素,不推荐手动编写Tomcat服务器,而是使用官方提供的Tomcat或其他成熟的Java Web服务器。 ### 回答3: 手写简单tomcat代码的实现步骤如下: 1. 引入所需的Java类库和API。例如,使用java.net包中的ServerSocket类和Socket类来进行与客户端的通信。 2. 创建一个Tomcat类作为入口类,其中包含main方法。在main方法中,创建一个ServerSocket对象,并指定端口号,以便监听客户端的请求。 3. 使用无限循环来接受和处理客户端的请求。在循环中,首先通过ServerSocket的accept()方法等待客户端的连接请求。 4. 一旦有客户端连接到服务器,就会接受到一个与客户端通信的Socket对象。然后,创建一个新的线程来处理与该客户端的通信。 5. 在新线程中,使用Socket对象的InputStream和OutputStream来进行数据的读取和写入。可以使用BufferedReader和PrintWriter等类来简化与客户端的通信过程。 6. 根据HTTP协议的规范,解析客户端发送的HTTP请求。包括读取请求行、请求头和请求体等信息。 7. 根据请求的URL路径,确定请求的资源。例如,如果请求的路径是"/hello",则返回一个包含"Hello, world!"的响应。 8. 使用HTTP协议的规范,构建HTTP响应。包括设置响应头、响应码和响应体等信息。 9. 将构建的HTTP响应通过Socket的OutputStream发送给客户端。 10. 关闭Socket连接,释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值