一、SpringMVC做了什么?
1.使用SpringMVC(以及同类型框架)前:
回顾下,我们刚学完JavaWeb时是如何实现前后台数据交互的。首先,Java文件目录分为Servlet(接受参数、转发请求等)、Service(处理业务逻辑)、Dao(对各model的增删改查)、Model(对应数据库中的表)等层,而Servlet是通过在web.xml中配置从而让计算机知道要跳转的位置,具体的图如下所示。
图1.1 Servlet层展示
图1.2 web.xml中配置展示
如上面两张图所示,这是在使用SpringMVC前的情况,可以看到,随着业务的增多Servlet将会不断增加,web.xml里的内容也会增加,即使编码工整规范,Servlet都需要重写doGet、doPost方法,代码冗余。
2.使用SpringMVC后:
图1.3 使用SpringMVC后Controller类展示
如图1.3所示,使用SpringMVC后不再需要配置Servlet,所有的Servlet按照所属POJO类(或模块)划分,对一个POJO的增删改查都可放在一起。从开发者的眼光来看,使用SpringMVC大大简化了我们的开发工作,同时以Spring的角度来看,它必然帮我们做了一些工作,比如它是如何让计算机根据请求的URL就找到对应的Servlet的,接下来将具体分析。
二、SpringMVC的设计与实现
1.基本概念
图2.1 MVC模式
关于MVC以及JavaWeb等概念这里不做过多讲解,主要想谈的是DispatcherServlet和HandlerMapping。
DispatchServlet作为一个Servlet,需要在web.xml中进行配置。同时它也是一个前端控制器,所有的Web请求都需要通过它进行转发、匹配、数据处理后交给页面进行展示,因此它可看做SpringMVC实现中最核心的部分。默认情况下,DispatchServlet选取BeanNameUrlHandlerMapping作为映射策略实现。
图2.2 前端控制器
之前提到,SpringMVC帮开发者完成了许多工作,其中让计算机知道URL请求对应哪一个Controller(在不适用框架时我们称之为Servlet,使用后用Controller代替)的工作,就是HandlerMapping完成的。以SimpleUrlHandlerMapping为例,其定义了一个map来维持Url请求与控制器的映射关系,同时,HandlerMapping接口中定义了getHandler方法,通过这个方法,可以获得请求对应的HandlerExecutionChain,在HandlerExecutionChain中封装了具体的Controller对象。
图2.2 DispatcherServlet的大致工作
图2.3 HandlerMapping的设计原理
2.实现步骤
A.建立Controller控制器和HTTP请求之间的映射关系
B.得到HandlerExecutionChain,Controller响应动作,生成需要的ModelAndView
C.呈现视图