[英]Spring MVC: Controller RequestMapping working, but return always gives a 404
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.我的控制器方法中有几个 SYSOUT,它们出现在控制台日志中...为我验证所有 @RequestMapping 是否按预期运行。 The @Autowiring of an environment bean is also working (is also correctly displayed by a SYSOUT).环境 bean 的 @Autowiring 也可以正常工作(也可以由 SYSOUT 正确显示)。
However, the methods' returns (I am using methods that return String type) are only resulting in 404s.但是,方法的返回(我使用的是返回 String 类型的方法)只会导致 404。 The *.jsps aren't found.未找到 *.jsps。 Project is using Maven;项目正在使用Maven; IDE is eclipse kepler, FWIW. IDE 是 Eclipse 开普勒,FWIW。
My ViewResolver is bog-standard.我的 ViewResolver 是沼泽标准。 Can't see the disconnect.看不到断线。
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/
.我的defaultPage.jsp
不存在......我希望这里有一个 not found 条件,这就是我输入~localhost:8080/bluprint/
。 Not sure if it should be a 404, specifically, but that's what I get, in any case.不确定它是否应该是 404,具体来说,但无论如何,这就是我得到的。
I suspect that you problem is in your servlet mapping.我怀疑您的问题出在您的 servlet 映射中。 /* will force everything through your dispatcher servlet, including jsps. /* 将通过您的调度程序 servlet 强制执行所有操作,包括 jsps。 Try losing the *.尝试丢失 *. I'll find the relevant part in the servlet spec and update....我会在 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. 12.2 映射规范在Web 应用程序部署描述符中,以下语法用于定义映射: 以'/' 字符开头并以'/*' 后缀结尾的字符串用于路径映射。
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, ie, requests of the form .空字符串 ("") 是一种特殊的 URL 模式,它精确地映射到应用程序的上下文根,即表单的请求。 In this case the path info is '/' and the servlet path and context path is empty string (““).在这种情况下,路径信息是“/”,servlet 路径和上下文路径是空字符串(“”)。
A string containing only the '/' character indicates the "default" servlet of the application.仅包含“/”字符的字符串表示应用程序的“默认”servlet。 In this case the servlet path is the request URI minus the context path and the path info is null.在这种情况下,servlet 路径是请求 URI 减去上下文路径,路径信息为空。
All other strings are used for exact matches only.所有其他字符串仅用于精确匹配。
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。
Remove * from servlet-maping, since you are using * means any request, it will start taking any page.从 servlet-maping 中删除 *,因为您使用 * 表示任何请求,它将开始占用任何页面。 Therefore remove *因此删除 *
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.