Java 有人能解释servlet映射吗?

Java 有人能解释servlet映射吗?,java,jakarta-ee,servlets,spring-mvc,web.xml,Java,Jakarta Ee,Servlets,Spring Mvc,Web.xml,我正在尝试使用SpringMVC编写一个web应用程序。通常,我只是将一些编好的文件扩展名映射到Spring的前端控制器,然后过得很愉快,但这次我将使用REST,就像URL一样,没有文件扩展名 将上下文路径下的所有内容映射到前端控制器(我们称之为“应用程序””)意味着我也应该处理静态文件,这是我不愿意做的事情(为什么还要重新创建一个weel?),因此与tomcat的默认servlet(我们称之为“tomcat”)进行某种组合似乎是可行的方法 我有工作要做,比如 应用程序 / 雄猫 *.ext

我正在尝试使用SpringMVC编写一个web应用程序。通常,我只是将一些编好的文件扩展名映射到Spring的前端控制器,然后过得很愉快,但这次我将使用REST,就像URL一样,没有文件扩展名

将上下文路径下的所有内容映射到前端控制器(我们称之为“应用程序””)意味着我也应该处理静态文件,这是我不愿意做的事情(为什么还要重新创建一个weel?),因此与tomcat的默认servlet(我们称之为“tomcat”)进行某种组合似乎是可行的方法

我有工作要做,比如


应用程序
/
雄猫
*.ext
并对静态内容的每个文件扩展名重复后一种方法。我只是想知道为什么下面的设置,对我来说相当于上面的设置,不起作用


应用程序
/*
雄猫
*.ext
应用程序
/
雄猫
/一些静态内容文件夹/*

有人能解释一下吗?

我从未尝试过像这样映射servlet,但我认为/*在技术上都以/开头,以/*结尾,即使两个匹配都使用相同的字符。

我想我可能知道发生了什么

在您的工作web.xml中,您已将servlet设置为默认servlet(/本身就是默认servlet,如果没有其他匹配项,则调用该servlet),它将回答与其他映射不匹配的任何请求

在失败的1中,您的/*映射似乎是有效的路径映射。使用web.xml中的/*映射,它会回答除其他路径映射之外的所有请求。根据规范,扩展映射是被显式映射覆盖的隐式映射。这就是扩展映射失败的原因。所有内容都显式映射到应用程序

在Failed 2中,除与静态内容映射匹配的内容外,应用程序负责所有内容。以显示我设置的快速测试中发生的情况。这里有一个例子
/some static content folder/
包含
test.png

尝试访问test.png我尝试了:

/some-static-content-folder/test.png
并且找不到该文件。无论如何努力

/some-static-content-folder/some-static-content-folder/test.png
它来了。因此,Tomcat默认servlet(至少6.0.16)似乎放弃了servlet映射,并将尝试使用剩余路径查找文件。根据这篇文章,Jetty给出了你和我所期待的行为

是否有某些原因使您无法为rest调用映射根目录。类似于app mapped to/rest\u root/*的东西,您对rest\u root文件夹中发生的任何事情负责,但其他任何地方都应该由Tomcat处理,除非您进行另一个显式映射。我建议将RESTservlet设置为路径映射,因为它可以更好地声明意图。使用/或/*似乎不合适,因为您必须映射出异常。以SO为例,我的rest映射如下

/users/*用于用户servlet

/posts/*用于posts servlet

映射顺序

  • 显式(路径映射)
  • 隐式(扩展映射)
  • 默认值(/)
  • 请纠正我的错误。

    作为参考,在Tomcat>=至6.0.29版本中,“失败的尝试#2”是完全正确的

    这是6.0.29版中修复的Tomcat错误的结果:

    
    应用程序
    /
    违约
    /一些静态内容文件夹/*
    
    对“尝试失败#1”的解释完全正确。仍然无法找到另一个。如果/*已经映射到“app”servlet,那么映射“/”也会有什么好处?如果使用/*,映射出/就没有好处,因为它永远不会被调用。/*的缺点是,您需要处理所有事情,而使用/you仍然可以设置扩展映射。至于你的问题,不,没有特别的理由不创建/rest\u root/*映射,只是个人偏好。听起来比使用默认映射和扩展映射更简单(很难:-)意识到Servlet不支持像“/myAppModules/*/Services/*”这样的通配符时有点疯狂。我可以想到许多其他服务器可以处理这个问题,但Servlet不能。有趣的是,业余爱好者级WAMP可以做到这一点,但“企业级”Servlet却不行。相关:
    <!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
    <servlet-mapping>
      <servlet-name>app</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>/some-static-content-folder/*</url-pattern>
    </servlet-mapping>