搜档网
当前位置:搜档网 › tomcat工作流程

tomcat工作流程

Tomcat安装好后打开目录;可以看到如下结构:

bin :存放服务器脚本;

conf :存放配置文件;

lib :存放需要的JAR文件;

wabapps :存放需要发布的Web应用程序及其部署文件;

work :存放jsp 文件编绎生成的class文件;

logs :存放日志文件;

在conf目录下可以看到 Catalina 目录,context.xml, web.xml, server.xml 等(一些不是很重要的就不列出来了)。

1)提供Tomcat组件的初始配置

2)说明Tomcat的结构,含义,使Tomcat通过实例化组件完成启动及构建自身。server.xml中描述的重要元素

结构如下:

顶层元素,整个配置文件的根元素,表示整个Servlet容器或者Tomcat服务器包含多个Listener,一个GlobalNamingResources和一个Service

一组Connector和一个Engine的集合,这组Connector共用一个Engine来处理所有Connector收到的请求,负责处理所获得到的客户请求

监听器,用来管理Tomcat生命周期和全局资源

配置系统的JNDI(Java Naming and Directory Interface)

连接器,代表外部客户之间的接口,将在一个指定的接口上侦听客户请求,并将获得的请求交给进行处理,然后把处理结果返回给客户

引擎,处理中的所有客户请求,具体来说,获得一个交给的请求后,把这个请求匹配到某个上进行处理,如果没有找到合适的

来进行处理,则把这个请求交给一个默认虚拟主机处理。

虚拟主机,处理一个特定主机的请求,一般来说,每个虚拟主机都可以配置一个到多个Web应用,每个Web应用对应一个,获得的请求最终匹配到某个上,由它进行处理。

Web应用组,每个Web应用由一个或多个Servlet组成,当获得一个

请求后,将映射/conf/web.xml文件中的元素,匹配一个Servlet类

进行处理并返回。当一个Web应用被初始化的时候,它将用自己的ClassLoader 对象载入web.xml中定义的每个Servlet类。

我们启动Tomcat,在浏览器中输入:http://localhost:8080/ 会打开Tomcat

的默认页面。实际上,这个页面是在Tomcat安装目录下的:

/webapps/root/index.jsp;/webapps是Tomcat服务器用来存放Web应用的目录,每个Web应用都将在这建立各自的子目录,刚装好的Tomcat服务器虚拟主机的默认目录是/webapps/ROOT,所以默认会打开这个目录下的文件。流程如下:

在/conf目录下的web.xml配置文件中有如下配置:

index.html

index.htm

index.jsp

这里正是用来配置首页的,Tomcat将按顺序找出标签中的内容作为首页。而在我们的目录下,它只找到了index.jsp,所以会显示它;

但我们不能将所有的Web程序都放在ROOT里。所以我们需要更改Tomcat的虚拟目录;

子元素,实际上是配置了一个Web应用的物理存放地址到Tomcat

虚拟路径的过程,使得Tomcat能够正确找到Web应用的物理存放路径;

步骤:

1)在server.xml的中加上如下代码:

2)我们把写好的Web应用中的所有文件放到下面的目录中:D:/myapp/test

3)重启Tomcat,在浏览器中输入:http://localhost:8080/test 即可测试

Tomcat目录下/conf 可为不同的应用程序配置不同的上下文环境;用来对Servlet进行映射;

一个Web应用的根目录下的/WEB-INF目录中也有一个web.xml,当部署一个Web 应用时,总是先加载/conf/web.xml,然后才加载自己Web应用的

/WEB-INF/web.xml文件;但处理过程中,总是先使用自己的web.xml配置文件,如果无法处理,才把它交给Tomcat的web.xml文件。

当用户在浏览器中输入一个JSP文件地址:

http://localhost:8080/test/index.jsp

提交的请求最终由一个具体的Servlet来进行处理。我们请求传递的过程如下:1)请求首先到达商品为8080的,然后把该请求交给引擎处理;

2)将这个请求匹配到某个去处理,因为这里默认处理的是localhost,所以请求传递到name属性是localhost的

3)根据地址串中的子目录为"test",获知能够处理该请求的Servlet存放在虚拟目录为"test"的Web应用中,于是通过查找元素,找到

path="test" 的,然后根据中的物理路径"docBase"的属性值查找Web应用的物理地址;

4)服务器根据对应的Web应用的“WEB_INF/web.xml”配置文件,查找能够处理index.jsp的servlet;

如上图所示:

connector负责接收客户请求,并向客户返回响应结果.在同一个service中,多个connector共享同一个Engine,同一个Engine可以有多个Host,一个Host可以有多个context;一个context对应一个web项目.在运行时,一个Tomcat会给每个context生成一个ServletContext类的实例.

///////////////////////////////////////////////////////////////////// ///////////////////////////////

1 - Tomcat Server的组成部分

1.1 - Server

A Server element represents the entire Catalina servlet container. (Singleton)

1.2 - Service

A Service element represents the combination of one or more Connector components that share a single Engine

Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求

1.3 - Connector

一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine 来处理,从Engine处获得回应并返回客户

TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求

Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求

Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求

1.4 - Engine

The Engine element represents the entire request processing machinery associated with a particular Service

It receives and processes all requests from one or more Connectors

and returns the completed response to the Connector for ultimate transmission back to the client

Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名

当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理

Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理

1.5 - Host

代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name 相匹配

每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path

当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理

匹配的方法是“最长匹配”,所以一个path==""的Context将成为该Host的默认Context

所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配

1.6 - Context

一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成

Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类

当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类

如果找到,则执行该类,获得请求的回应,并返回

2 - Tomcat Server的结构图

3 - 配置文件$CATALINA_HOME/conf/server.xml的说明

该文件描述了如何启动Tomcat Server

[html]view plaincopy

1.

2.

3.

4.

5.

9.

10.

11.

12.

13.

16.

17.

18.

19.

20.

21.

24.

25.

26. ... ... ... ...

27.

28.

29.

30.

34.

35.

36.

37.

38.

39. className : 该Connector的实现类是

org.apache.coyote.tomcat4.CoyoteConnector

40. port : 在端口号8080处侦听来自客户browser的HTTP1.1请

41. minProcessors : 该Connector先创建5个线程等待客户请求,

每个请求由一个线程负责

42. maxProcessors : 当现有的线程不够服务客户请求时,若线程

总数不足75个,则创建新线程来处理请求

43. acceptCount : 当现有线程已经达到最大数75时,为客户请求

排队

44.当队列中请求数超过100时,后来的请求返回

Connection refused错误

45. redirectport : 当客户请求是https时,把该请求转发到端口

8443去

46.其它属性略

47. -->

48.

49.

50.port="8080"

51.minProcessors="5"maxProcessors="75"acceptCount

="100"

52.enableLookups="true"

53.redirectPort="8443"

54.debug="0"

55.connectionTimeout="20000"

https://www.sodocs.net/doc/1e8964007.html,eURIValidationHack="false"

57.disableUploadTimeout="true"/>

58.

59.

60.

64.

65.

>

66.

67.

68.

69.

70.

.../>

71.

72.

73.

74.

75.

76.

77.

81.

82.

WARs="true"autoDeploy="true">

83.

84.

85.

86.

87.

88.

89.

90.

94.

95.

96.

97.

98.

99.

100.

101.

102.

103.

104.

105.

106.

107.

108.

109.

110.

111.

112.

4 - Context的部署配置文件web.xml的说明

一个Context对应于一个Web App,每个Web App是由一个或者多个servlet组成的

当一个Web App被初始化的时候,它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类

它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类

然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类web.xml文件有两部分:servlet类定义和servlet映射定义

每个被载入的servlet类都有一个名字,且被填入该Context的映射表(mapping table)中,和某种URL PATTERN对应

当该Context获得请求时,将查询mapping table,找到被请求的servlet,并执行以获得请求回应

分析一下所有的Context共享的web.xml文件,在其中定义的servlet被所有的Web App载入

[html]view plaincopy

1.

2.

3.

4.

5.

6.

7.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

24.

25.

26.default

27.

28. org.apache.catalina.servlets.DefaultServlet

29.

30.

31.debug

32.0

33.

34.

35.listings

36.true

37.

38.1

39.

40.

41.

42.

48.

49.

50.invoker

51.

52. org.apache.catalina.servlets.InvokerServlet

53.

54.

55.debug

56.0

57.

58.2

59.

60.

61.

62.

67.

68.

69.jsp

70.org.apache.jasper.servlet.JspServlet

rvlet-class>

71.

72.logVerbosityLevel

73.WARNING

74.

75.3

76.

77.

78.

79.

80.

81.

82.

83.

84.

85.

86.default

87./

88.

89.

90.

91.invoker

92./servlet/*

93.

94.

95.

96.jsp

97.*.jsp

98.

99.

100.

101. 102. 103. 104.

105. ... ... ... ...

106.

107.

108.

109.

110.

5 - Tomcat Server处理一个http请求的过程

假设来自客户的请求为:

http://localhost:8080/wsota/wsota_index.jsp

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector 获得

2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应

3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host

4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host 处理,因为该Host被定义为该Engine的默认主机)

5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context

6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)

7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table 中寻找对应的servlet

8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类

9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法

10)Context把执行完了之后的HttpServletResponse对象返回给Host

11)Host把HttpServletResponse对象返回给Engine

12)Engine把HttpServletResponse对象返回给Connector

13)Connector把HttpServletResponse对象返回给客户browser

相关主题