Java Tomcat如何在同一个servlet容器中为不同的应用程序提供服务?

Java Tomcat如何在同一个servlet容器中为不同的应用程序提供服务?,java,jsp,tomcat,servlets,servlet-container,Java,Jsp,Tomcat,Servlets,Servlet Container,我的问题是基于对webserver-servlet容器如何交互的理解。所以,如果我的基本理解是错误的,请纠正我 考虑进来的请求:www.bank.com/credit cards Tomcat服务器一收到请求,就将其转发给 servlet容器的web.xml映射到 上面是/信用卡 Servlet容器执行其实例化Servlet的例程(如果这是第一个请求)。 如果没有,它将为此请求创建一个线程,并将其交给Servlet,由Servlet处理响应的生成。Tomcat然后将响应返回到客户端浏览器 现在假

我的问题是基于对webserver-servlet容器如何交互的理解。所以,如果我的基本理解是错误的,请纠正我

  • 考虑进来的请求:
    www.bank.com/credit cards

  • Tomcat服务器一收到请求,就将其转发给
    servlet容器
    web.xml
    映射到 上面是
    /信用卡

  • Servlet容器执行其实例化Servlet的例程(如果这是第一个请求)。 如果没有,它将为此请求创建一个
    线程
    ,并将其交给Servlet,由Servlet处理响应的生成。Tomcat然后将响应返回到客户端浏览器

  • 现在假设我在
    www.bank.com/accounts
    上有另一个请求。这是由同一服务器中具有的不同应用程序提供的。在同一个应用程序中,它不是一个不同的servlet

  • 现在,url映射是如何保持的?服务器如何知道应该将请求转发给哪个应用程序?服务器不保存任何描述符文件。应用程序1和应用程序2具有将传入url映射到servlet的web.xml文件。是否所有URL映射和servlet都在服务器中的某个位置注册以进行查找

  • 我想每个应用程序都应该有自己的容器。也就是说,在上述情况下将有两个servlet容器

  • 这是常见的情况吗?我不知道有哪个真实世界的例子使用servlet/JSP在服务器中保存多个应用程序(可能用户无法区分这两个请求是否来自相同或不同的应用程序)


  • 每个应用程序在
    webapps
    下都有自己的文件夹

    应用程序
    信用卡
    位于
    ../webapps/credit cards/

    应用程序
    accounts
    位于
    ../webapps/accounts/

    URL中直接位于服务器根目录上的任何文件,如
    http://localhost:8080/index.jsp
    位于文件夹
    ../webapps/root/
    中的
    根目录下。Tomcat就是这样知道的

    每个文件夹的
    /WEB-INF/WEB.xml
    中的Servlet映射将Servlet映射到应用程序下面

    如果您在
    ../webapps/ROOT/
    下创建文件夹,或者在其中映射的servlet与另一个应用程序的URL冲突,则可能会遇到麻烦


    编辑:正如Bruno在一篇评论中指出的,这个答案仅在启用时适用。

    上下文路径
    是关键区别,或者上下文路径是war文件的名称,或者在context.xml或server.xml中的context标记中定义。您可以在同一个Tomcat实例中运行许多web应用程序。每个web应用程序都有自己的
    ServletContext
    。如果存在冲突的路径映射,容器将发出投诉。Tomcat拥有/管理来自各种部署描述符的url映射。因此,对于
    /credit cards
    请求,我需要一个名称完全相同的webapp文件夹。这就使得它紧密地结合在一起了,对吧?你说的是这样的情况,如果你调整这个参数,你可能会遇到更复杂的情况。我觉得理解起来很困惑。在jigar Joshi上面的链接中,提到servlet容器决定将请求转发给哪个应用程序。但是我想上下文路径设置是Tomcat的,它为web应用程序映射的URL提供服务。Servlet容器和Tomcat实例是两个独立的东西。那么,应用程序映射的哪一个是我困惑的焦点。@brain storm,虽然从技术上讲Tomcat是Servlet容器,但有些人可能会使用“Servlet容器”来指代应用程序(显然包含Servlet),从而混淆术语。或者我自己把术语倒过来了。在验证了正确的术语之后,Tomcat是Servlet容器,它生成了几个上下文容器(每个容器包含一个应用程序)。