@RequestMapping欢迎文件

时间:2011-04-13 02:06:10

标签: 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>
 <url-pattern>*.html</url-pattern>
</servlet-mapping>

<welcome-file-list>
 <welcome-file>index.html</welcome-file>
</welcome-file-list>

在控制器中,我有

@RequestMapping(value="/index.html", method=RequestMethod.GET)
public ModelAndView showPage(HttpServletRequest request){
  ...
}

这不起作用 - 不会在/test上触发servlet。但是,我发现如果我在/test/index.html创建一个空白文件,那么它 工作 - 我认为默认的servlet在某种程度上有助于找到的index.html。

不幸的是,我不能依赖静态文件。有没有什么方法可以让这个映射工作没有空白文件hack并且没有映射/ *到servlet?

1 个答案:

答案 0 :(得分:2)

答案取决于您是否希望Spring处理:

  • 只有以.html结尾或没有扩展名的网址
  • 所有网址,但以.js和.pdf等结尾的网址除外

这些规则都与您在问题中提供的列表相匹配。然而,第二个更容易实现。如果您有一个您不希望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>

但是,只有当您知道不希望Spring处理的所有扩展时,这才有效,因为您必须在web.xml中列出每个扩展名。

如果你真的想拒绝除.html之外的任何扩展名,那么你需要以某种方式覆盖Spring的默认行为。我不会在这里谈到,因为我认为以上是更好的选择。但是在这个问题中解释了两种可能的方法:spring mvc how to bypass DispatcherServlet for *.html files?