Spring MVC RequestMapping

我正处于学习使用Spring MVC的早期阶段。 我已经创建了一个控制器并对其应用了RequestMapping注释。 当我运行项目时,索引页面在index.htm按预期显示,但是当我导航到应该指向我的控制器的URI时,我得到404错误,即使控制器似乎已被Spring检测到开始。 请帮助我理解我在这里没有掌握的内容:

这是我的web.xml:

    contextConfigLocation /WEB-INF/applicationContext.xml   org.springframework.web.context.ContextLoaderListener   dispatcher org.springframework.web.servlet.DispatcherServlet 2   dispatcher /    30    redirect.jsp  

这是我的applicationContext.xml:

     

这是我的dispatcher-servlet.xml:

        indexController      

最后,这是我的控制器。

 @Controller @RequestMapping(value = "/hello") public class Ctrl { @RequestMapping(method = RequestMethod.GET) @ResponseBody public String hello(){ return "hello!"; } } 

编辑:这是我的浏览器显示的内容: 在此处输入图像描述

您的调度程序servlet似乎没有被正确引用。

更换:

  dispatcher org.springframework.web.servlet.DispatcherServlet 2  

附:

  dispatcher org.springframework.web.servlet.DispatcherServlet  contextConfigLocation [insert the path to your dispatcher-servlet here]  1  

然后移动:

   

从applicationContext到dispatcher-servlet

在对gravityplanx’回答的评论中,我错了一半。

当您在servlet配置中指定时,Spring会注册一个RequestMappingHandlerMapping bean,用于收集和映射所有@Controller处理程序方法,即。 那些用@RequestMapping注释的。

它通过查看当前上下文中的所有bean来完成此操作。 请记住,当您使用DispatcherServlet加载上下文时,将其称为servlet上下文,如果ContextLoaderListener加载了上下文,则将其称为根上下文,将根上下文设置为servlet上下文的父级默认情况下RequestMappingHandlerMapping bean不查看根上下文,它是servlet上下文的父级。

在您的情况下, @Controller bean在根上下文(您的applicationContext.xml)中隐式声明,因为扫描使用@Component或其任何特殊化注释的@Component (例如@Controller )并为他们创造豆子。 因此,这些bean在根上下文中注册, RequestMappingHandlerMapping无法找到它们。

相反,如果在servlet上下文中声明 ,则在servlet上下文中创建@Controller (和其他)bean,它们可用于RequestMappingHandlerMapping ,然后可以注册它们来处理请求。

请注意, 本身对MVC堆栈没有任何作用。 它需要进一步配置,如 。 您应该在servlet上下文中指定包含servlet特定bean的包,并在根上下文中指定应用程序范围的bean。

这是一些文献:

  • Spring MVC中ApplicationContext和WebApplicationContext有什么区别?
  • Spring Framework中applicationContext.xml和spring-servlet.xml之间的区别