整合 SSM 框架必备基础—SpringMVC(上)

2019-07-25 23:14:40 +08:00
 JavaShare

01 MVC 概述

在 Web 系统开发中一般按照视图( View )、模型( Model )、控制( Controller )三层设计模式进行构建,视图层负责模型数据的渲染,将数据用一定的形式展现给用户;模型层负责监听实体的变化并对实体进行解析和封装;控制层负责提供前后端交互的请求逻辑处理入口,处理用户请求,并建立适当的模型传递给视图进行渲染。层级关系一般如下图所示: 在 Web 开发的早期,JSP + Servlet + JavaBean 的组合非常流行,那个时候 JSP 担任着视图层渲染工作,Servlet 作为控制器负责用户的请求和响应,而 JavaBean 则负责一些更加复杂的业务逻辑,例如跟数据库打交道。

后来出现了一个新的 MVC 框架 Struts2,它将 action 作为框架的控制器负责用户请求响应,同时为前端页面提供了标签库和有力的渲染工具-OGNL,用户请求 action 返回数据到 JSP 后,在 JSP 中可以采用 OGNL 表达式对数据进行动态的渲染,它还增加了请求过滤器以及进行请求前后处理的拦截器,方便系统过滤、拦截一些不符合规则的请求并做出及时的响应操作,不得不说它的出现降低了系统的耦合性,让 MVC 模式的分层更加明显,也大大的简化了开发者的代码量。

02 SpringMVC 简介

由于 Struts2 框架带来的便利,它和 Spring 在过去很长一段时间被结合在一起用来构建系统,但是随着技术的发展,二者的结合出现了很多问题例如类臃肿、兼容性以及 Struts2 漏洞等问题,而就在这时候,Spring 家族诞生了一个新的 MVC 框架来与 Spring 实现无缝结合,它就是 SpringMVC。

SpringMVC 是采用 Java 开发,一种基于 Web MVC 设计模式,以请求驱动为类型的轻量级 Web 框架。由于使用了 MVC 架构模式的思想,将 Web 层进行了职责解耦,让分层更加的明显。

03 SpringMVC 优势

谈到 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)等等。每一个角色都可以由一个专门的对象来实现。

04 SpringMVC 流程步骤

SpringMVC 的具体执行流程步骤如下:

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.前端控制器向用户响应结果

2701 次点击
所在节点    Java
4 条回复
MotherShip
2019-07-26 16:37:37 +08:00
你讲这一堆 新人听不懂,老人在书上看过了更详细的

既然是基础,那受众应该会用 servlet 吧

先在一台有 JDK+IDE 的电脑上,从零开始,下载 Tomcat,用 servlet 写 5 个方法:把传入的 JSON 对象反序列化,改它的一个字段,再序列化输出到页面上

记住怎么配置这五个方法对应的 URL



然后去 start.spring.io 弄一个 spring boot+spring mvc+embedded 的项目,下下来修改,写 5 个一模一样的方法

比较代码量,配置量,可维护性,构建速度

迅速认识你的美
MotherShip
2019-07-26 16:46:39 +08:00
帮你把下面的也写了
整合 SSM 框架必备基础— MyBatis (下)

把刚才那个 springboot 项目打开,引一个 mysql 的依赖,写一个 JDBC 的工具类,把页面给的 JSON 对象存数据库,改一个字段的值,更新到数据库,然后取出来,展示在页面上

然后添加 MyBatis 的依赖,把 SQL 写到注解或者 XML 里,用 Mybatis 的 SqlSession 提供的 select 之类的方法增改查数据

最后把 MyBatis 托管给 Spring,不会不要紧,去刚才那个网站, 弄一个带 mybatis-starter 之类的全套压缩包,和自己写的比较一下

还是比较代码量,配置量,可维护性,构建速度

迅速认识你的美
MotherShip
2019-07-26 16:56:01 +08:00
再来点扩展的
其实 mvc 框架和 orm 框架可以自己玩的地方有不少

整合 SSM 框架必备进阶— mvc 框架
· Excel 报表导出
· PDF 展示
· 全局异常拦截

整合 SSM 框架必备高阶— orm 框架
· 大量分页语句如何处理
· 我们把字段值用反射注入进实体里,那能不能用反射把实体的字段名,也就是 getter/setter 的委托映射成 sql
· 接上条,能不能用反射把实体类的类名映射到表名
· 接上条,能不能不要每个表一个 insert deleteById selectById 和 updateById,表名已经变成了类名,那么我们是不是学过一种与类型无关的思想,叫做泛型
· 大量的乐观锁和逻辑删除如何处理,既然都叫 version 和 is_delete,能不能统一处理
JavaShare
2019-07-26 23:34:34 +08:00
你这么一说,我感觉确实是这样,对新人来说看不懂,对老人来说太基础,哈哈,不过大佬你总结的这些很到位啊,棒
@MotherShip

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/586261

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX