Java Spring MVC:控制器 RequestMapping 工作,但返回总是给出 404
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19546857/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring MVC: Controller RequestMapping working, but return always gives a 404
提问by David Neuschulz
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).
我的控制器方法中有几个 SYSOUT,它们出现在控制台日志中...为我验证所有 @RequestMapping 是否按预期运行。环境 bean 的 @Autowiring 也可以正常工作(也可以由 SYSOUT 正确显示)。
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.
但是,方法的返回(我使用的是返回 String 类型的方法)只会导致 404。未找到 *.jsps。项目正在使用Maven;IDE 是 Eclipse 开普勒,FWIW。
My ViewResolver is bog-standard. Can't see the disconnect.
我的 ViewResolver 是沼泽标准。看不到断线。
My web.xml:
我的 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>
My servlet.xml:
我的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>
My Controller:
我的控制器:
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";
}
}
My envtest.jsp
is under /WEB-INF/jsp/
... but entering URL ~localhost:8080/bluprint/init
... I get a 404.
我envtest.jsp
在/WEB-INF/jsp/
……但输入 URL ~localhost:8080/bluprint/init
……我得到 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.
我的defaultPage.jsp
不存在......我希望这里有一个 not found 条件,这就是我输入时得到的~localhost:8080/bluprint/
。不确定它是否应该是 404,具体来说,但无论如何,这就是我得到的。
采纳答案by Aaron
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 映射中。/* 将通过您的调度程序 servlet 强制执行所有操作,包括 jsps。尝试丢失 *. 我会在 servlet 规范中找到相关部分并更新....
From the servlet spec:
从 servlet 规范:
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.
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 (““).
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.
12.2 映射规范在Web 应用程序部署描述符中,以下语法用于定义映射: 以'/' 字符开头并以'/*' 后缀结尾的字符串用于路径映射。
以 '*.' 开头的字符串 前缀用作扩展映射。
空字符串 ("") 是一种特殊的 URL 模式,它精确地映射到应用程序的上下文根,即表单的请求。在这种情况下,路径信息是“/”,servlet 路径和上下文路径是空字符串(“”)。
仅包含“/”字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet 路径是请求 URI 减去上下文路径,路径信息为空。
所有其他字符串仅用于精确匹配。
So if you specify /* that overrides the *.jsp mapping, so jsp requests get routed back into your dispatcher servlet instead of hitting the jsp.
因此,如果您指定 /* 覆盖 *.jsp 映射,那么 jsp 请求将被路由回您的调度程序 servlet 而不是命中 jsp。
回答by Pratik Gaurav
Remove * from servlet-maping, since you are using * means any request, it will start taking any page. Therefore remove *
从 servlet-maping 中删除 *,因为您使用 * 表示任何请求,它将开始占用任何页面。因此删除 *
from
从
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
to
到
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>