先贴出一个对象间的结构图
<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,
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
aj
pConnector侦听来自其它WebServer的请求,如8009:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
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类
<servlet>
<description></description>
<display-name>FileDownloadServlet</display-name>
<servlet-name>FileDownloadServlet</servlet-name>
<servlet-class>com.itiptop.portal.servlet.FileDownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileDownloadServlet</servlet-name>
<url-pattern>/FileDownloadServlet</url-pattern>
</servlet-mapping>
(此处图片借鉴了某位仁兄的,我加了点东西,画图什么的还是不会的)
现在假设客户端有个请求: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