Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Spring MVC会以404和report作为回应;在DispatcherServlet“中找不到URI为[…]的HTTP请求的映射;?_Java_Spring_Spring Mvc_Servlets - Fatal编程技术网

Java 为什么Spring MVC会以404和report作为回应;在DispatcherServlet“中找不到URI为[…]的HTTP请求的映射;?

Java 为什么Spring MVC会以404和report作为回应;在DispatcherServlet“中找不到URI为[…]的HTTP请求的映射;?,java,spring,spring-mvc,servlets,Java,Spring,Spring Mvc,Servlets,我正在编写一个部署在Tomcat上的Spring MVC应用程序。见下文 最后,我在包com.example.controllers @Controller public class ExampleController { @RequestMapping(path = "/home", method = RequestMethod.GET) public String example() { return "index";

我正在编写一个部署在Tomcat上的Spring MVC应用程序。见下文

最后,我在包
com.example.controllers

@Controller
public class ExampleController {
    @RequestMapping(path = "/home", method = RequestMethod.GET)
    public String example() {
        return "index";
    }
}
我的应用程序的上下文名称是
Example
。当我向

http://localhost:8080/Example/home
应用程序以HTTP状态404响应,并记录以下内容

WARN o.s.web.servlet.PageNotFound-在名为“DispatcherServlet”的“DispatcherServlet”中找不到URI为“[/Example/web-INF/jsps/index.jsp]”的HTTP请求的映射
我在
/WEB-INF/jsps/index.JSP上有一个JSP资源,我希望SpringMVC使用我的控制器来处理请求并转发给JSP,那么为什么它会用404来响应呢



这是一篇关于此警告消息问题的规范帖子。

您的标准Spring MVC应用程序将通过您在Servlet容器中注册的应用程序服务所有请求

DispatcherServlet
查看其
ApplicationContext
,如果可用,则查看向
ContextLoaderListener注册的
ApplicationContext
,以便为特殊bean设置其请求服务逻辑

可以说是最重要的类型映射bean

对处理程序的传入请求以及前置和后置处理程序列表 (处理程序拦截器)基于某些标准,其中 根据
HandlerMapping
实现而变化。最流行的实现 支持带注释的控制器,但其他实现作为 嗯

本文进一步描述了实现必须如何运行

DispatcherServlet
查找此类型的所有bean,并按一定顺序注册它们(可以自定义)。为请求提供服务时,
DispatcherServlet
循环遍历这些
HandlerMapping
对象,并使用测试来找到一个可以处理传入请求的对象,表示为标准的
HttpServletRequest
。从4.3.x开始,如果找不到任何,则显示

在名为SomeName的
DispatcherServlet
中未找到URI为
[/some/path]
的HTTP请求的映射

并抛出或立即提交带有404 Not Found状态代码的响应

为什么
DispatcherServlet
找不到一个
HandlerMapping
可以处理我的请求? 最常见的
HandlerMapping
实现是,它将
@Controller
bean注册为处理程序(实际上是它们的
@RequestMapping
注释方法)。您可以自己声明这种类型的bean(使用
@bean
或其他机制),也可以使用。这些是:

  • @EnableWebMvc
    注释您的
    @Configuration
  • 在XML配置中声明
    成员
  • 正如上面的链接所描述的,它们都将注册一个
    RequestMappingHandlerMapping
    bean(以及一堆其他东西)。但是,没有处理程序,
    HandlerMapping
    就没有多大用处
    RequestMappingHandlerMapping
    需要一些
    @Controller
    Bean,因此您也需要通过Java配置中的
    @Bean
    方法或XML配置中的
    声明,或通过其中一种配置中的
    @Controller
    注释类的组件扫描来声明这些Bean确保这些豆子存在。

    如果您收到警告消息和404,并且正确配置了上述所有内容,则您将请求发送到错误的URI,该URI未被检测到的
    @RequestMapping
    注释处理程序方法处理

    springwebmvc
    库提供了其他内置的
    HandlerMapping
    实现。例如,地图

    从URL到名称以斜杠(“/”)开头的bean

    你也可以自己写。显然,您必须确保发送的请求至少与注册的
    HandlerMapping
    对象的处理程序中的一个匹配。

    如果没有隐式或显式注册任何
    HandlerMapping
    bean(或者如果是
    true
    ),则
    DispatcherServlet
    会注册一些。它们与
    DispatcherServlet
    类在同一个包中定义。它们是
    BeanNameUrlHandlerMapping
    和(与
    RequestMappingHandlerMapping
    类似,但已弃用)

    调试 SpringMVC将记录通过
    RequestMappingHandlerMapping
    注册的处理程序。例如,
    @控制器
    类似

    @Controller
    public class ExampleController {
        @RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
        public String example() {
            return "example-view-name";
        }
    }
    
    将在信息级别记录以下内容

    将“{[/example],methods=[GET],headers=[X-Custom]}”映射到public java.lang.String com.spring.servlet.ExampleController.example()上
    
    这描述了注册的映射。当您看到未找到处理程序的警告时,请将消息中的URI与此处列出的映射进行比较。中指定的所有限制必须匹配,Spring MVC才能选择处理程序

    其他
    HandlerMapping
    实现记录它们自己的语句,这些语句应该提示它们的映射和相应的处理程序

    类似地,在调试级别启用Spring日志记录,以查看Spring注册了哪些bean。它应该报告找到了哪些带注释的类、扫描了哪些包以及初始化了哪些bean。如果您期望的内容不存在,请查看您的
    ApplicationContext
    配置

    其他常见错误
    DispatcherServlet
    只是一个典型的JavaEE。您可以使用典型的
    声明注册它,或者直接通过,或者
    @Controller
    public class ExampleController {
        @RequestMapping(path = "/home", method = RequestMethod.GET)
        public String example() {
            return "index";
        }
    }
    
    @Controller
    public class ExampleController {
        @RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
        public String example() {
            return "example-view-name";
        }
    }
    
    @RequestMapping(path = "/example", method = RequestMethod.GET)
    public String example() {
        return "example-view-name";
    }
    
    @Bean
    public InternalResourceViewResolver resolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setPrefix("/WEB-INF/jsps/");
        vr.setSuffix(".jsp");
        return vr;
    }
    
    @Controller
    Class Controller{
    @RequestMapping(value="/abc.html")//abc is the requesting page
    public void method()
    {.....}
    }
    
    @Bean
    public InternalResourceViewResolver resolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setPrefix("/WEB-INF/jsps/");
        vr.setSuffix(".jsp");
        return vr;
    }
    
    <dependency>
           <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
           <scope>provided</scope>
    </dependency>
    
    <context:annotation-config />
    <context:component-scan
        base-package="com.happy.app"></context:component-scan> 
    
    @ComponentScan(basePackageClasses={WebController.class})
    
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            com.lionheart.fourthed.config.WebConfig
        </param-value>
    </init-param>
    
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            com.lionheart.fourthed.config.MainConfig
        </param-value>
    </init-param>