代码重构——用Spring全家桶重构系统 2
要对一个系统进行重构,则需要了解新技术和原有技术之间的差别。
Struts介绍
Struts是较早的一个在WEB开方方面实现MVC的一个框架,当时页面渲染还主要以JSP为主,Struts的实现也是建立在JSP基础上的,可以说Struts就是JSP一个扩展。Struts将GET请求放在JSP里,POST请求的处理放在Action里,通过服务端重写方式来实现前后端代码的分离,每一个Action对应一个请求,Action即可以作为控制器(官方文档认为Action属于视图,手上的这套代码也是这么认为的),也可以作为服务(在JSP里用标签来引用相应的Action以获取相关的数据)。Struts的Action与请求和视图的对应关系是用Xml文件来标注的,Action里返回有限的状态,以转到不同的页面。
在设计上,Struts刻意将Action作为Model的实现,看上去比较有学院派的作风,层次分明、边界明确,实际上用起来比较烦琐,缺少灵活性,基本每个POST请求都要写一个单独的Action,所有表单内容都以属性的方式在Action里进行一一对应,刻意的实图控制器分层,需要定义大量的Action来应对页面的数据请求,JSP里也充斥着大量的Action标签,这反而使得程序的可读性并不高。
图 1 Struts 结构图
Spring MVC介绍
Spring MVC是个后起之秀,虽说也是MVC的实现,但概念上相对Struts要模糊一点,比如M层,并不像Struts那个弄了个Action的定义,在Spring MVC中,除了VC之外的东西都可称为Model。Spring MVC的控制器,需要代码编写者显式定义,这个其实跟Struts一样的,除了静态映射,其它的视图返回都需要执行方法返回一个视图,所以我为什么认为Struts的Action才是真正的控制器,只是Struts的Action只有一个execute方法,而Spring MVC可以在一个类中定义任意个Action方法。
Spring MVC有一个强大的视图管理体系,这使得实图的渲染技术并不限于JSP,还可以使用其它的模板技术,甚至还可以混合着使用。早期版本的Spring mvc也是通过Xml来配置的,不同的是Spring MVC对返回的视图并没有限制到某几个状态,而是需要什么就返回什么,只要模板目录里有对应的视图文件即可,这大大增加了开发的灵活性。
如何转换?
Spring MVC有着更好的灵活性,当然也是可以模拟出Struts的开发模式的,就是将Controller类也做成和Struts Action一样的单方法实现,表单数据定义成类属性,视图层使用InternalResourceViewResolver,直接访问JSP页面。但这样做的意义不大,感觉是为了重构而重构,我们重构系统是为了解决以前不能解决的问题,而不是单纯的换个技术平台。比如对一些基础组件的使用,像消息队列,邮件发送,短信提醒等,我们可以使用Spring Boot的自动装配,从而使得开发者不必花费太多精力用在非业务功能的代码上。
下图是一个基本思路方向,暂时还延用原来的UI: