【问题标题】:Spring MVC urls without .something extension没有 .something 扩展名的 Spring MVC url
【发布时间】:2010-10-14 16:52:31
【问题描述】:

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

我正在使用 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 错误...

【问题讨论】:

    标签: spring-mvc url-rewriting


    【解决方案1】:

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

    您要么需要在路径中保留文件扩展名,要么需要某种前缀来区分DispstcherServlet 的请求和JSP 的请求。

    【讨论】:

    • 这是一个很好的观点,也是我没有想到的。像/app/* 这样的东西应该工作吗?
    • 成功了,谢谢!对于它的价值,我还在 servlet xml 文件中而不是在上下文配置文件中添加了我的 &lt;mvc:annotation-driven /&gt; 标记...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多