Spring MVC:Controller RequestMapping工作,但返回总是给出404

问题描述:

我的控制器方法中有几个SYSOUT,它们出现在控制台日志中......验证我所有@RequestMapping的行为都符合预期。环境bean的@Autowiring也正常工作(SYSOUT也正确显示)。

I have a couple of SYSOUTs in my controller's methods, and they appear in the console log... verifying for me that all of the @RequestMapping is behaving as expected. The @Autowiring of an environment bean is also working (is also correctly displayed by a SYSOUT).

然而,方法'返回(我使用返回String类型的方法) )只导致404s。找不到* .jsps。项目正在使用Maven; IDE是eclipse kepler,FWIW。

However, the methods' returns (I am using methods that return String type) are only resulting in 404s. The *.jsps aren't found. Project is using Maven; IDE is eclipse kepler, FWIW.

我的ViewResolver是标准的。看不到断开连接。

My ViewResolver is bog-standard. Can't see the disconnect.

我的web.xml:


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<display-name>BluPrint</display-name>

<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>/*</url-pattern>
</servlet-mapping>

<context-param>
<param-name>groupId</param-name>
<param-value>${project.groupId}</param-value>
</context-param>

<context-param>
<param-name>artifactId</param-name>
<param-value>${project.artifactId}</param-value>
</context-param>

</web-app>

我的servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:task="http://www.springframework.org/schema/task"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xjp="http://www.corpabc.com/schema/xjp"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.corpabc.com/schema/xjp http://www.corpabc.com/schema/xjp/beans.xsd">

<context:component-scan base-package="com.corpabc.bluprint" />

<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />

<import resource="classpath:corpabc/xjp/configuration/properties.xml" />

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

<bean id="dataSourceDB2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/BluPrint" />
<property name="resourceRef" value="true" />
</bean>

<xjp:environment artifactId="${artifactId}" groupId="${groupId}" />

</beans>

我的经理人:

package com.corpabc.bluprint.controllers;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import corpabc.xjp.configuration.env.Environment;

/**
 * 
 * Handles requests for the application.
 */

@Controller
@RequestMapping("/*")
public class BluPrintController {

    @Autowired
    private Environment xjpEnvironment;

    @RequestMapping("/init")
    protected String catchInit(Map<String, Object> model) {
        System.out.println("Got into init method.  XJP Environment: "+xjpEnvironment);
        model.put("xjp", this.xjpEnvironment);
        return "envtest";
    }

    @RequestMapping("/*")
    protected String catchAllOthers(Map<String, Object> model) {
        System.out.println("Got into catch-all method: ");
        return "defaultPage";
    }
}

我的 envtest.jsp 位于 / WEB-INF / jsp / ...但输入网址 ~localhost:8080 / bluprint / init ...我得到404。

My envtest.jsp is under /WEB-INF/jsp/ ... but entering URL ~localhost:8080/bluprint/init ... I get a 404.

我的 defaultPage.jsp 不存在。 ..我希望这里找不到条件,这就是我输入 ~localhost:8080 / bluprint / 时的结果。不知道它是否应该是404,特别是,但这就是我得到的,无论如何。

My defaultPage.jsp doesn't exist... I would expect a not found condition here, and that's what I get when I enter ~localhost:8080/bluprint/ . Not sure if it should be a 404, specifically, but that's what I get, in any case.

我怀疑你问题出在你的servlet映射中。 / *将通过调度程序servlet强制执行所有操作,包括jsps。试着失去*。我将在servlet规范中找到相关部分并更新....

I suspect that you problem is in your servlet mapping. /* will force everything through your dispatcher servlet, including jsps. Try losing the *. I'll find the relevant part in the servlet spec and update....

来自servlet规范:

From the servlet spec:

12.2映射规范
在Web应用程序部署描述符中,使用以下语法定义映射:
以/字符开头并以a结尾的字符串'/ *'后缀用于路径映射。

12.2 Specification of Mappings In the Web application deployment descriptor, the following syntax is used to define mappings: A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping.


  • 以'*。'前缀开头的字符串用作扩展映射。

  • A string beginning with a ‘*.’ prefix is used as an extension mapping.

空字符串()是一个特殊的URL模式,它完全映射到
应用程序的上下文根,即请求表格 。在这种情况下,路径信息为'/',servlet路径和上下文路径为空字符串()。

The empty string ("") is a special URL pattern that exactly maps to the application's context root, i.e., requests of the form . In this case the path info is ’/’ and the servlet path and context path is empty string ("").

仅包含'/的字符串' '字符表示应用程序的默认servlet。在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null。

A string containing only the ’/’ character indicates the "default" servlet of the application. In this case the servlet path is the request URI minus the context path and the path info is null.

所有其他字符串仅用于完全匹配。

All other strings are used for exact matches only.

所以如果指定/ *会覆盖* .jsp映射,那么jsp请求被路由回调度程序servlet而不是命中jsp。

So if you specify /* that overrides the *.jsp mapping, so jsp requests get routed back into your dispatcher servlet instead of hitting the jsp.