MVC是项目中较常使用的web框架,作为开发人员,习惯了编写Controller作为项目开始,写好了Controller和对应的方法,加上@RequestMapping注解,我们也就认为一切已经准备就绪,可以开始运行了,那是否我们曾想过MVC是如何根据请求路径找到对应的Controller和Controller中具体的Method呢?
HandlerMapping
1.SimpleUrlHandlerMapping
2.BeanNameUrlHandlerMapping
3.RequestMappingHandlerMapping
HandlerMapping就是处理请求path和具体handler映射关系的组件,我们将从最基础SimpleUrlHandlerMapping到目前MVC中默认优先使用使用的RequestMappingHandlerMapping来进行讲解,首先应该在web.xml中配置DispatcherServlet这个基础的servlet,每次DispatcherServlet会加载对应配置文件。
1.SimpleUrlHandlerMapping
bean 配置
simpleController
Controller代码实现mvc.Controller接口
public class SimUrlController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
PrintWriter writer = response.getWriter();
writer.print("test simple");
return null;
}
}
运行结果
请求:http://localhost:8080/simple
浏览器输打印输出 test simple
2.BeanNameUrlHandlerMapping
bean 配置(/beanNameUrlController必须要带"/")
Controllerd代码实现mvc.Controller接口
public class BeanNameUrlController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
PrintWriter writer = response.getWriter();
writer.print("test beanNameUrl");
return null;
}
}
运行结果
请求:http://localhost:8080/beanNameUrlController
浏览器输打印输出 test test beanNameUrl
3.RequestMappingHandlerMapping
bean 配置
Controller 代码,不需要像上面一样实现Controller接口,这里使用@Controller注解声明这是一个Controller,然后在sprinng.xml配置文件中将这个类注册成bean。
@Controller
public class RequestMappingController {
@RequestMapping(value = "/login")
@ResponseBody
public String login(){
return "test requestMapping";
}
}
运行结果
请求:http://localhost:8080/login
浏览器打印输出输出:test requestMapping
注意:一般现在我们将一些Controller类,Service类注册成bean,我们使用的是包扫描的方式,如下面注释的 总结: