MVC重点回顾

MVC是Spring框架的核心组成部分之一,负责实现Web应用程序的模型视图控制器模式。Spring框架提供了丰富的组件和工具,而MVC负责处理Web应用程序中的核心过程,例如请求处理、数据转换、模板渲染和视图管理等。MVC和Spring的结合,为Web应用程序提供了强大而且可靠的性能和灵活性。

实现MVC的方式

我们利用Servlet机制,用一个单一的Servlet拦截所有请求,由它来分派任务,这样实现了原始的MVC结构。然后,我们把MVC和IoC结合在一起,在Servlet容器启动的时候,给上下文环境里注入IoC容器,使得在Servlet里可以访问到IoC容器里的Bean。

07|原始MVC:如何通过单一的Servlet拦截请求分派任务?

思考题

我们在MVC中也使用了Bean这个概念,它跟我们以前章节中的Bean是什么关系?

参考答案

MVC中的Bean通常指代模型对象,而IoC中的Bean指代由IoC容器管理的对象。尽管MVC和IoC都使用了“Bean”这个概念,但它们的含义及在系统中的作用是不同的。

08|整合IoC和MVC:如何在Web环境中启动IoC容器?

思考题

我们看到从Dispatcher里可以访问WebApplicationContext里管理的Bean,那通过WebApplicationContext可以访问Dispatcher内管理的Bean吗?

参考答案

不可以。Servlet容器启动时,先启动Listener,在Listener的初始化过程中创建IoC容器,放到ServletContext里,这就是WAC。这之后再初始化的Servlet。所以Dispatcher可以访问到WAC,但是WAC访问不到DispatcherServlet。

09|分解Dispatcher:如何把专门的事情交给专门的部件去做?

思考题

目前,我们只支持了GET方法,你能不能尝试自己增加POST方法。想一想,需要改变现有的程序结构吗?

参考答案

增加POST方法支持不需要改变现有程序结构。因为我们的DispatcherServlet现在统一用service()方法处理所有请求,之后调用doDispatch()方法,最后通过this.handlerMapping.getHandler()找到需要调用的方法。

10|数据绑定:如何自动转换传入的参数?

思考题

我们现在的实现是把request里面的参数值,按照内部的次序隐含地自动转成后台调用方法参数对象中的某个属性值,那么可不可以使用一个手段,让程序员手动指定某个调用方法的参数跟哪个request参数进行绑定呢?

参考答案

参数绑定的处理,是在RequestMappingHandlerAdapter的invokeHandlerMethod()方法中处理的,它拿到调用方法的所有参数,一个参数一个参数进行绑定。所以我们在这里可以考虑给参数增加一个注解@RequestParam。对于带有这个注解的参数,就不是隐含地按照参数名去匹配,而是按照指定的名字去request中匹配。

11|ModelAndView:如何将处理结果返回到前端?

思考题

现在返回的数据只支持Date、Number和String三种类型,如何扩展到更多的数据类型?现在也只支持JSP,如何扩展到别的前端?

参考答案

返回数据的格式处理是通过ObjectMapper来实现的。我们有一个默认实现DefaultObjectMapper,只要在它的writeValuesAsString()里判断数据类型的时候,增加别的类型就可以了。对于JSP之外的View,我们现在的结构是可扩展的。只要自己另外实现一个View和一个View resolver即可。