目 录CONTENT

文章目录

Tomcat架构和执行流程

smallkun
2022-07-01 / 0 评论 / 0 点赞 / 91 阅读 / 2,739 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-07-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我删除。

一、Tomcat 架构

1、Http服务器请求处理

浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理,所谓的服务端程序就是你写的Java类,一般来说不同的请求需要由不同的Java类来处理。

1560697061415

HTTP服务器不直接调用业务类,而是把请求交给容器来处理,容器通过Servlet接口调用业务类。因此Servlet接口和Servlet容器的出现,达到了HTTP服务器与业务类解耦的目的。而Servlet接口和Servlet容器这一整套规范叫作Servlet规范。Tomcat按照Servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能。作为Java程序员,如果我们要实现新的业务功能,只需要实现一个Servlet,并把它注册到Tomcat(Servlet容器)中,剩下的事情就由Tomcat帮我们处理了。

2、Servlet容器工作流程

为了解耦,HTTP服务器不直接调用Servlet,而是把请求交给Servlet容器来处理,那Servlet容器又是怎么工作的呢?

当客户请求某个资源时,HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法,Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的Servlet,如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化,接着调用Servlet的service方法来处理请求,把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端。

1560833167711

二、Tomcat架构和执行流程

1、首先介绍几个概念

Server:服务器,启动一个tomcat就是启动了一个服务器,一个Server可以有多个Service,一个Service可以有多个Connectior和Engine

Service:服务,一个server可以包含多个service 一个service维护多个Connector和一个Engine

Engine:叫引擎,也有资料叫Container,一个服务可以开一个引擎,就是一个公司可以有很多个门,不同身份的人从不同的门进,但是具体干活的就一个部门。引擎负责处理请求,不需要考虑请求链接,协议等。

Context:一个Context管理一个应用,其实就是我们写的程序。

Wrapper:每个都封装着一个Servlet(当然只局限于普通的Http请求)。

dns www.ydl.com —> 127.0.0.1,www.ydl2.com—>127.0.0.1

image-20210928105304421

2、Tomcat运行流程

image-20210928105441375

客户发送一个请求:http://localhost:8080/test/index.html。请求被发送到本机端口8080后,执行流程如下:

  1. 被在那里侦听的Coyote HTTP/1.1 Connector获得,然后引擎负责处理请求,不需要考虑请求链接,协议等。
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
  3. Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host。
  4. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)。
  5. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context。
  6. Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)。
  7. path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet。
  8. Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类,构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
  9. Context把执行完了之后的HttpServletResponse对象返回给Host。
  10. Host把HttpServletResponse对象返回给Engine。
  11. Engine把HttpServletResponse对象返回给Connector。
  12. Connector把HttpServletResponse对象返回给客户browser。

我们在使用tomcat的时候可以不理会中间的实现的任何过程,专心于我们的业务代码的编写,不停的写servlet就行了,极大的提升了写代码的效率。

3、Tomcat 服务器配置

Tomcat 服务器的配置主要集中于 tomcat/conf 下的 catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml 文件。

(1)server.xml

server.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器(Catalina)的所有配置。由于配置的属性特别多,我们在这里主要讲解其中的一部分重要配置。

【Server】是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是 org.apache.catalina.core.StandardServer。

<Server port="8005" shutdown="SHUTDOWN">
	...
</Server>

port : Tomcat 监听的关闭服务器的端口。

shutdown: 关闭服务器的指令字符串。

【Connector】 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进行优化。

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

属性说明:

1) port: 端口号,Connector 用于创建服务端Socket 并进行监听, 以等待客户端请求链接。如果该属性设置为 0,Tomcat将会随机选择一个可用的端口号给当前Connector 使用。

2) protocol : 当前Connector 支持的访问协议。 默认为 HTTP/1.1 。

3) connectionTimeOut : Connector 接收链接后的等待超时时间, 单位为 毫秒。 -1 表示不超时。

完整的配置如下:

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>


  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

我们能得知的信息是:有个默认的服务是Catalina,这个服务默认开放了8080端口的连接器,默认的引擎也叫Catalina,它管理一个默认的主机localhost,localhost的根目录是webapp。

不妨我们打开webapp,我们能看到这里边已经有了几个项目了。

image-20210928153831460

这里边已经有了几个工程,这几个工程有管理工具,有例子程序,我们以后项目就可以放在这里。如果输入的后没有加项目名字,默认会进入ROOT,比如我们看到的首页就是ROOT中的工程。

我们不妨在webapp中新建,app文件

image-20210928153802358

重新启动tomcat,访问localhost:8080/app/index.html

image-20210928154511505

结果如下。

给一个service增加监听端口:

<Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="9090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="9443" />
    ...
</Service>

意思就是同时开了8080、9090以及8443和9443四个端口。这里只是测试,一般是没有必要的。

image-20210928155145556

9090端口一样能打开,这就相当于给我们的服务开了好几个门,通过这几个门,数据都能进来。

image-20210928155208757

比如我们可以这样去操作:

我们在hosts文件中再配置一个主机域名

路径是:C:\Windows\System32\drivers\etc

受用notepad++修改hosts文件:

image-20210928151854110

再给我们本机配置一个主机域名:这时不管是localhost还是www.ydl.com都会指向本机:

接着就该位置文件:

<Engine name="Catalina" defaultHost="localhost"> 
    <!-- 配置一个新的host指向d盘的目录 -->
    <Host name="www.ydl.com"  appBase="D:\\webapps"
          unpackWARs="true" autoDeploy="true">
    </Host>

    <!-- 原有的也是默认的host -->
    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">
        ...
    </Host>

</Engine>

当然我们在D盘下新建webapps,这只是个目录的名字,你可以在任何的地方,叫任何的名字:

我们新建目录app,并在app下新建index.html。

<h1>www.ydl.com</h1>

启动tomcat,访问http://www.ydl.com:8080/app/index.html

image-20210928152359863

成功了,这里我们验证了多了主机域名。

4、创建Javaweb项目

(1)创建项目

直接创建一个Java项目,我们自己尝试构建:

image-20210928160756575

(2)创建名字

image-20210928160820395

(3)项目结构

按照我的项目结构创建目录。

image-20210928161419437

(4)构建web项目

进入项目构建的选项卡中:快捷键是 ctrl + shift + alt + s,也可以先点击file,再进入。

image-20210928161551043

在facets选项中给项目添加特性:

点击加号,选择web,点击OK

image-20210928161920071

这个指的是我们的xml所在的位置,一定要修改正确

image-20210928162013003

很明显,我这个不对,如果不对,就点击减号删除掉,点击加新增一个。

修改后:

image-20210928162222154

保证路径正确就行了,这个路径也要正确,如果不正确自行修改

image-20210928162302361

添加一个artifacts,

image-20210928162409501

它会自动给你添加:

image-20210928162432965

点击确定,配置完成。

image-20210928162605055

(5)配置web服务器(tomcat)

image-20210928162630694

点击+ 选择 tomcat Server 选择local

image-20210928163357966

选择我们的tomcat10

image-20210928163433832

image-20210928163108843

选择artfacts,讲我们的工程部署上去。

image-20210928163157741

点击确定

(6)部署文件

image-20211014150953927

(7)启动

image-20210928163225537

image-20210928163722095

乱码修改:

image-20210928163804098

image-20210928163837584

image-20210928163907614

image-20210928163956981

0

评论区