Tomcat架构笔记

本文详细介绍了Tomcat的架构,包括Server、Service、Connector、Engine、Host和Context组件,解析了Tomcat处理请求的过程,并通过一个Servlet案例,演示了从创建、编译到部署的完整步骤。在实践过程中,遇到并总结了导致404错误的常见问题,如Webapps目录结构错误、JDK版本与Tomcat不匹配以及单词拼写错误等。
摘要由CSDN通过智能技术生成

目录

1.Tomcat架构图

 2. Tomact组件

1.Server组件

2.Service组件

3.Connector组件

4.Engine组件

5.Host组件

6.Context组件

3.Tomcat处理请求过程

最后 创建一个Servlet案例

创建servlet

编译

创建 web.xml(项目的部署描述文件)

创建Web工程目录结构

访问Servlet

总结:


1.Tomcat架构图


 2. Tomact组件

 

1.Server组件

启动一个 server 实例(即一个 JVM ),它监听在 8005 端口以接收 shutdown 命令。 Server
的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个 Server 实例,必
须配置它们使用不同的端口。
<Server port="8005" shutdown="SHUTDOWN">
port: 接收 shutdown 指令的端口,默认为 8005
shutdown :发往此 Server 用于实现关闭 tomcat 实例的命令字符串,默认为 SHUTDOWN

2.Service组件

Service 主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的
端口和协议接收请求并将其转发至关联的引擎进行处理。困此, Service 要包含一个引擎、一个或多个连接器。

3.Connector组件

支持处理不同请求的组件,一个引擎可以有一个或多个连接器,以适应多种请求方式。
默认只开启了处理 Http 协议的连接器。如果需要使用其他协议,需要在 Tomcat 中配置该协
议的连接器。
                            <Connector port="8888" protocol="HTTP/1.1"
                                                connectionTimeout="20000"
                                                redirectPort="8443" />
port :监听的端口
protocol :连接器使用的协议,默认为 HTTP/1.1;
connectionTimeout :等待客户端发送请求的超时时间,单位为毫秒 ;
redirectPort :如果某连接器支持的协议是 HTTP ,当接收客户端发来的 HTTPS 请求时,
则转发至此属性定义的端口 ;
maxThreads :支持的最大并发连接数,默认为 200 ;

4.Engine组件

Engine Servlet 处理器的一个实例,即 servlet 引擎,定义在 server.xml 中的 Service 标
记中。 Engine 需要 defaultHost 属性来为其定义一个接收所有发往非明确定义虚拟主机的请
求的 host 组件。
<Engine name="Catalina" defaultHost="localhost">
name Engine 组件的名称 ;
defaultHost Tomcat 支持基于 FQDN(Fully Qualified Domain Name 全限定域名 ) 的虚拟主
机,这些虚拟主机可以通过在 Engine 容器中定义多个不同的 Host 组件来实现;但如果此引
擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的
虚拟主机进行处理,因此,在 Engine 中定义的多个虚拟主机的主机名称中至少要有一个跟
defaultHost 定义的主机名称同名;

5.Host组件

位于 Engine 容器中用于接收请求并进行相应处理的虚拟主机。通过该容器可以运行
Servlet 或者 JSP 来处理请求。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
name :虚拟主机的名称, Tomcat 通过在请求 URL 中的域名与 name 中的值匹配,用于
查找能够处理该请求的虚拟主机。如果未找到则交给在 Engine defaultHost 指定的主机处
理;
appBase :此 Host webapps 目录,即指定存放 web 应用程序的目录的路径;
autoDeploy :在 Tomcat 处于运行状态时放置于 appBase 目录中的应用程序文件是否自
动进行 deploy ;默认为 true
unpackWARs :在启用此 webapps 时是否对 WAR 格式的归档文件先进行展开;默认为
true

6.Context组件

Context Host 的子标签,代表指定一个 Web 应用,它运行在某个指定的虚拟主机( Host
上;每个 Web 应用都是一个 WAR 文件,或文件的目录;
<Context path="/test" docBase="D:\bjsxt\itbaizhan.war" />
path :context path 既浏览器访问项目的访问路径。
docBase :相应的 Web 应用程序的存放位置;也可以使用相对路径,起始路径为此 Context
所属 Host appBase 定义的路径;

3.Tomcat处理请求过程

1 、用户访问 localhost:8080/test/index.jsp ,请求被发送到 Tomcat ,被监听 8080 端口并
处理 HTTP/1.1 协议的 Connector 获得。
2 Connector 把该请求交给它所在的 Service Engine 来处理,并等待 Engine 的回应。
3 Engine 获得请求 localhost/test/index.jsp ,匹配所有的虚拟主机 Host
4 Engine 匹配到名为 localhost Host 虚拟主机来处理 /test/index.jsp 请求(即使匹配
不到会请求交给默认 Host 处理), Host 会根据 /test 匹配它所拥有的所有的 Context
5 、匹配到的 Context 获得请求 /index.jsp
6 、构造 HttpServletRequest 对象和 HttpServletResponse 对象,作为参数调用 JspServlet
doGet ()或 doPost ()
. 执行业务逻辑、数据存储等程序。
7 Context 把执行完之后的结果通过 HttpServletResponse 对象返回给 Host
8 Host HttpServletResponse 返回给 Engine
9 Engine HttpServletResponse 对象返回 Connector
10 Connector HttpServletResponse 对象返回给客户 Browser。


最后 创建一个Servlet案例

创建servlet

package tomcat.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet{
    public void doGet(HttpServletRequest request,HttpServletResponse response)
            throws ServletException,IOException{
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>");
        out.println("<HTML>");
        out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
        out.println("<BODY>");
        out.println("<font color=blue>Hello World</font>");
        out.println("</BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
}

编译

D:\>javac -classpath "D:\apache-tomcat-9.0.34\lib\servlet-api.jar" HelloWorld.java

创建 web.xml(项目的部署描述文件)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
        <servlet>
            <servlet-name>helloworld</servlet-name>
            <servlet-class>com.bjsxt.servlet.HelloWorld</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>helloworld</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>

创建Web工程目录结构

 固定结构(文件名字和文件顺序,servlet文件写的包,对应到文件夹创建好,比如图中的文件本来是写在com.*****.servlet下的,所以创建了三个对应的文件夹)

访问Servlet

http://localhost:8080/servletdemo/hello

这样就算成功了

总结:

这个实例花的时间比较久,一开始做完的时候发现tomcat并不能顺利解析反馈,出现了404错误,然后我就开始找错误,不知道问题出在哪里,做了很多没有必要的工作

然后总结一下出问题的地方,希望下次注意点:

1.Webapps里面的固定格式不能错。

2.注意tomcat的版本对应的要求,之前没注意,使用javac的时候出现了警告,以为没事,

后来修改了(我用的是Tomcat9 我的JDK是7 所以出现警告并且出现问题(可能是这个引起的))。

3.就是单词拼写吧,在后面找错误的时候发现了好多单词拼写错误的。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值