Java Web框架篇之SpringMVC

Java Web系列文章汇总贴: Java Web知识总结汇总


为什么要有SpringMVC

WebMVC架构及缺陷

Java Web框架篇之SpringMVC

MVC各部分实现技术

  • model:应用的业务逻辑(如:数据库的操作),通过JavaBean实现
    (hibernate、mybatis、ibatis)
  • view:视图层,用于与用户的交互,主要由jsp页面产生。
    (jsp、FreeMarker、tails、taglib、EL、Velocity )
  • controller:处理过程控制,一般是一个servlet。
    它可以分派用户的请求并选择恰当的视图以用于显示
    同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
    (servlet、struts、spring、action)

缺陷

  • 控制器(controller)
    1.控制逻辑较为复杂,而且每个模块都需要一个控制器,(可能每一个页面都需要一个控制器)
    2.请求参数到模型的封装麻烦。
    3.视图的选择严重依赖于Servlet API ,这样很能甚至不可能更换视图
    4.给视图传入模型数据 也依赖于Servlet API.如果要更换视图那么技术也要改变。
  • 模型(model)
    使用JavaBean组件,(域模型层+业务层+持久层)导致JavaBean组件类庞大。不利于开发人员管理
  • 视图(view)
    被绑定于Jsp,很难更换视图

相关:
springMVC随笔(为什么要使用SpringMVC)
为什么要用spring,springMVC?


SpringMVC概述

是什么?
是Spring构建Web应用程序的解决方案,全功能MVC模块,基于MVC思想实现。Spring MVC高度可配置,比如视图呈现可支持JSP等多种形态,当然也可以基于通过配置@RequestBody/@ResponseBody,接收/返回JSON格式的数据。模型,控制层,视图层完全解耦,各模块分离,更容易使用定制化。

怎么做?
如何工作?Spring MVC通过一个DispatcherServlet来接收用户请求,然后通过HandlerMapping获取 对象,之后通过HandlerAdapter调用真正的Handler进行业务处理,返回ModelAndView对象给DispatcherServlet,该Servlet再调用ViewResovler进行视图解析,返回Model对象。之后再把Model传递给View,获取最终的response,返回给用户。

好不好?
SpringMVC是一个教科书式的MVC构架,与Spring无缝集成,也可以与其他view框架集成,灵活性较高,以IOC为基础,便于测试。

相关:
SpringMVC框架理解
SpringMVC工作机制


SpringMVC工作原理

如何解决WebMVC缺陷

  • 从服务到工作者模式:
    服务到工作者:Front Controller + Application Controller + Page Controller + Context即,前端控制器+应用控制器+页面控制器(也有称其为动作)+上下文

  • 前端控制器
    负责为表现层提供统一访问点,从而避免WebMVC中出现的重复的控制逻辑,可以为多个请求提供共用的逻辑(如准备上下文等等),
    将选择具体视图和具体的功能处理分离。

  • 应用控制器
    前端控制器分离选择具体视图和具体的功能处理之后,需要有人来管理,应用控制器就是用来选择具体视图技术(视图的管理)和具体的功能处理(页面控制器/命令对象/动作管理),一种策略设计模式的应用,可以很容易的切换视图/页面控制器,相互不产生影响

  • 页面控制器/动作/处理器:
    功能处理代码,收集参数、封装参数到模型,转调业务对象处理模型,返回逻辑视图名交给前端控制器(和具体的视图技术解耦),由前端控制器委托给应用控制器选择具体的视图来展示,可以是命令设计模式的实现。页面控制器也被称为处理器或动作。

  • 上下文
    WebMVC中为视图准备要展示的模型数据,我们直接放在request中(Servlet API相关),有了上下文之后,我们就可以将相关数据放置在上下文,从而与协议无关(如Servlet API)的访问/设置模型数据,一般通过ThreadLocal模式实现。

SpringMVC流程

SpringMVC对servlet进行封装,比如请求参数的映射。文件的上传,支持各种视图解析器,servlet只有doGet和doPost,一个servlet类只能处理一个url-pattern,SpringMVC类里面可以通过RequestMapping处理很多请求,并且支持Rest风格的请求,如DELETE/PUT等,SpringMVC参数的映射可以直接封装成实体类

Java Web框架篇之SpringMVC

(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。


过滤器与拦截器的区别

  • (1)、Filter需要在web.xml中配置,依赖于Servlet;
  • (2)、Interceptor需要在SpringMVC中配置,依赖于框架;
  • (3)、Filter的执行顺序在Interceptor之前,具体的流程见下图;
    Java Web框架篇之SpringMVC
  • (4)、触发时机不同, 过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前
    Java Web框架篇之SpringMVC
  • (5)、两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

相关:
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
过滤器(Filter)与拦截器(Interceptor )区别
拦截器和过滤器的区别


SpringMVC知识点

SpringMVC常见问答总结(超详细回答)