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之间的区别