我正在编写一个部署在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[] { "/*" };
}
}
@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;
}
}
@Controller
public class ExampleController {
@RequestMapping(path = "/home", method = RequestMethod.GET)
public String example() {
return "index";
}
}
http://localhost:8080/Example/home
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资源,我希望Spring MVC使用我的控制器来处理请求并转发到JSP,那么为什么它用404来响应呢?
这是一个关于这个警告信息的问题的规范帖子。
您的标准Spring MVC应用程序将通过在Servlet容器中注册的DispatcherServlet
来服务所有请求。
DispatcherServlet
查看它的ApplicationContext
以及(如果可用的话)注册在ContextLoaderListener
中的ApplicationContext
用于设置请求服务逻辑所需的特殊bean。这些bean在文档中进行了描述。
最重要的是handlermapping
类型的bean映射
DispatcherServlet
查找此类型的所有bean并按某种顺序(可以自定义)注册它们。在为请求提供服务时,DispatcherServlet
循环访问这些HandlerMapping
对象,并使用GetHandler
测试每个对象,以找到能够处理传入请求的对象,表示为标准的HttpServletRequest
。从4.3.x开始,如果找不到,它会记录您看到的警告
在名称为SomeName的DispatcherServlet
中,未找到URI为[/some/path]
的HTTP请求的映射
或者抛出noHandlerFoundException
或者立即提交带有404未找到状态代码的响应。
最常见的HandlerMapping
实现是RequestMappingHandlerMapping
,它处理将@Controller
bean注册为处理程序(实际上是它们的@RequestMapping
注释方法)。您可以自己声明这种类型的bean(@bean
或
或其他机制),也可以使用内置选项。这些建议是:
@enablewebmvc
注释@configuration
类。
成员。正如上面的链接所描述的,这两个都将注册一个RequestMappingHandlerMapping
bean(以及一堆其他东西)。但是,如果没有处理程序,handlermapping
就不是很有用。RequestMappingHandlerMapping
需要一些@controll
bean,所以您也需要声明这些bean,可以通过Java配置中的@bean
方法,或者XML配置中的
声明,或者通过组件扫描其中的@controll
注释类。确保这些豆子在场。
如果您收到警告消息和404并且正确配置了上述所有内容,那么您将请求发送到错误的URI,该URI未被检测到的@requestmapping
带注释的处理程序方法处理。
spring-webmvc
库提供了其他内置的handlermapping
实现。例如,BeannaMeurlHandlerMapping
映射
从URL到名称以斜杠(“/”)开头的bean
@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
中指定的所有限制都必须匹配,才能使Spring MVC选择处理程序。
其他handlermapping
实现记录它们自己的语句,这些语句应该提示它们的映射和相应的处理程序。
@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;
}
在名称为“dispatcher”的dispatcherServlet
中未找到URI为[/example/web-inf/jsps/example-view-name.jsp]
的HTTP请求的映射
因为DispatcherServlet
映射到/*
并且/*
匹配所有内容(除了具有更高优先级的精确匹配),所以将选择DispatcherServlet
来处理来自JSTLView
(由InternalResourceViewResolver
返回)的Forward
。几乎在每一种情况下,DispatcherServlet
都不会被配置为处理这样的请求。
相反,在这种简单的情况下,您应该将DispatcherServlet
注册到/
,将其标记为默认servlet。默认servlet是请求的最后一个匹配项。这将允许您的典型servlet容器在尝试使用默认servlet之前选择映射到*.JSP
的内部servlet实现来处理JSP资源(例如,Tomcat有jspservlet
)。
这就是你在你的例子中看到的。
我正在编写一个部署在Tomcat上的Spring MVC应用程序。请参阅以下最小、完整且可验证的示例 其中是 最后,我在包 我的应用程序的上下文名称是。当我向 应用程序以HTTP状态404响应,并记录以下内容 我在我希望SpringMVC使用我的控制器来处理请求并转发给jsp,那么为什么它会用404来响应呢? 这是一个关于这个警告信息的问题的规范帖子。
问题内容: 我正在编写部署在Tomcat上的Spring MVC应用程序。 Where SpringServletConfig is 最后,我在包装里 我的应用程序的上下文名称为。当我发送请求给 该应用程序以HTTP Status 404响应并记录以下内容 我希望Spring MVC 拥有一个JSP资源,以使用我的控制器来处理请求并转发给JSP,所以为什么它会响应404? 问题答案: Spring
我在我的SpringMVC项目中得到了这个错误。我必须在浏览器中手动添加完整的路径来运行代码,但我不能直接运行它。 web.xml:
我的web.xml applicationContext as 调度器servlet作为 与包com中相同的控制器。思维边缘。特斯塔普 当我点击. 警告:在带名称的DispatcherServlet中找不到与URI[/TestApp/samp]的HTTP请求的映射 此外,当Spring开始时,我没有看到Testapp/示例加载的处理程序 我猜我的组件扫描不起作用。为什么?还有其他原因吗 编辑:调度
这是我的代码。我不知道这有什么问题。
我想配置文件中缺少一些东西,但我看不到。 当我放入浏览器-->localhost:8080/procura/notifications-->我在控制台中得到的是-->org.springframework.web.servlet.DispatcherServlet noHandlerFound警告:在名为“DispatcherServlet”的DispatcherServlet中没有找到URI[/