工作中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会加载对应实验中的配置文件.

一、SimpleUrlHandlerMapping
bean 配置

  1. 1<?xml version="1.0" encoding="UTF-8"?>
    2<beans xmlns="http://www.springframework.org/schema/beans"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5 <bean id="simpleController" class="com.seven.springmvc.controller.SimUrlController"></bean>
    6 <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    7 <property name="mappings">
    8 <props>
    9 <prop key="/simple">simpleController</prop>
    10 </props>
    11 </property>
    12 </bean>
    13</beans>

Controller 代码

  1. 1public class SimUrlController implements Controller {
    2 @Override
    3 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    4 PrintWriter writer = response.getWriter();
    5 writer.print("hi simple");
    6 return null;
    7 }
    8}

运行结果

  1. 1请求:http://localhost:8080/simple
    2输出 hi simple

二、BeanNameUrlHandlerMapping
bean 配置

  1. 1<?xml version="1.0" encoding="UTF-8"?>
    2<beans xmlns="http://www.springframework.org/schema/beans"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5 <bean id="/beanNameController" class="com.seven.springmvc.controller.BeanNameController"/>
    6 <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    7</beans>

Controller 代码

  1. 1public class BeanNameController implements Controller {
    2 @Override
    3 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    4 PrintWriter writer = response.getWriter();
    5 writer.print("hi beanName");
    6 return null;
    7 }
    8}

运行结果

  1. 1请求:http://localhost:8080/beanNameController
    2输出:hi beanName

三、RequestMappingHandlerMapping
bean 配置

  1. 1<?xml version="1.0" encoding="UTF-8"?>
    2<beans xmlns="http://www.springframework.org/schema/beans"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5 <bean id="controller" class="com.seven.springmvc.controller.RequestMappingController"/>
    6 <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    7</beans>

Controller 代码

  1. 1@Controller
    2public class RequestMappingController {
    3 @RequestMapping("/index")
    4 @ResponseBody
    5 public String index(){
    6 return "hi requestMapping";
    7 }
    8}

运行结果

  1. 1请求:http://localhost:8080/requestMapping
    2输出:hi requestMapping

结论

  1. SimpleUrlHandlerMapping 是根据其mappings属性中配置的key-value来定义映射关系的,根据请求path【作为映射关系中的key】,找到对应的Controller【此时只要找到Controller就可以了,不用到具体方法,因为自定义的Controller必须继承Controller接口,并实现handleRequest方法,最后也是执行handleRequest方法】
  2. BeanNameUrlHandlerMapping 是根据spring容器中配置的bean名称【注意bean的名称需要以'/'开头】和Controller来定义映射关系的, 根据请求路径path去查找beanName和path一致的bean【其中bean必须继承Controller并实现handleRequest方法】,然后调用handleRequest来处理请求
  3. RequestMappingHandlerMapping 是依赖注解RequestMapping来实现path和Hander的映射关系的,具体是根据注解中的value值作为key,注解所在方法作为Handler设置映射关系,然后请求到达时则根据请求path去查找对应的Handler【具体Controller中的Method】

因为我们项目开发中大多使用注解【RequestMapping】的方式实现路由的映射,也就是用RequestMappingHandlerMapping来实现的,关于RequestMappingHandlerMapping的具体初始化和查询的功能是如何根据注解来完成路由的映射的,我们将在下一篇单独讲解…………………

微信公众号:宋坤明
如果您觉得对您有所帮助,记得转发点赞哦
如有问题或建议,请公众号留言或者直接微信联系我
下面的是我的公众号二维码图片,欢迎关注我

图注:宋坤明公众号

springmvc 路由的更多相关文章

  1. Netty URL路由方案探讨

    最近在用Netty做开发,需要提供一个http web server,供调用方调用.采用Netty本身提供的HttpServerCodec handler进行Http协议的解析,但是需要自己提供路由. ...

  2. Jeecg踩坑不完全指南

    公司用了这个叫做jeecg的快速开发框架,我不知道有多少公司在用这个框架,园子里有的可以吱一声.个人觉得这框架唯一优势就是可以让不会ssh的人也能进行开发,只要你会J2SE,有web后台发开经验即可. ...

  3. 那些让你代码思维和能力有较大的提升Java源码(转)

    对于学习J2EE的框架有很大的帮助,代码里使用了各种设计模式.事件机制.Java8语法.代码量也很小,web服务使用Netty作为支持,对HTTP/网络想研究的一定是你的必读品.目前在写 Blade- ...

  4. JavaEE开发之SpringMVC中的路由配置及参数传递详解

    在之前我们使用Swift的Perfect框架来开发服务端程序时,聊到了Perfect中的路由配置.而在SpringMVC中的路由配置与其也是大同小异的.说到路由,其实就是将URL映射到Java的具体类 ...

  5. SpringMVC 解析(四)编程式路由

    多数情况下,我们在使用Spring的Controller时,会使用@RequestMapping的形式把请求按照URL路由到指定方法上.Spring还提供了一种编程的方式去实现请求和路由方法之间的路由 ...

  6. SpringMVC,3种不同的URL路由配置方法

    1. 先说说一种比较常见的: <servlet> <servlet-name>theDispatcher</servlet-name> <servlet-cl ...

  7. SpringMVC,3种不同的URL路由配置方法(这根本不是一个小问题)

    转载自:http://blog.csdn.net/fansunion/article/details/41149287?utm_source=tuicool&utm_medium=referr ...

  8. SpringMVC,3种不同的URL路由配置方法 [转]

    SpringMVC中配置URL拦截,非常简单.网上找个示例,就能通过.但是,在我做了好几个Web项目,又参与了别人主导的Web项目时,发现URL配置也非常有学问. 1. 先说说一种比较常见的: < ...

  9. SpringMVC 用http请求的Get和Post请求作为路由的方法的重载方式

    @Controller @RequestMapping("/messageProcessing") public class WechatPushController { @Aut ...

随机推荐

  1. Python-逻辑运算

    1 or 3>2 and 4<5 or 6 and 2<7

  2. (杭电 2045)不容易系列之(3)—— LELE的RPG难题

    不容易系列之(3)-- LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...

  3. 虚拟机内安装Centos7步骤

    下面就来看看怎么安装centos7,首先就是要准备一个虚拟机了 简称VM,当然虚拟机的安装步骤,我也不再多说,我用的Workstation 15 Pro的版本,我们直接打开虚拟机,打开界面如下: 在安 ...

  4. go 网络请求篇

    ---恢复内容开始--- 今天特意找了下go的网络请求篇,get请求是ok的,post请求一直不下来,搜索了下,代码都差不多,无法拿到post数据,先整理一篇,亲测可用. 针对post ,先来说下po ...

  5. python2.7入门---2.x与3​​.x版本区别

        Python的3​​.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向 ...

  6. 20155231 2016-2017-2 《Java程序设计》第1周学习总结

    20155231 2016-2017-2 <Java程序设计>第1周学习总结 考核方式学习 课前准备 教材学习内容总结 第一章 Java平台概论 了解java 通过学习了解到,java设计 ...

  7. 20155235 2017-2018-1 《Java程序设计》第2周学习总结

    20155235 2017-2018-1 <Java程序设计>第2周学习总结 教材学习内容总结 3.1类型.变量与运算符 类型 基本类型 类类型 变量 基本规则 不可以用数字作为开头,不可 ...

  8. 20155323 2016-2017-2《Java程序设计》课程总结

    20155323 2016-2017-2<Java程序设计>课程总结 课程与实验链接 预备作业一:新学期,新展望 预备作业二:游戏经验 预备作业三:安装虚拟机和Linux系统的学习 201 ...

  9. 20155330 实验四 Android程序设计

    20155330 实验四 Android程序设计 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...

  10. DE1-SOC开发板使用学习

    1. Yocto build utility 工具是什么?Linux Console with framebuffer是什么? 2. 文档里面有几个Linux发布版本的,分别是ubuntu和LXDE版 ...