Java 为什么Spring MVC会以404和report作为回应;在DispatcherServlet“中找不到URI为[…]的HTTP请求的映射;?
我正在编写一个部署在Tomcat上的Spring MVC应用程序。见下文 最后,我在包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";
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>