本节书摘来异步社区《敏捷制造——敏捷集成基础结构设计》一书中的第2章,第2.3节,作者:苏金泷,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.3 集成基础结构数据访问模型
2.3.1 集成基础结构数据存储结构建模分析
敏捷企业的集成基础结构中计算机系统的主要用途之一便是从数据存储检索数据并将信息显示给用户;在用户更改数据之后系统再将更新内容存入数据库。由于数据存储和用户界面之间的数据流是关键的信息流,因此以往更倾向于将这两部分功能程序捆绑在一起。这样虽然可以减少编码量,但用户界面需要频繁地更改,数据与界面的捆绑使用户界面的更改往往伴随着许多逻辑指令的更改,为此程序工作者平添了诸多不便。
Model-View-Controller(MVC)模式SM01SMI99[J05]实现功能模块和显示模块的分离,使得应用程序更加可维护,可扩展,可移植和可复用。Trygve Reenskaug在20世纪70年代末为Smalltalk平台开发了MVC框架,而发展到今天已经形成了一个非常成熟的模式,如图2-8所示。由于当数据和用户界面这两部分耦合在一起时,业务应用程序除数据传输功能外的大量逻辑指令,MVC模型让Web应用程序的用户界面功能实现模块化,以便可以单独修改各个部分。
Model-View-Controller的核心就是做到三层甚至多层的松散耦合,模式基于用户输入,将域的建模、显示和操作分为如图2-8所示的三个独立类:
1.模型:模型用于管理应用程序域的行为和数据,并响应视图为获取其状态信息而发出的请求,还会响应通常来自控制器的更改状态指令。
2.视图:视图用于管理信息的显示。
3.控制器:控制器用于解释用户的鼠标和键盘输入,以通知模型和/或视图进行相应的更改。
Web设计中的MVC模式在浏览器和JSP或SERVLET之间插入一个控制组件。这个控制组件集中了处理浏览器发过来的HTTP请求的分发逻辑,根据HTTP请求的URL输入参数和目前应用的内部状态,把请求分发给相应的Web层的JSP或SERVLET。该控制组件同时也负责选择下一个视图,J2EE中通常由JSP生成返回的HTML从而形成视图给浏览器。集中的控制组件也有利于安全验证和日志纪录。
2.3.2 MVC Model 1结构
JSP改良了Servlet输出网页时,需要把HTML程序代码写在Java程序代码中,并且需要采用复杂的方式修改输出的网页。JSP提供在原始的HTML网页中插入Java程序代码的方式,大幅改善设计使用者接口的难度。
因而,可以完全舍弃Servlet而仅采用JSP,但是程序员必须要配合用户界面美工人员的HTML 程序代码,在适当的地方加上特殊的标记,这让网页画面嵌入了后端程序的逻辑。纯JSP的方法不但增加了配合要花的时间和难度,也增加了程序员熟悉JSP Custom Tag的难度,这种设计方式就是所谓的MVC Model 1[SM01] [SM99] [SMI99] [JNDI99] [J05]。
如图2-9所示,MVC Model 1其实不是一个稳定架构,模型1的基础是JSP文件。它从HTTP的请求中提取参数,调用相应的业务逻辑,处理HTTP会话,最后生成HTTP文档。一系列这样的JSP文件加上其他辅助类或文件形成一个完整的模型1应用。早期的ASP和PHP技术就属于这个情况。
2.3.3 MVC Model 2结构
我们在集成基础结构建设中引入MVC Model 2体系结构[SM01] [SM99] [SMI99] [JNDI99] [J05]作为标准数据访问模型,程序设计中该结构采用了Servlet作为控制器,视图采用JSP(包括处理数据表现的Custom Tag)实现,而模型则由代表商业数据和逻辑的JavaBeans担任。当用户提出请求时,请求首先被控制器接收,控制器根据用户的请求选择适当的模型,由模型执行用户的请求处理。当处理完毕,控制器再选择适当的视图。然后视图执行模型数据的查询和显示,最后以HTML的形式作为请求的响应发送给客户[WSH02]。
如图2-10所示,Model2体系结构虽然借助了纯MVC体系结构的设计思想,但它们之间却存在一些区别[SM01] [SM99] [SMI99],这些区别来源于Web应用本身。首先,在Model 1体系结构中视图没有自动同步的功能,传统的MVC模型中model可以通知view,然后view就可以被更新,但是在Web中作为model的JavaBeans更新后,无法调用JSP。其次,由于Model 1中观察者/通知模式不能在Web环境内很好的工作,HTTP是一个“GET”的协议,即因客户请求而服务器响应,没有请求就没有响应。而观察者使用“POST”协议通知,这样服务器才能在模型变更瞬间及时将信息推送到客户端。虽然存在某些方法能模拟将数据推送到客户端,但这仅是权宜的修补。我们可以通过在JSP页面中嵌入脚本语言执行模型数据,来实现Model2体系结构中本不应该处理的模型数据的查询行为。这样虽然也能模拟将数据推送到客户端,不过这样的做法与JSP组件的角色不符,于是有了MVC Model 2 WSH02SY01BLX02[J05]。
敏捷企业的集成基础结构中,需要频繁地从数据库调用向用户显示,或从浏览器端(客户端)接收各种数据存储到数据库中,以便进行综合分析和处理。集成基础结构是一个面向多个行业的综合信息平台,几乎每一个行业甚至对于每一类用户都必须建立具有针对性的用户界面,但数据调用和存储逻辑却大体相同。倘若要对敏捷供应链中每一类用户都重新编写检索、运算……等程序逻辑的话,程序设计将会是一个浩大的工程,而且平台建设过程中往往会出现程序模块接口不一致的情况;再加上日常维护过程中用户界面的频繁改变,会使集成基础结构建设中程序编写的工作量翻几倍,系统建设与维护过程中所需熟练程序员的数量将会是令人无法承受的。因此,将用户界面与控制逻辑分离,对于敏捷企业的集成基础结构建设来说,具有极其重要的意义。