简体   繁体   English

Spring MVC:控制器 RequestMapping 工作,但返回总是给出 404

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM