一、前言
虽然Struts2+Spring3+Hibernate3三大框架上市已久,但廉颇未老,目前仍然是众多JavaEE应用程序的首选技术。本文将向您详细阐述SSH2应用程序的构架、思想、技术与技巧,打通JavaEE的任督二脉,行文力求通畅简洁,希望能让读者豁然开朗,快速掌握JavaEE应用程序的开发流程与关键技术。
本文并非面向无Java基础的读者,您需要掌握一定的编程思想、Java技术和Struts2、Spring3与Hibernate3等框架技术,并了解Oracle等DBMS。
二、JavaEE体系架构
JavaEE体系架构采用传统的MVC设计模式,分为Model、View、Controller三层,其中:Model即模型层,定义数据模型和业务逻辑。为了将数据访问与业务逻辑分离,提高业务精度,降低代码之间的耦合,模型层又细分为DAO层与业务层,DAO全称为Data Access Object(数据访问对象),将数据库访问代码封闭起来,Hibernate API也在此封装,不再出现在其他层或向其他层暴露;业务层是整个系统最核心也最具价值的一层,该层封装应用程序的业务逻辑,处理数据,关注客户需求,在业务处理过程中会访问原始数据或产生新数据,或者需要持久化数据,DAO层提供的DAO类能很好地帮助业务层完成数据处理,业务层本身则侧重于对客户需求的理解和业务规则的适应,自然也包括大部分的计算,总体说来,DAO不处理业务逻辑,只为业务层提供辅助,获取原始数据或持久化数据等操作。View即视图层,为最终用户提供一个友好的交互界面,用户可以查看请求结果,也可以通过表单等交互手段实现数据录入。Controller层即控制器,控制器是Model与View的桥梁,将二者很好的衔接,通过View接收用户数据,Controller将数据传输给Model,Model对数据进行处理;或者Model读取数据后,Controller将数据传递给View,View向用户展示数据。一来一往,Controller成了Model与View之间的快乐使者。
关于MVC更多的解释请参考百度百科链接(http://baike.baidu.com/view/31.htm),下图展示了MVC的结构:
从调用关系上看,左为高层,右为低层,下为高层,上为低层,高层可以调用低层,但低层不能调用高层,层与层之间的调用是单向的。
从数据传输上看,数据可以从视图层传输到DAO进而保存到数据库,也可以从数据库中读取数据进行处理或者显示,所以,数据的传输是双向的。
从技术实现上看,视图层使用HTML/JSP组件实现,控制器使用Servlet或Action组件实现,模型层使用JavaBean组件或EJB技术实现。
Hibernate封装在DAO层,负责数据访问操作;Struts充当控制器角色,对用户数据进行合法性检验和类型转换,为视图层提供标签简化页面显示,提供国际化支持等等;Spring是应用程序的管家,DAO、Service(业务)、Action等对象由Spring创建并维护各对象之间关系,同时提供声明式事务管理,简化事务编程。
三、如何理解业务?
软件工程中的业务与日常生活中的业务不同,平常的业务偏指销售,指需要处理的事务。这里的业务涉及一个以上组织,按某一共同的目标、通过信息交换实现的一系列过程,其中每个过程都有明确的目的,并延续一段时间。将范围更局限一点,业务是指为完成某个事务而进行的一系列活动,需要对象的参与并按照一定的规则触发一系列行为。
业务包含三大元素:对象、行为和业务规则。
对象是主体,是行为的触发者,这里的对象可能是用户、订单、产品或DAO对象,也可能是外部系统,比如支付系统。一个业务的完成,可能需要一个对象参与,也可能是多个对象参与,这取决于业务本身。行为是对象的动作,多个行为按照一定的顺序执行,构成业务完整的执行能力。业务规则是对业务的一种约束,每一个行为所产生的结果必须对规则负责,规则监视对象、行为以及业务执行的结果,保证业务的正确性和准确性。
我们以取款业务为例,来分析本业务中涉及的对象、行为和规则。
取款业务描述:输入用户账号(银行刷卡完成),提醒用户输入密码,银行系统核对密码是否正确,如果正确,用户输入取款金额,系统更改账户金额并记录取款信息,打印票据,取款完成。
这是一个司空见惯的业务,从这个业务中,我们提取出如下的元素信息:
对象:账号,交易,打印机;
行为:核对卡号和密码,更改账户余额,记录取款交易信息,打印票据;
规则:一次最多只能取2000元,一天最多只能取5次,取款金额大于50000需要预约;
根据以上的分析,我们很容易转变成源代码。很多时候,我们遇到的业务比这个要复杂得多,项目的规模也很大,这就要求我们具备全局观,控制全场,运筹帷幄,仔细分析,辅助建模,达到最理想的效果。
——作者:李赞红 (lifenote@21cn.com),转载请保留版权!