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。