
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
SpringMVC简介
Web开发是Java的一个很常见的应用场景,在企业级开发中基于Web的应用程序也是大多数Java开发者主要的关注点。我们都知道在Web开发中,状态管理、工作流以及数据验证都是需要解决的重要特性。而HTTP协议的无状态性决定了这些问题都不太好解决,而Spring的Web框架就是为了解决这些关注点而设计的。
在介绍SpringMVC之前我们先来简单提一下MVC模式,MVC是很经典的一个架构模式,早在桌面时代就已经存在了,使用MVC模式我们能够开发出来一个松耦合的应用,让应用分为模型 - 控制器 - 视图。想必各位都对MVC很熟悉了,也都知道MVC有两种模式,分别为MVC1和MVC2,如下:

MVC1通常用于桌面程序,MVC2则多用于Web程序,而SpringMVC则是基于MVC2模式实现的。Spring MVC属Spring FrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC能帮我们构建像Spring框架那样灵活、松耦合基于MVC模式的Web应用程序。
不过MVC框架不止SpringMVC一种,例如Struts就是老牌的MVC框架,目前Struts2结合了Webwork,也是非常优秀的MVC框架,优点非常多比如良好的结构,拦截器的思想,丰富的功能。但缺点是Struts2由于采用了值栈、OGNL表达式、Struts2标签库等等,会导致应用的性能下降,启动个服务器都要半天。Struts2的多层拦截器、多实例Action性能都很好。但正是因为拦截器太多,使得Struts2变得更加复杂,让人使用起来感觉很重不够轻量。
而SpringMVC是一个典型的教科书式的MVC构架,不像Struts等都是变种或者不是完全基于MVC系统的框架,对于初学者或者想了解MVC的人来说我觉得 SpringMVC 是最好的。第二它Ttapestry一样是一个纯正的Servlet系统,这也是它和Tapestry相比 Struts所具有的优势。而且框架本身有代码,看起来容易理解,使用简单,学习成本低,学习难度要小于Struts2。所以使得SpringMVC成为现在最主流的MVC框架。 简单介绍完SpringMVC后,我们来看看请求是如何从客户端发起,经过SpringMVC中的组件,最终再返回到客户端的。
跟踪SpringMVC的请求:
每当用户在web页面中,点击链接或者点击提交表单的按钮时,就会有请求发送到服务器 ,请求会将用户输入的数据带到服务端。当服务端使用了SpringMVC时,请求一般会经历如下几个站点:

请求经历的第一站是DispatcherServlet,使用了SpringMVC后,所有的请求都会通过这个作为前端控制器(front controller)的Servlet,这一点与大多数基于Java的Web框架一样。DispatcherServlet就是SpringMVC中的前端控制器,DispatcherServlet本质上也是一个Servlet,所以它是单例的。
DispatcherServlet的任务是将请求发送给SpringMVC控制器,控制器是一个用于处理请求的Spring组件。在典型的应用程序中可能会有多个控制器,所以DispatcherServlet需要知道应该将请求发送给哪个控制器,它就会去查询一个或多个处理器映射来确定请求的下一站在哪里,也就是要将请求发送给哪个控制器,而处理器映射会根据请求所携带的URL信息来进行决策发送到哪个控制器。
一旦选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器。请求到了控制器后,会卸下用户提交的数据。而控制器会把这些数据交给服务对象进行处理,如果该控制器设计得良好的话。
控制器在完成逻辑处理后,通常会产生一些信息,这些信息需要返回给用户并在浏览器页面上显示出来。这些信息被称为模型,不过我们不能直接返回这些原始数据,这些数据需要以用户友好的方式返回,例如渲染成html格式进行返回。所以,这些数据还需要发送给视图,通常会是JSP。
控制器所做的最后一件事就是将模型数据打包,并且标示出用于渲染输出的视图名。它接下来会将请求连同模型和视图名称发送回DispatcherServlet。
这样控制器不会与特定的视图相耦合,因为传递给DispatcherServlet的视图名并不直接表示某个特定的JSP。实际上,它甚至不能确定视图就是JSP。它仅仅传递了一个名称,这个名称将会用来查找产生结果的真正视图,所以DispatcherServlet将会使用视图解析器来将逻辑视图名称匹配为一个特定的视图实现。
既然DispatcherServlet已经知道由哪个视图来渲染结果数据,那请求的任务基本上也就完成了。它的最后一站是视图的实现,在这里它交付模型数据。请求的任务就完成了。视图渲染模型数据并进行输出,这个输出会通过响应对象传递给客户端。
可以看到,请求要经过很多步骤,最终才能形成返回客户端的响应。大多数的步骤都是在SpringMVC框架内部完成的。





