咱们先来讲一下WebMVC框架的基本任务。在Web应用中,前台负责捕捉用户的动做、展现系统的通常界面和处理结果,后台则主要负责系统的逻辑层面的处理,前台和后台一块儿为系统和用户的交互、数据的处理服务,并最终构建出完整的Web应用。
在这个目的的基础上,咱们先来看看Java技术下的Web应用的早期是怎么处理这个问题的。html
1.servlet时期:Web请求经过前端的html页面提交到后台servlet,servlet对请求进行处理、运行相关逻辑,经过输出html语句生成展现处理结果的页面回到前端,用户和系统之间的交互创建在繁琐的Web页面的生成基础上。
2.jsp(Java Server Page)时期:Web请求经过前端的jsp页面提交到后台逻辑的servlet或者jsp处理单元(jsp页面和servlet没有本质区别,前者执行的时候是会被编译成后者的),后台处理后处理结果放入相应的http请求数据保存区,再将这个Web请求转发到某个事先写就的jsp页面,jsp页面把须要的数据写入到自身并展现出来(在服务器后台实际上还有这样自动完成的步骤:编译成临时servlet,再经过输出html语句生成展现处理结果的页面回到前端)。这样系统的后台是创建在功能不甚清晰的servlet和jsp处理单元之上的。
3.servlet+jsp时期:这是MVC思想在Web开发中的起点。servlet只被看成后台处理单元,而jsp页面只被看成前台展现和交互页面而不参与后台逻辑处理。Web请求经过jsp页面提交到后台,后台servlet则负责处理逻辑,后台处理后处理结果放入相应的http请求数据保存区,再将这个Web请求转发到某个事先写就的jsp页面,jsp页面把须要的数据写入到自身并展现出来。和jsp时期虽然看似相同,可是因为清楚划分了servlet的controller控制器做用、jsp的view视图的做用,(固然在后台还有model数据模型),使得Web开发可以结构化地进行,系统层次也更为清晰。前端
那么咱们来讲明一下究竟什么是Web的MVC架构(固然除了在Web领域,大多数的用户系统交互中都会有MVC架构的影子)。M(Model数据模型)V(View视图)C(Controller),是Web应用的开发策略和Web应用实际运行的基本模型,大致说来就是这样的过程:请求经过V发送到后端C,C接收到请求后选择适当的M进行数据处理,处理完毕后C选择合适的V进行展示。
这个模型称为JSP Model2,是MVC模型的基本原理,以下图所示:web
如上所述的基本MVC框架看起来已经知足咱们的一半需求了,那么咱们所说的使用包括像Spring MVC这样的WebMVC框架有什么好处呢?spring
在JSP Model 2 这个经典WebMVC模型里面,咱们的serlet和Web请求是一一映射的而且硬配置在Web应用的配置文件中的,所以系统的需求增长致使映射关系的增长再致使Web应用自己的体积增长,缺少通常性、易管理性和可重用性。这样的问题势必会增长系统的维护难度。
因此,使用一个集中控制器对Web请求进行分析而且选择合适的逻辑处理Controller来处理Web请求,将硬编码在配置文件中的映射关系写在这个集中Controller中,这种作法仍然会使得硬编码的问题,只不过是把硬编码转向了集中Controller中。后端
Spring MVC在Web请求和咱们所说的这个控制器Controller之间使用了一个很是关键的节点--前置控制器(Front Controller),前置控制器的做用是接收全部的Web请求并将请求派发到不一样的页面控制器(Page Controller),而页面控制器就是咱们前面所说的这种通常意义上的Controller,亦即真正进行后段页面处理逻辑的控制器。因为引入了新的映射处理器、页面渲染器等,存在于JSP Model 2的耦合和硬编码问题可以得以解决,另外加上Spring自身的IOC特性,能够将组件在容器启动的时候就注入,实现组件的初始化前置。
以下图所示为Spring MVC的模型状况:服务器
Spring MVC结合Spring自身的特性和WebMVC的模型,可以将Web应用的开发实现得更简洁轻快,使得可复用性获得更好的发展。下面是Spring MVC的几个重要角色:架构
DispatcherServlet(前置控制器):将Web请求统一发送至此,把请求发送至HandlerMapping
HandlerMapping(映射处理器):接收请求并分析请求-处理器映射关系,把请求发送到Controller
Controller(页面控制器):接收被派发的请求,真正处理业务逻辑,并将处理数据发往ViewSolver
ViewResolver(视图配发器):统一的视图配发器和具体的视图模版技术无关,按照视图配发器的配置项将数据添加到指定视图模版技术的View中
View(视图):真正展示数据的页面视图
这些角色参与整个WebMVC的流程如图所示:app
在知晓了这些角色以后咱们再来讲SpringMVC的这些角色在Web容器中的初始化过程,在这里咱们使用一个相对有通用性的例子来讲明其中很是重要的组件:框架
像全部的Spring IOC容器启动注入业务组件同样,Spring MVC框架也有一个主要的IOC容器用于加载注入组件,这个IOC容器就是顶层的ROOT WebApplicationContext,它经过默认位置在/WEB-INF路径下的applicationContext做为配置文件来进行加载,加载的契机固然在Web应用启动的时候,所以咱们须要在做为这个Web应用的总体描述文件web.xml定义一个监听器ContextLoaderListerner,监听器在Web应用启动以后加载ROOT WebApplicationContext,加载的WebApplicationContext中主要会注入DAO、Services和数据源这些业务对象。jsp
在SpringMVC架构中加入了一个为SpringWeb应用层组件打造的IOC容器,咱们不妨称之为Spring WebApplicationContext,这个IOC容器是ROOT WebApplicationContext的子容器,换言之,它是能够访问到父容器中的注入对象的,也所以,其中注入的页面控制器对象Controller能够注入父容器中已经注入的Services和DAO对象。一样的,咱们须要在web.xml中定义一个前置控制器servlet DispatcherServlet来接管全部符合定义的Web请求,并经过默认位置在/WEB-INF路径下的<servlet-name>-servlet做为配置文件来加载Spring WebApplicationContext,这个IOC容器存在的意义在于区分ROOT IOC和Spring IOC的职责须要,主要注入Controller,HandlerMapping,ViewResolver等SpringWeb层服务组件。
解释了对SpringMVC架构相当重要的两个IOC容器和加载它们的组件、IOC的注入配置文件和注入的组件类型,咱们来看看在具体的SpringMVC项目中是怎么写的。
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app...> <!--启动监听器加载ROOT WebApplicationContext--> <listener> <listener-class> org.springframework.Web.context.ContextLoaderListener </listener-class> </listener> <!--前置控制器加载Spring WebApplicationContext--> <servlet> <servlet-name> springDispcher </servlet-name> <servlet-class> org.springframework.Web.servlet.DispatcherServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name> springDispcher </servlet-name> <url-pattern> *.do </url-pattern> </servlet-mapping> </web-app>
/WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans...> <bean id="someService" class="org.myconmpany.service.SomeService"> </bean> <bean id="someDao" class="org.myconmpany.dao.SomeDao"> </bean> </beans>
/WEB-INF/springDispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans...> <bean id="handlerMapping" class="org.springframework.Web.servlet.handler.BeanNameUrlHanlerMapping"> </bean> <bean name="/someLink.do" class="org.myconmpany.controller.SomeController"> </bean> <bean id="viewResolver" class="org.springframework.Web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/*"/> <property name="suffix" value=".jsp"/> </bean> </beans>
这就是Spring MVC的基本概况,可是在精简的开发过程当中咱们更倾向于使用Spring为咱们准备的基于注解的开发,这样作能够大大减小配置文件的规模,让Spring为咱们自动完成一些机械性的工做。