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来处理请求。
参考来源: