SpringMVC框架特点
清晰地角色划分。
灵活的配置功能。
提供了大量的控制器接口和实现类。
真正做到与View层的实现无关(JSP、Velocity、Xslt等)。
国际化支持。
面向接口编程。
Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起。
MVC设计模式
模型(Model)-对应组件:JavaBean。
视图(View)-对应组件:JSP或者HTML文件。
控制器(Controller)-对应组件:Servlet。
MVC处理过程:
MVC 优点:
多视图共享一个模型,大大提高代码的可重用性。
MVC三个模块相互独立,松耦合架构。
控制器提高了应用程序的灵活性和可配置性。
有利于软件工程化管理。
MVC 缺点:
原理复杂。
增加了系统结构和实现的复杂性。
视图对模型数据的低效率访问。
完美的系统架构 = 松耦合+高重用性+高扩展性
Spring MVC架构
SpringMVC体系结构
SpringMVC请求处理流程
具体步骤:
(1)首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的 1、2 步骤;
(2)页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);图中的 3、4、5 步骤;
(3)前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤 6、7;
(4)前端控制器再次收回控制权,将响应返回给用户,图中的步骤 8;至此整个结束。
3.5.2 SpringMVC体系结构
DispatcherServlet(前端控制器):Spring MVC最核心的类,在web.xml中配置。
Handler(处理器):对应MVC中C(Controller层),处理实际请求。标注了@RequestMapping的所有方法都可以看作是一个Handler。
ModelAndView:逻辑视图名、模型对象。
具体步骤:
第一步:发起请求到前端控制器(DispatcherServlet)。
第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)。
第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略。
第四步:前端控制器调用处理器适配器去执行Handler。
第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler。
第六步:Handler执行完成给适配器返回ModelAndView。
第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)。
第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可。
第九步:视图解析器向前端控制器返回View。
第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)。
第十一步:前端控制器向用户响应结果。
下面我们对出现的一些组件进行详细的介绍:
(1) 前端控制器DispatcherServlet(不需要程序员开发)。
作用:接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
(2) 处理器映射器HandlerMapping(不需要程序员开发)。
作用:根据请求的url查找Handler。
(3) 处理器适配器HandlerAdapter(不需要程序员开发)。
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
(4) 处理器Handler(需要程序员开发)。
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。
(5) 视图解析器ViewResolver(不需要程序员开发)。
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
(6) 视图View(需要程序员开发jsp)。
注意:View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
可以总结出:需要我们开发的工作只有处理器 Handler 的编写以及视图,比如JSP页面的编写。可能你还对诸如前端控制器、处理器映射器等等名词不太理解,那么接下来我们对其进行详细的介绍。
SpringMVC拦截器
拦截器与过滤器的区别
(1)过滤器Filter:
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。
(2)拦截器Interceptor:
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。