how does Tomcat serve different applications with in the same servlet container?
我的问题是基于对webserver-servlet容器如何交互的理解。所以,如果我的基本理解是错误的,请纠正我。
考虑一个请求:www.bank.com/credit-cards。
一旦Tomcat服务器收到请求,它就会将其转发到servlet Container的web.xml映射到传入的uri,后者上面是/credit-cards吗?
servlet容器执行其实例化servlet的例程(如果这是第一个请求)。如果没有,它将为此请求创建一个Thread,并将其移交给servlet,servlet负责生成响应。然后,Tomcat将响应返回到客户机浏览器。
现在假设我有另一个请求在www.bank.com/accounts上。这是由同一服务器中的另一个应用程序提供的。它不是同一应用程序中的不同servlet。
现在如何保存URL映射?服务器如何知道应该将请求转发到哪个应用程序?服务器没有任何描述符文件。应用程序1和应用程序2具有web.xml文件,这些文件将传入的URL映射到servlet。所有的URL映射和servlet是否都在服务器的某个地方注册以进行查找?
我想每个应用程序都应该有自己的容器。也就是说,在上面的例子中有两个servlet容器。
这是一个常见的场景吗?我不知道在服务器中使用servlet/jsp来保存多个应用程序的任何实际示例(如果两个请求来自相同或不同的应用程序,用户可能无法区分)。
- context-path是关键的区别点。
- @jigarjoshi:上下文路径设置在哪里?你能详细解释一下吗……
- javapapers.com/servlet/what-is-servlet-mapping
- 上下文路径是war文件的名称,或者在context.xml或server.xml中的上下文标记中定义。tomcat.apache.org/tomcat-7.0-doc/config/…
- 您可以在同一个Tomcat实例中运行许多Web应用程序。每个Web应用程序都有自己的ServletContext。如果存在冲突的路径映射,则容器将投诉。
- @Sotiriosdelimanolis:Tomcat实例如何知道哪个应用程序为URL提供服务。我了解web.xml有到servlet的URL映射。但是Tomcat实例是如何为传入的URL请求提供服务的
- Tomcat拥有/管理来自不同部署描述符的URL映射。
- @Sotiriosdelimanolis:所以不管有多少个应用程序,都只有一个servlet容器?
- 这由你决定。您可以根据需要拥有任意多个servlet容器实例(前提是您更改了端口)。servlet容器可以运行多个Web应用程序。
- @Sotiriosdelimanolis:那么是否有配置来设置我想要多少servlet容器实例?如果我是正确的,当您的网站流量很高时,拥有多个servlet容器实例有助于更快地处理请求。
- 不,这是你手工做的。启动servlet容器的实例意味着启动java进程。您可以启动任意数量的。
- 这会降低服务器的负载或有效地处理请求吗?
每个应用程序在webapps下都有自己的文件夹。
credit-cards的应用程序在.../webapps/credit-cards/下。
accounts的应用程序在.../webapps/accounts/下。
URL中直接位于服务器根目录上的任何文件(如http://localhost:8080/index.jsp)都位于.../webapps/ROOT/文件夹中的root应用程序下。汤姆猫就是这么知道的。
每个文件夹的./WEB-INF/web.xml中的servlet映射将servlet映射到应用程序下面。
如果您在.../webapps/ROOT/或映射的servlet下创建文件夹,可能会遇到问题,这会与另一个应用程序的URL冲突。
编辑:正如布鲁诺在评论中指出的,这个答案只适用于自动部署启用的情况。
- 因此,对于/credit-cards的请求,我需要一个同名的webapp文件夹。这使得它是虎头蛇尾的对吗?
- 您在讨论这里使用自动部署的情况,如果您调整上下文配置,您可能会遇到更复杂的情况。
- 我觉得难以理解。在JigarJoshi上面发布的链接中,它提到servlet容器决定将请求转发到哪个应用程序。但是上下文路径设置是Tomcat的,我想它为Web应用程序映射的URL提供服务。servlet容器和tomcat实例是两个独立的东西。那么,应用程序映射是我困惑的地方……
- @Brain Storm,虽然从技术上讲Tomcat是servlet容器,但有些人可能会使用"servlet容器"来引用应用程序(显然它包含servlet),从而混淆了术语。或者也许我把术语倒过来了。
- 在验证了适当的术语之后,Tomcat是servlet容器,它产生了几个上下文容器(每个容器包含一个应用程序)。