Tomcat的部署方式:
在部署的时候Tomcat是并行部署项目
可以参照:https://www.cnblogs.com/honger/p/10362774.html
描述符部署
deployDescriptors(configBase,configBase.list())
从configBase部署发布XML描述文件
war包部署
deployWARs(appBase, filteredAppPaths);
.war可以全部是class文件。其中web.xml也是可以删除的。
但是将其打包为.jar包放在Tomcat文件夹下是无法生效的,因为在Java中一般.jar包是一个依赖包而且源码中也有文件类型判断。
用.war包结尾的就被Tomcat视为一个项目。
在Tomcat的代码中有一个判断,只有当程序为.war结尾时才会去走以下的逻辑。
文件夹部署
deployDirectories(appBase, filteredAppPaths);
可以通过指定地址部署,不用复制到Tomcat下。
在部署Tomcat项目的时候可以在server.xml文件中的目录下定义一个节点。path代表应用名(访问的时候的名字,http的地址),docBase代表项目的地址
Tomcat是一个Servlet容器
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter().println("hello")
}
}
在实现该功能的时候肯定要执行myServlet.doGet()方法,该方法是由Tomcat实现的。
处理请求的大致流程。
开始请求--->Request--->RequestFacade--->myServlet.doGet(RequestFacade)
//Tomcat最后调用的是myServlet.service(RequestFacade)方法,在方法中使用doGet方法
Tomcat四大容器
Engine,Host,Context,Wrapper
Tomcat相当于一个虚拟主机:一个虚拟主机下可以部署多个项目。也可以说多个项目属于一个虚拟主机。
Engine—>Host—>Context—>Wrapper—>Servlet
Engine,Host,Context,Wrapper都是servlet容器。
Engine,Host都是集群管理器。
Wrapper:对servlet进行区分。类似于,有多个类包含servlet,每个类中有 多个servlet(List),在Wrapper层将每个类中的servlet封装在一起,Context层将所有类的servlet封装在一起(LIst)。
普通的servlet在Tomcat中是所有的请求线程共享一个实例。(可以理解为单例)
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter().println("hello")
}
}
如果实现了SingleThreadModel接口。每个请求都单独有一个servlet实例。
public class MyServlet extends HttpServlet implements SingleThreadModel{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter().println("hello")
}
}
如下的nameproject是属于name.com主机的。下面的所有name必须保证是同一个IP地址,这样才能保证Tomcat能接收到请求。
在进行Host配置的时候一定要加上项目路径。例如
Host的优点:
- 可以针对每一个Host进行不同的配置。比如:单独记录日志。
- 当同一个机器上有多个不同类型的项目时容易区分。
- 相互之间的影响减少,解耦。
server.xml
<Host name="name.com" appBase="webappss">
<Contest path="/nameproject" docBase="D:\IDEA\spring" >
<!-- 所有访问name.com的日志文件都放在localhost_access_log下 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="baidu.com" appBase="webappss2">
</Host>
<Host name="localhost" appBase="webappss2">
</Host>