问题
参考
组成
Server
- Catalina servlet container(单例)
Service
<Service name="Catalina">
- 1个或多个Connector + 1个Engine,处理所有Connector获得的请求
Connector
- Connector在端口上侦听,将获得请求交给Engine处理,从Engine处获得响应返回客户端
- 有两个典型Connector,一个侦听来自浏览器的Http请求,一个侦听来自其它WebServer的请求
// Coyote Http/1.1 Connector在端口8080处侦听来自浏览器的Http请求
<Conector port="8080" protocol="HTTP/1.1" connectionTimeout="200000" redirectPort="8443" />
// Coyote JK2 Connector在端口8009处侦听来自其它WebServer的Servlet/Jsp代理请求
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Engine
- Engine下可以配置多个虚拟主机(Virtual Host),每个虚拟主机有一个域名
- Engine获得一个请求时,将其匹配到某个Host上处理
- Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host时,将交给默认Host处理
<Engine name="Catalina" defaultHost="localhost">
Host
<Host name="localhost" appBase="webapps" unparkWARs="true" autoDeploy="true">
- 一个虚拟主机和一个网络域名相匹配
- 每个虚拟主机下都可以部署一个或多个应用,每个应用对应于一个Context,有一个Context Path
- Host获得一个请求时,把请求匹配到某个Context上处理
- 匹配方法是“最长匹配”,path==""的Context是Host的默认Context
// 一个Host下配置多个Host
<Context path="/hello" docBase="D:\workspace\hello" debug="0" privileged="true" />
<Context path="/myapp" docBase="D:\workspace\myapp" workDir="D:\myapp\work" reloadable="true" />
// 创建一个Context文件,conf/Catalina/localhost/hello.xml
<Context path="/hello" docBase="D:\workspace\hello" debug="0" privileged="true" />
Context
- 一个Context对应于一个Web应用,由一个或多个Servlet组成
- 配置文件WEBAPP_HOME/WEB-INF/web.xml载入Servlet类
- conf/web.xml中定义DefaultServlet(/)和JspServlet(.jsp,.jspx)
- Context收到请求时,在自己的映射表中寻找相匹配的Servlet类,获得响应,并返回
映射例子
http://localhost:8080/wsota/wsota_index.jsp
http://www.myserver.com/mywebapp/helloServlet/hello
- HttpServletRequest.getPathInfo()拿到这个path info后,可以做逻辑判断
- 比如http://www.xxx.com/blog/jjx,假设servelt的映射为/blog/*,那么jjx就是path info
- 查询用户名为jjx的信息,也就是说要看的是jjx的博客
虚拟主机
基于域名,多个Host节点
http://www.jalja1.org:8080/
http://www.jalja2.org:8080/
基于端口号,多个Service节点
http://www.jalja1.org:8888/
http://www.jalja1.org:8080/
基于IP,Tomcat不支持
request & response
- HttpServletRequest由web容器创建,并以方法参数传递给servlet的service方法
HttpServlet
- J2EE核心基础类,J2EE是一套框架规范,具体实现依赖于各服务器厂商
- Tomcat属于典型的开源J2EE服务器
- 源码(Tomcat 8)分javax和org.apache两部分,javax是J2EE规范要求的,org.apache是Tomcat自身的
反向代理
- 代理服务器接收Internet请求,转发给内部服务器,从内部服务器得到结果返回客户端,对外透明
- nginx + tomcat,nginx本身不支持动态页面