Tomcat 对象

本贴最后更新于 2780 天前,其中的信息可能已经时移俗易

先贴出一个对象间的结构图

<Server>  
    <Listener></Listener>  
    <Listener></Listener>  
    ......(多个Listener)  
    <GlobalNamingResources>  
        <Resource></Resource>  
    </GlobalNamingResources>  
    <Service>  
        <Connector protocol="HTTP/1.1"></Connector>  
        <Connector protocol="AJP/1.3"></Connector>  
        ......(一般2个Connector)  
        <Engine>  
            <Realm></Realm>  
            <Host>  
                <Valve></Valve>  
                ......(可以有多个)  
            </Host>  
        </Engine>  
    </Service>  
</Server>  

一个 server(服务器)包含一至多个 service(服务),一个 service 包含惟一一个 Engine(处理机)或者一至多个 connector(连接器),一个 Engine 包含多个 host(虚拟主机),一个 host 包含一至多个 content(web 应用)

下面对各个节点分析:

1 Server

整个 Catalina 容器的入口点,通过 Serverfactory 生成 Server 实例类
<Server port="8005" shutdown="SHUTDOWN">

2 Service

N 个 Connector+1 个 Engine,处理所有 Connector 所获得的请求
<Service name="Catalina">

3 Connector

把从 Socket 传递过来的数据封装成 Request,传递给容器,有 2 种包括 httpConnector 和 ajpConnector,

httpConnector 侦听来自浏览器的 http 请求,如 8080:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
ajpConnector 侦听来自其它 WebServer 的请求,如 8009:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
属性解释:

className:Connector 的实现类

port:侦听的端口

minProcessors:最小线程数,初始化几个线程等待请求(5)

maxProcessors:最大线程数,线程请求超过最大线程数则不会立即创建线程,而是加入排队中(75)

acceptCount:排队数,如果排队过多了,那么就不响应请求了,返回 Connection refused 错误(100)

redirectport:如果请求是 https 时,把该请求转发到端口 8443 去

Tomcat 有 3 个容器,Engine,Host 和 Context

4 Engine

Engine 收到 Connector 传递来的请求后,它把该请求匹配到某个 Host 上,然后把该请求交给该 Host 来处理,如果没有匹配到,则用默认的 Host,此处是 localhost,Engine 常用类型有 2 种,Catalina 和 Standalone
<Engine defaultHost="localhost" name="Catalina">

5 Host

虚拟主机,每个虚拟主机有一个域名如 localhost,一个虚拟主机下可以部署一个或者多个 Web App,也就是多个 Context,当 Host 获得一个请求时,将把该请求匹配到某个 Context 上,然后把该请求交给该 Context 来处理
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">

6 Context

一个 Context 对应一个 web app,一个 app 由 N 个 Servlet 组成,Context 根据 web.xml 载入 Servlet 类

1.  <servlet>  
2.      <description>description>  
3.      <display-name>FileDownloadServletdisplay-name>  
4.      <servlet-name>FileDownloadServletservlet-name>  
5.      <servlet-class>com.itiptop.portal.servlet.FileDownloadServletservlet-class>  
6.  servlet>  
7.  <servlet-mapping>  
8.      <servlet-name>FileDownloadServletservlet-name>  
9.      <url-pattern>/FileDownloadServleturl-pattern>  
10.  servlet-mapping>

7.小结

现在假设客户端有个请求:http://localhost:8080(Host)/webbei(Context)/index.jsp(Servlet)

  1. 请求被发送到本机端口 8080,被在那里侦听的 HTTP Connector 获得
  2. Connector 把该请求交给它所在的 Service 的 Engine 来处理,并等待来自 Engine 的回应
  3. Engine 获得请求 localhost:8080/webbei/index.jsp,匹配名为 localhost 的虚拟主机(Host)
  4. localhost Host 获得请求/webbei/index.jsp,匹配名为/webbei 的 Context(web app)
  5. path="/webbei"的 Context 获得请求/index.jsp,在它的 mapping table 中寻找对应的 servlet
  6. Context 匹配到 URL PATTERN 为*.jsp 的 servlet,对应于 JspServlet 类
  7. 构造 HttpServletRequest 对象和 HttpServletResponse 对象,作为参数调用 JspServlet 的 doGet 或 doPost 方法
  8. Context 把执行完了之后的 HttpServletResponse 对象返回给 Host
  9. Host 把 HttpServletResponse 对象返回给 Engine
  10. Engine 把 HttpServletResponse 对象返回给 Connector
  11. Connector 把 HttpServletResponse 对象返回给客户端 browser

附加:tomcat-users

<?xml version="1.0" encoding="UTF-8"?>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="admin" password="admin" roles="admin,manager"/> 
</tomcat-users>
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...