【问题标题】:Spring MVC configure url-patternSpring MVC 配置 url 模式
【发布时间】:2013-06-04 00:45:22
【问题描述】:


我尝试配置简单的控制器。

我有:
web.xml

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
</servlet-mapping>

mvc-dispatcher-servlet.xml

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="urlMap">
        <map>
            <entry key="/index.jsp">
                <ref bean="mainPage"/>
            </entry>
        </map>
    </property>
</bean>

<bean name="mainPage" class="ru.mypack.TBController" />

这是我的控制器

public class TBController extends AbstractController {

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    System.out.println("It is here");
    ModelAndView model = new ModelAndView("index");
    return model;
}}

我在 Tomcat 6 上运行,在此配置中它 (/index.jsp) 完美运行!

但是如果我像这样改变 url-pattern

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

它返回 404 访问 /index.jsp

我在控制台中看到“它在这里”,这意味着 url 模式工作正常,但 ModelAndView 没有被初始化

奇怪的是,看起来他试图访问空资源 (Chrome 显示我“HTTP 状态 404 - ”)

请帮助我了解发生了什么。我可能错过了 url-pattern 规范中的某些内容吗?

UPD:
感谢 Pavel Horal,我们找到了解决方案。
我刚刚将 web.xml 中的 url-pattern 替换为

<url-pattern>/test/*</url-pattern>

现在它通过 /test/index.jsp 响应

【问题讨论】:

标签: java jsp spring-mvc http-status-code-404


【解决方案1】:

Spring 正在处理如何定义 servlet 映射的信息。如果您使用的是后缀映射 (*.something),那么 Spring 只使用第一部分(没有后缀)。这意味着你应该在你的 url-pattern 中只映射 /index(不带后缀)。

Spring 的 UrlPathHelper#getPathWithinServletMapping 中的 JavaDoc 更好地描述了映射过程中使用的内容:

返回给定请求的 servlet 映射中的路径,即 请求的 URL 超出调用 servlet 的部分, 或 "" 如果整个 URL 已用于标识 servlet。

如果在 RequestDispatcher 中调用,则检测包含请求 URL 包括。

例如:servlet 映射 = "/test/*";请求 URI = "/test/a" -> "/a"。

例如:servlet 映射 = "/test";请求 URI = "/test" -> ""。

例如:servlet 映射 = "/*.test";请求 URI = "/a.test" -> ""。

【讨论】:

  • 谢谢,现在很清楚了!我保证,下次我会更仔细地阅读 JavaDoc :)
  • 这个特殊的 JavaDoc 并不容易找到。这是内部 Spring 类。然而,我喜欢 Spring 的一点是,即使是内部类也有很好的定义和文档记录(与许多其他框架不同)。
  • @PavelHoral 你能帮我解决这个问题吗?谢谢。 stackoverflow.com/questions/33522888/…
猜你喜欢
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2017-03-19
  • 2018-05-05
  • 1970-01-01
  • 2014-06-08
  • 2014-05-01
  • 2011-01-08
相关资源
最近更新 更多