5


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

我有:
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-pattern 工作正常,但 ModelAndView 没有被初始化

奇怪的是,它看起来像是他试图访问空资源(Chrome 让我不高兴“ HTTP 状态 404 - ")

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

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

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

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

4

1 回答 1

6

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

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

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

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

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

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

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

于 2013-06-08T06:47:25.023 回答