我正在编写一个部署在Tomcat上的Spring MVC应用程序。请参阅以下最小、完整且可验证的示例
public class Application extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { };
}
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { SpringServletConfig.class };
}
protected String[] getServletMappings() {
return new String[] { "/*" };
}
}
其中SpringServletConfig
是
@Configuration
@ComponentScan("com.example.controllers")
@EnableWebMvc
public class SpringServletConfig {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
}
最后,我在包com中有一个
@Controller
。实例控制器
@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 - No mapping found for HTTP request with URI `[/Example/WEB-INF/jsps/index.jsp]` in `DispatcherServlet` with name 'dispatcher'
我在/WEB-INF/jsps/index上有一个JSP资源。jsp
我希望SpringMVC使用我的控制器来处理请求并转发给jsp,那么为什么它会用404来响应呢?
这是一个关于这个警告信息的问题的规范帖子。
在我的例子中,我遵循5.1.2版本的拦截器Spring留档(同时使用Spring Boot v2.0.4)。RELEASE)和WebConfig
类有注释@EnableWebMvc
,这似乎与我的应用程序中阻止我的静态资产被正确解析的其他东西相冲突(即没有CSS或JS文件返回到客户端)。
在尝试了很多不同的东西之后,我尝试删除了@EnableWebMvc
,它成功了!
编辑:这里的参考留档说您应该删除@EnableWebMvc
注释
显然,至少在我的情况下,我已经配置了我的Spring应用程序(尽管不是通过使用web.xml
或任何其他静态文件,它肯定是以编程方式),所以这是一个冲突。
除上述情况外,我还解决了我的问题:`
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
添加了tomcat嵌入jasper:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
`from:JSP文件未在Spring Boot web应用程序中呈现
您的标准Spring MVC应用程序将通过已在Servlet容器中注册的DispatcherServlet
为所有请求提供服务。
DispatcherServlet
查看其ApplicationContext
,如果可用,则查看向ContextLoaderListener注册的
ApplicationContext
,以便为特殊bean设置其请求服务逻辑。文档中描述了这些bean。
可以说是最重要的,类型为
HandlerMapping
map的bean
对处理程序的传入请求以及基于某些标准的前置和后置处理器(处理程序拦截器)列表,这些标准的详细信息因
HandlerMapping
实现而异。最流行的实现支持带注释的控制器,但也存在其他实现。
HandlerMapping
的javadoc进一步描述了实现必须如何运行。
DispatcherServlet
查找此类型的所有bean,并按一定顺序注册它们(可以自定义)。为请求提供服务时,DispatcherServlet
循环遍历这些HandlerMapping
对象,并使用getHandler
测试每个对象,以找到一个可以处理传入请求的对象,表示为标准的HttpServletRequest
。截至4.3。x、 如果它没有发现任何警告日志,那么
没有找到HTTP请求与URI的映射
[/some/path]
在DispatcherServlet
中的名称
并抛出一个
NoHandlerFoundException
,或立即提交带有404未找到状态代码的响应。
最常见的
HandlerMap
实现是刚需MappingHandlerMap
,它处理将@Controller
bean注册为处理程序(实际上是它们的@刚需映射
带注释的方法)。您可以自己声明这种类型的bean(使用@Bean
或)
用@EnableWebMvc
注释你的@Configuration
类。
- 声明一个
正如上面的链接所描述的,它们都将注册一个
RequestMappingHandlerMapping
bean(以及一堆其他东西)。但是,没有处理程序,HandlerMapping
就没有多大用处RequestMappingHandlerMapping
需要一些@Controller
Bean,因此您也需要通过Java配置中的@Bean
方法或
如果您收到警告消息和404,并且正确配置了上述所有内容,那么您将请求发送到错误的URI,该URI未被检测到的
@RequestMapping
注释处理程序方法处理。
springwebmvc
库提供了其他内置的HandlerMapping
实现。例如,BeanNameUrlHandlerMapping
maps
从URL到名称以斜杠(/)开头的bean
你也可以自己写。显然,您必须确保发送的请求至少与注册的
HandlerMapping
对象的处理程序中的一个匹配。
如果您没有隐式或显式地注册任何
HandlerMappings
bean(或者如果DetectAllHandlerMappings
是true
),则DispatcherServlet
会注册一些缺省值。这些定义在DispatcherServlet.properties
中,与DispatcherServlet
类在同一个包中。它们是BeanNameUrlHandlerMap
和DefaultAnnotationHandlerMap
(与相似,但不建议使用)。
SpringMVC将记录通过
RequestMappingHandlerMapping
注册的处理程序。例如,@控制器
类似
@Controller
public class ExampleController {
@RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
public String example() {
return "example-view-name";
}
}
将在信息级别记录以下内容
Mapped "{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example()
这描述了注册的映射。当您看到未找到处理程序的警告时,请将消息中的URI与此处列出的映射进行比较。
@RequestMapping
中指定的所有限制必须匹配,SpringMVC才能选择处理程序。
其他实现会记录它们自己的语句,这些语句应该提示它们的映射和相应的处理程序。
类似地,在DEBUG级别启用Spring日志记录,以查看哪些bean Spring寄存器。它应该报告它找到了哪些带注释的类,它扫描了哪些包,以及它初始化了哪些bean。如果您期望的配置不存在,请查看您的
Application ationContext
配置。
DispatcherServlet
只是一个典型的JavaEEServlet
。您可以使用典型的
如何在web中实现Servlet url映射。使用xml
考虑到这一点,一个常见的错误是使用
/*
的url映射注册DispatcherServlet
,从@刚需映射
处理程序方法返回视图名称,并期望呈现JSP。例如,考虑一个处理程序方法,如
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
return "example-view-name";
}
使用
InternalResourceViewResolver
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
您可能希望将请求转发到路径
/WEB-INF/jsps/example view name处的JSP资源。jsp
。这不会发生。相反,假设上下文名称为Example
,则DisaptcherServlet
将报告
在名为“DispatcherServlet”的
DispatcherServlet
中未找到URI为[/Example/WEB-INF/jsps/Example view name.jsp]
的HTTP请求的映射
因为
DispatcherServlet
映射到/*
并且/*
匹配所有内容(除了具有更高优先级的精确匹配),所以将选择DispatcherServlet
来处理来自的
(由转发
代码>JstlViewInternalResourceViewResolver
返回)。几乎在每种情况下,都不会将DispatcherServlet
配置为处理此类请求。
相反,在这种过于简单的情况下,您应该将
DispatcherServlet
注册到/
,将其标记为默认servlet。默认servlet是请求的最后一个匹配项。这将允许您的典型servlet容器选择一个内部servlet实现,映射到*。jsp
,在尝试使用默认servlet之前处理jsp资源(例如,Tomcat拥有JspServlet
)。
这就是你在例子中看到的。
我正在编写一个部署在Tomcat上的Spring MVC应用程序。请参阅以下最小、完整和可验证的示例 我在上有一个JSP资源,我希望Spring MVC使用我的控制器来处理请求并转发到JSP,那么为什么它用404来响应呢? 这是一个关于这个警告信息的问题的规范帖子。
问题内容: 我正在编写部署在Tomcat上的Spring MVC应用程序。 Where SpringServletConfig is 最后,我在包装里 我的应用程序的上下文名称为。当我发送请求给 该应用程序以HTTP Status 404响应并记录以下内容 我希望Spring MVC 拥有一个JSP资源,以使用我的控制器来处理请求并转发给JSP,所以为什么它会响应404? 问题答案: Spring
我想配置文件中缺少一些东西,但我看不到。 当我放入浏览器-->localhost:8080/procura/notifications-->我在控制台中得到的是-->org.springframework.web.servlet.DispatcherServlet noHandlerFound警告:在名为“DispatcherServlet”的DispatcherServlet中没有找到URI[/
我在我的SpringMVC项目中得到了这个错误。我必须在浏览器中手动添加完整的路径来运行代码,但我不能直接运行它。 web.xml:
我写了一个spring boot项目。它有三个文件。 appconfig.java HelloController.java 当我尝试运行它时,它出现了错误“没有为名为'DispatcherServlet中URI[/springc1_01/]的HTTP请求找到映射”。这是因为服务器没有找到控制器还是其他原因?THX.
这是我的代码。我不知道这有什么问题。