- Action
- 接受来自页面的请求,调用Service实现业务功能
- 捕获成功/失败消息,实现页面跳转
- 表单数据的初始化,如创建者创建时间需重写action的creatNewForm方法
- 请不要在Action层实现业务功能,不要在Action中对Model进行赋值,不要在同一个处理过程调用多个Service的方法(每次调用的事务都不同)
- Form
- 绑定页面数据的对象模型
- Struts的数据校验机制
- 实现Form与model的转换(FormToModelPropertyMap,model主要体现在数据库操作上,而Form则体现在页面数据获取和页面数据展现上。两者之间需要进行互转。
- Service
- 调用多个DAO/Service,实现主要的业务需求
- 采用Spring的代理机制进行事务管理,必须使用接口调用
- 请在Service层完成Model与Form之间的转换
- Model(域模型)
- 数据库记录到Java对象的映射(ORM)
- 对Model的操作相当于对表进行操作
- 实现Model与Form的转换(ModelToFormPropertyMap)
- 注意:被Hibernate接管的Model即使不对其进行Save,数据也会写入到数据库中(例外:Spring的readonly控制)
- DAO(Data Access Object)
- 数据访问接口
- 一般提供基础的增、删、查、改的基础动作
- 编程建议:保证DAO的“原子”性,这里指的是数据一致性。
各个基类的具体介绍详见基类使用说明。
- BaseForm:所有Form必须实现的接口,继承了类ValidatorForm,重写了toString,equals,validate,isValidate,customerValidate等方法。
- ExtendForm:IExtendForm的基本实现,继承了BaseForm ,与IBaseModel相对应,该接口也定义了ID字段的命名 fdId , Form到Model的特殊属性映射表。建议所有的Form都继承该类。该类除了实现IExtendForm要求的一些方法外,还重载了equals、toString、hashCode等常用的方法。
- ExtendAction:ExtendAction继承了BaseSearchAction 类,该类实现了一些页面常用的操作(添加,分页查询,删除,批量删除,更新,编辑,阅读查看,保存添加,搜索等),建议所有的Action都继承该类。
- IBaseService:所有Service必须实现的接口,它统一了一个数据对象提供的基本服务(增删查改,Model和Form之间的相互转换)
- BaseServiceImp:IBaseService的基本实现,建议所有的Service继承该类。BaseServiceImp只能提供基本的服务,但往往一个具体的业务数据,它所提供的服务会更加丰富,甚至对于同样的操作,各个业务数据的处理方式也不尽相同(如:某些数据保存的同时,需要发送待办通知相关人员等)。所以,在编程的过程中,BaseServiceImp中的方法是鼓励您重载的,但重载的时候务必注意:您必须调用super.***()完成原来的操作,比如:您需要重载update的方法,您需要在您的update方法中需要更新数据的地方调用super.update(***)来完成更新动作。
- IBaseModel:所有域模型必须实现的接口,它统一了域模型ID字段的命名(fdId)和域模型到Form模型转换的特殊属性映射表。
- BaseModel:IBaseModel的基本实现,建议所有的域模型都继承该类。该类除了实现了IBaseModel要求的一些方法外,还重载了equals、toString、hashCode,readLazyField,writeLazyField,getToFormPropertyMap等常用的方法。
- BaseTreeModel:所有类别树需要继承基类,其继承了BaseModel。
- IBaseDao:所有的DAO必须实现的接口,它统一了对数据操作(增删查改)的方法名
- BaseDaoImp:IBaseDao的基本实现,其继承HibernateDaoSupport,建议所有的DAO都继承该类。
- CURD数据交互过程图解
从新建页面到提交操作,最后到操作的页面反馈过程,看似简单,其实不然,点击提交的过程中后台执行了多步操作。接下来将从提交到页面反馈这一过程来剖析底层所执行的操作。
1) Form表单校验
新建页面,录入数据,点击提交操作后会触发$KMSSValidation()事件来调用validation.js中的KMSSValidation实例,从而对页面进行必填以及数据类型等校验,具体校验类型详见validation.js。校验未通过将出现提示信息。通过则执行下一步。
2) 提交请求受理
校验通过后,服务器会根据提交的表单请求路径寻找对应的处理类。
提交请求路径中会包含“.do”关键字,我们可将其看作“*.do”格式。而web.xml会根据 “*.do”的URL来匹配对应的severlet类,如KmssStrutsActionServlet类。KmssStrutsActionServlet类在服务器启动时装载了struts框架其中包括struts.xml。服务器根据请求路径在struts.xml中找到对应的Action类并在找到的类或者父类ExtendAction中将执行save方法。
3) 执行service层add方法
在Action类中定义了getServiceImp(request)方法且通过getBean方式在spring.xml中会找到对应依赖注入的service类。Action层中sava方法会执行getServiceImp(request).add来调用service类或父类BaseServiceImp中的add方法,并在此过程中执行了convertFormToModel的转换操作(此操作会在后续章节中描述),并通过getBaseDao()执行dao层中的add方法,且触发了机制核心服务中的add方法。
4) 数据库持久化
服务器会根据getBaseDao在spring.xml中找到对应依赖注入的dao类,并执行dao类或父类BaseDaoImp中的add方法,在add方法中将会执行getHibernateTemplate().save(model)方法将转换的model对象持久化保存到数据库中。
5) 页面反馈
数据持久化到数据库中成功后返回到action,通过ActionForward在全局struts.xml中找到对应的成功跳转页面。