Spring MVC:控制器RequestMapping工作,但返回始终给出404
问题内容:
我的控制器方法中有几个SYSOUT,它们出现在控制台日志中……为我验证了所有@RequestMapping的行为均符合预期。环境Bean的@Autowiring也可以正常工作(SYSOUT也可以正确显示)。
但是,方法的返回(我正在使用返回String类型的方法)仅导致404。找不到* .jsps。项目正在使用Maven;IDE是eclipse
kepler,FWIW。
我的ViewResolver是沼泽标准的。看不到断开连接。
我的web.xml:
<?xml版本=“ 1.0”编码=“ UTF-8”?>
<web-app版本=“ 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名称>
<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-名称>
<param-value> $ {project.artifactId} </ param-value>
</ context-param>
</ web-app>
我的servlet.xml:
<?xml版本=“ 1.0”编码=“ 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:注释驱动的/>
<mvc:资源映射=“ / resources / **” location =“ / resources /” />
<导入资源=“ classpath:corpabc / xjp / configuration / properties.xml” />
<bean id =“ viewResolver” class =“ org.springframework.web.servlet.view.InternalResourceViewResolver”>
<属性名称=“ viewClass”
value =“ org.springframework.web.servlet.view.JstlView” />
<属性名称=“前缀” value =“ / WEB-INF / jsp /” />
<属性名称=“后缀” value =“。jsp” />
</ bean>
<bean id =“ dataSourceDB2” class =“ org.springframework.jndi.JndiObjectFactoryBean”>
<属性名称=“ jndiName” value =“ jdbc / BluPrint” />
<属性名称=“ 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/
… 下,但是输入URL
~localhost:8080/bluprint/init
…我得到了404。
我defaultPage.jsp
不存在…我希望这里没有找到条件,这就是我输入时得到的~localhost:8080/bluprint/
。不确定是否应该是404,但是无论如何,这就是我得到的。
问题答案:
我怀疑您的问题出在servlet映射中。/
将强制所有内容通过您的调度程序servlet,包括jsps。尝试丢失。我将在servlet规范中找到相关部分并进行更新。…
根据Servlet规范:
12.2映射的规范在Web应用程序部署描述符中,使用以下语法来定义映射:以’/’字符开头并以’/ *’后缀结尾的字符串用于路径映射。
以“ *”开头的字符串。前缀用作扩展名映射。
空字符串(“”)是一种特殊的URL模式,它精确地映射到应用程序的上下文根,即形式的请求。在这种情况下,路径信息为“
/”,而servlet路径和上下文路径为空字符串(“”)。仅包含“ /”字符的字符串表示应用程序的“默认”
servlet。在这种情况下,Servlet路径是请求URI减去上下文路径,并且路径信息为null。所有其他字符串仅用于完全匹配。
因此,如果您指定/ 来覆盖 .jsp映射,那么jsp请求将被路由回到调度程序servlet中,而不是命中jsp。