在 Web 系统开发中一般按照视图( View )、模型( Model )、控制( Controller )三层设计模式进行构建,视图层负责模型数据的渲染,将数据用一定的形式展现给用户;模型层负责监听实体的变化并对实体进行解析和封装;控制层负责提供前后端交互的请求逻辑处理入口,处理用户请求,并建立适当的模型传递给视图进行渲染。层级关系一般如下图所示:
后来出现了一个新的 MVC 框架 Struts2,它将 action 作为框架的控制器负责用户请求响应,同时为前端页面提供了标签库和有力的渲染工具-OGNL,用户请求 action 返回数据到 JSP 后,在 JSP 中可以采用 OGNL 表达式对数据进行动态的渲染,它还增加了请求过滤器以及进行请求前后处理的拦截器,方便系统过滤、拦截一些不符合规则的请求并做出及时的响应操作,不得不说它的出现降低了系统的耦合性,让 MVC 模式的分层更加明显,也大大的简化了开发者的代码量。
由于 Struts2 框架带来的便利,它和 Spring 在过去很长一段时间被结合在一起用来构建系统,但是随着技术的发展,二者的结合出现了很多问题例如类臃肿、兼容性以及 Struts2 漏洞等问题,而就在这时候,Spring 家族诞生了一个新的 MVC 框架来与 Spring 实现无缝结合,它就是 SpringMVC。
SpringMVC 是采用 Java 开发,一种基于 Web MVC 设计模式,以请求驱动为类型的轻量级 Web 框架。由于使用了 MVC 架构模式的思想,将 Web 层进行了职责解耦,让分层更加的明显。
谈到 SpringMVC 的优势,首先想到的就是它依赖 Spring 的包才能运行,也就是说它其实是 Spring 的一个 MVC 子框架,这样的话就可以跟 Spring 实现无缝的结合,从而继承它的众多特性,这一点比起 Struct2 框架就有了很大的先天优势,另外还有其他的几个优点如下:
1、实现方法级别的请求拦截 上面提及的 Struts2 采用的是类级别的请求拦截,即一个类对应一个请求上下文,而 SpringMVC 采用方法级别的拦截,一个方法对应一个请求 URL,也就是一个请求上下文。所以从架构本身上 SpringMVC 容易实现 Restful 接口,而 Struts2 的架构实现起来要麻烦很多,因为 Struts2 action 的一个方法可以对应一个 URL,但是它的类属性却被所有的方法共享,这也就无法用注解或其他方式标识其所属的方法了。
2、SpringMVC 提供强大的注解 SpringMVC 引入了注解的功能,通过在类、方法上标记相应的注解,可以实现实体的映射、配置的加载等,使用起来非常便利,可以大大简化配置和代码量,比如说同样是接收请求,Servlet 作为控制器需要在 doPost 或者 doGet 中做一些处理后才能调用业务代码,而 SpringMVC 通过几个注解就可以实现,例如 @Controller 可以帮助定义当前类为一个 Spring 管理的 bean,同时指定该类是一个控制器,可以用来接受请求,标识当前类是控制层的一个具体的实现;@requestMapping 放在方法上面用来指定某个方法的路径,当它放在类上的时候相当于命名空间需要组合方法上的 requestMapping 来访问。
3、清晰的角色划分 控制器(Controller)、验证器(Validator)、命令对象(Command-obect)、表单对象(form-object)、模型对象(model-object)、Servlet 分发器(DispatcherServlet)、处理器映射(handler-mapping)、视图解析器(view-resolver)等等。每一个角色都可以由一个专门的对象来实现。
1.首先用户在前台页面向某一个后台指定的 URL 发起了请求,SpringMVC 收到这个请求后会首先交给中央控制器(DispatcherServlet)
2.中央控制器请求 HandlerMapping 查找 Handler 处理器 (可以根据 xml 配置、注解进行查找)
3.处理器映射器 HandlerMapping 向中央控制器返回 Handler,HandlerMapping 会把请求映射为 HandlerExecutionChain 对象(包含一个 Handler 处理器(页面控制器)对象,多个 HandlerInterceptor 拦截器对象),通过这种策略模式,很容易添加新的映射策略
4.中央控制器调用处理器适配器去执行 Handler
5.处理器适配器 HandlerAdapter 将会根据适配的结果去执行 Handler
6.Handler 执行完成给适配器返回 ModelAndView
7.处理器适配器向中央控制器返回 ModelAndView ( ModelAndView 其实是 SpringMVC 框架的一个底层对象,包括模型 Model 和视图 View )
8.中央控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
9.视图解析器向中央控制器返回 View
10.中央控制器进行视图渲染 (视图渲染将模型数据(在 ModelAndView 对象中)填充到 request 域)
11.前端控制器向用户响应结果
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.