Spring MVC网址没有.something扩展名

时间:2010-10-14 16:52:31

标签: spring-mvc url-rewriting

首先,如果这是重复,我道歉。我做了很多搜索,但找不到太多,我怀疑我没有使用正确的条款......

我正在使用Spring MVC构建一个站点并使用注释驱动的配置。我想做的是在最后没有任何扩展名的网址(.html,.do等)。所以它们看起来像http://www.mysite.com/account/create,我知道这是传统上使用Apache上的mod_rewrite或使用没有扩展名的文件完成的。似乎可以在不使用重写引擎(我知道urlrewritefilter项目)的情况下完成,因为Spring支持从请求字符串中提取参数(参见the documentation的第15.3.2.1节)和宠物商店示例似乎在其网址末尾没有扩展名。

但是,似乎每当我尝试将所有请求转发给调度程序servlet时(我想如何否定对*.htm之类的需求),我遇到了麻烦...我能够为了让它工作(使用XML配置,我最近切换到注释配置),只为所有页面使用标准的“* .htm”。

我的控制器代码看起来像

@Controller
@RequestMapping("/home")
public class HomeController {

    ...

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView get() {

        ...

    }

我的web.xml看起来像

    <servlet>
        <servlet-name>dispatch</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatch</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

我在这里遗漏了什么吗?如果不使用重写引擎,这可能吗?

我应该注意,上面的配置不起作用。它总是返回404错误...

1 个答案:

答案 0 :(得分:4)

使用/*之类的URL模式通常是一个坏主意,因为容器会将所有内容转发到DispatcherServlet,包括内部的JSP请求。因此,当您的控制器返回ModelAndView中的JSP名称时,它将再次反馈到DispatcherServlet,为您提供404。

您需要在路径中保留文件扩展名,或者需要某种前缀才能区分DispstcherServlet请求和JSP请求。