Tomcat 详解,对虚拟主机,host,context和servlet的配置说明和解释

1.目录说明:

bin 存放启动(startup.sh)和关闭(shutdown.sh) Tomcat 的二进制脚本文件,比较常用的是 catalina.sh、startup.sh、 shutdown.sh三个文件

conf 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。其中server.xml存放的是服务器配置的关键信息

lib 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务

logs 默认的日志文件存放目录,如访问日志,可以通过server.xml文件配置到其他目录;

temp 存放 Tomcat 运行时产生的文件

webapps 存放项目资源的目录。

work Tomcat 工作目录,如存放JSP编译后的类文件

2. 虚拟主机说明:

也可以看作是一台(虚拟)主机的网站内容,在这里,一台tomcat管理的虚拟主机就会创建一个资源目录,而一台tomcat可以管理多个虚拟主机。通常我们在浏览器上输入一下url“www.su.com:8080”,这里的“www.su.com”就是的一台虚拟主机的名字。也正因为这里只是一个文件夹而不是一台正直的电脑,所以称为虚拟主机。

如下,我创建两个虚拟主机,对应的文件夹分别是webapps和wptwebapps。这两个主机对应的名称分别是“www.localhost.com”和"www.su.com".对两台主机的访问端口号都设置8080.所以浏览器输入:“www.localhost.com:8080”和"www.su.com:8080"就能访问到不同的主机。

然后为了本地能访问这个域名,我们在本地的host文件加上对其域名的解析:

127.0.0.1  www.localhost.com

127.0.0.1  www.su.com

2.1 conf/server.xml配置两个不同主机

想要服务器能访问到不同的主机内容,我们需要在配置文件对其进行配置,即将我们添加的wptwebapps也添加到配置文件中,让tomcat能够识别这个主机。

其中server.xml配置文件如下:

<Server port="8005" shutdown="SHUTDOWN">
    <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1"
                           connectionTimeout="20000"
                           redirectPort="8443" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost"  appBase="webapps"
                        unpackWARs="true" autoDeploy="true">
            </Host>
        </Engine>
    </Service>
</Server>

这是一个树型结构,如下图所示,其中Server 代表tomcat那只猫,一般只会实例化一次。而service默认Catalina,一般也只存在一个。

然后是cennector,代表连接器,它的作用是:

  • 1)监听网络端口
  • 2)接收网络请求
  • 3)读取请求中的网络字节流
  • 4)将请求字节流转换成request对象
  • 5)调用Servlet容器,获取response对象
  • 6)将response对象转换成响应字节流
  • 7)将响应字节流发给浏览器

 然后是引擎Engine,引擎也是一个容器,里面包含多个host对象,也就是我们说的虚拟主机。,如下图的结构;

所以我们需要把server.xml进行如下改造,实现对www.localhost.com和www.su.com的配置和管理:

<Host name="www.localhost.com" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>
<Host name="www.su.com" appBase="wptwebapps" unpackWARs="true" autoDeploy="true"></Host>

2.2 为什么同一个ip,和端口号能访问不同的主机?

在上面我们说到两个网址对应的ip都是127.0.0.1,端口号也是8080,那么他是怎么分辨我们是对哪个主机进行访问呢?

是在浏览器向服务器发送请求时,会携带主机名字,connector受到请求并解析出主机名,然后把请求放到request对象中,并发给引擎,然后引擎根据request对象的目标主机名把对象派发给相应的主机来进行处理。

2.3 一个虚拟主机的不同应用:

一个虚拟主机可以配置多个不同应用,而一个应用在这里对应着一个context对象。

同样在配置文件里需要将其进行配置,context需要作为主机的子节点,其配置方法如下:

<Host name="www.localhsot.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
    #映射指定路径
    <Context path="/webFirst" docBase="/webapps/webFirst" reloadable="true" />
    #映射站点的根目录
    <Context path="/webSecond" docBase="/webapps/webSecond" reloadable="true" />
</Host>

 其中有两个关键参数:docBase:代表应用文件夹对应的物理地址;path:代表访问的地址。如:www.localhost.com/webFirst就将访问webFirst这个应用。

2.4 一个应用不同的servlet

同一个应用又有多个不同的servlet,而每一个servlet可以有一个或者多个实例,每一个servlet的所有实例都被同一个wrapper容器进行管理。总的来说,engine,host,context,wrapper都是容器。通过这些容器,电脑上的servlet被进行了详细的分类管理。连接器connector给出的request对象里面就包含了他要请求的servlet的详细路径。实际上,request对象的层层转发过程就是函数的层层调用过程。

而Servlet可以看作是Web应用中的“工人”,它们负责完成具体的任务,比如处理用户请求、执行业务逻辑、与数据库交互、生成响应等。实际上就是Servlet充当了控制器(Controller)的角色,负责以下任务:

  • 接收来自用户的请求。
  • 解析请求(可能包括查询参数、表单数据等)。
  • 根据请求类型,调用相应的模型逻辑处理数据。
  • 控制视图的生成和选择,以及如何将模型数据呈现给用户。
  • 发送响应给客户端。

一个例子就是,有人向www.localhost.com:8080/webFisrt/login发送了请求,在这里就是向localhost主机的webFirst应用发送了登录相关请求,而这个的登录的请求被负责登录相关的servlet执行并调用登录方法,返回response对象。

在Tomcat等Servlet容器中,这些Servlet实例会被相应的Wrapper容器管理,它们通过容器的配置(如web.xml)映射到特定的URL模式。连接器(Connector)组件负责监听端口,接收HTTP请求,并创建Request和Response对象,其中Request对象包含了请求的详细路径,这样容器就能知道应该调用哪个Servlet来处理请求。

参考来源:

Tomcat详解-优快云博客

JavaWeb开发必看!Tomcat架构及工作原理(8分钟)_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值