我的目标是将/ {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?
答案 0 :(得分:2)
答案取决于您是否希望Spring处理:
这些规则都与您在问题中提供的列表相匹配。然而,第二个更容易实现。如果您有一个您不希望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?