我的问题是基于对webserver - servlet容器如何交互的理解。如果我的基本理解是错误的,请纠正我。
考虑一个请求:www.bank.com/credit-cards
。
一旦Tomcat服务器收到请求,它就会将其转发给
servlet Container
web.xml
映射到传入的URI
是/credit-cards
以上
Servlet Container执行实例化servlet的例程(如果这是第一个请求)。
如果没有,它将为此请求创建一个Thread
并将其交给Servlet,后者处理生成响应。然后Tomcat将响应返回给客户端浏览器。
现在假设我在www.bank.com/accounts
有另一个请求。这是由在同一服务器中的不同应用程序提供的。它不是在同一个应用程序中的不同servlet。
现在如何保留网址映射?服务器如何知道它应该将请求转发给哪个应用程序?服务器不包含任何描述符文件。应用程序1和应用程序2具有web.xml文件,用于将传入的URL映射到servlet。是否所有URL映射和servlet都在服务器中的某个位置注册以供查找?
我猜每个应用程序都应该有自己的容器。也就是说,在上面的例子中会有两个servlet容器。
这是一种常见情况吗?我不知道任何使用servlet / JSP的真实世界示例,它们在服务器中保存多个应用程序(如果两个请求来自相同或不同的应用程序,用户可能无法区分)
答案 0 :(得分:2)
每个应用程序在webapps
下都有自己的文件夹。
应用credit-cards
位于.../webapps/credit-cards/
。
应用accounts
位于.../webapps/accounts/
下。
直接位于网址中服务器根目录的任何文件(如http://localhost:8080/index.jsp
)位于文件夹root
中的.../webapps/ROOT/
应用程序下。这就是Tomcat如何知道的。
每个文件夹中的Servlet映射./WEB-INF/web.xml
映射应用程序下面的servlet 。
如果您在.../webapps/ROOT/
下创建了文件夹,或者在那里创建了与其他应用程序的URL冲突的servlet,那么您可能会遇到麻烦。
编辑:正如布鲁诺在评论中指出的那样,此答案仅适用于auto deployment开启时。