Spring @请求映射欢迎文件

Spring @请求映射欢迎文件,spring,tomcat,web.xml,spring-annotations,Spring,Tomcat,Web.xml,Spring Annotations,我的目标是将/{any path}和*.html映射到一个servlet,而不映射/*。例如: map: /foo /foobar/ /bar.html /foo/bar.html don't map: /foo.js /bar.pdf 为了做到这一点,我有一个servlet和welcome文件映射如下: web.xml: <servlet-mapping> <servlet-name>someServlet</servlet-name> <ur

我的目标是将/{any path}和*.html映射到一个servlet,而不映射/*。例如:

map:
/foo
/foobar/
/bar.html
/foo/bar.html

don't map:
/foo.js
/bar.pdf
为了做到这一点,我有一个servlet和welcome文件映射如下:

web.xml:

<servlet-mapping>
 <servlet-name>someServlet</servlet-name>
 <url-pattern>*.html</url-pattern>
</servlet-mapping>

<welcome-file-list>
 <welcome-file>index.html</welcome-file>
</welcome-file-list>
这将不起作用-servlet不会在
/test
上触发。但是,我发现如果我在
/test/index.html
中创建一个空白文件,那么它就可以工作了-我假设默认servlet通过查找index.html在某种程度上有所帮助


不幸的是,我不能依赖静态文件。有没有一种方法可以在没有空白文件HAK的情况下进行映射,而不需要映射到servlet?

< p>答案取决于是否希望Spring处理:

  • 仅以.html结尾或不带扩展名的URL,或
  • 所有URL,除了以.js和.pdf结尾的URL等
这两条规则都符合你在问题中给出的列表。然而,第二个更容易实现。如果您有不希望Spring处理的已知扩展名列表,只需将
web.xml
文件中的这些文件映射到默认处理程序,如下所示:

<servlet-mapping>
    <servlet-name>someServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

someServlet
/
违约
*.js
然而,这只有在您知道所有不希望Spring处理的扩展时才有效,因为您必须在
web.xml
中列出每个扩展


如果您真的想拒绝.html以外的任何扩展,那么您需要以某种方式覆盖Spring的默认行为。我不会在这里讨论这个问题,因为我认为上面提到的是一个更好的选择。但是在这个问题中解释了两种可能的方法:

我选择了第一种方法,但是看到第二种方法有多干净,我将改变我的问题,以便使用排除法解决它。谢谢
<servlet-mapping>
    <servlet-name>someServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>