分支控制标签
每个
格式化数字标签
其中voucher.actualTotal是要格式化的数字内容,“#,##0.00”是格式化数据的样式,其中“0”表示一个数位,“#”表示前导零和追尾零不显示的一个数位,“.”表示小数点分割位置,“,”表示组分隔符的位置,所以该样式小数点后保留2位,整数数位3位为一组,例如数字12345经本样式格式化后显示为12,345.00。 ② 配置action
本系统中,Struts 2 的action由Spring管理,为需要的action类 PurchaseAct配置Spring的bean,代码如下:
其中id是Spring bean的全局唯一标识,class是类PurchaseAct的具体位置(包名+类名),scope是作用区域,scope的值配置为session说明作用区域是整个会话,autowire表示自动装配Spring bean,autowire的值配置为byName说明Spring bean通过名字自动装配。
配置Struts 2的action的示例代码如下:
其中action元素的name属性在同一个名字空间下是action的唯一标识,class属性指明action对应的类,值是之前已经配置好的Spring bean,method属性指明
30
action对应的类中的方法,默认方法是execute();result元素的name属性在同一个action元素里是result的唯一标识,默认值是success,type属性指明result的类型,本系统中主要用了result的默认类型dispatcher来跳往JSP页面和redirect类型来跳往另一个action。 ③ 编写action类
编写action类PurchaseAct继承于父类VoucherAct。
VoucherAct需要调用业务逻辑类VoucherBiz的方法来处理业务逻辑,本系统采用Spring的依赖注入(IOC)特性,VoucherAct类通过set注入的方式访问VoucherBiz类,注入代码如下:
表现层还要完成与页面的交互,VoucherAct类通过set注入的方式访问JSP页面数据,通过get的方式向JSP页面传递数据,voucher对象交互的示例代码如下:
系统中两个不同的action也要交互,这两个action都要访问同一个对象,本系统中一个action通过Spring的应用上下文ApplicationContext获得另外一个action,再获得另一个action的某个对象,例如action类PurchaseAct有一个私有属性voucher对象,另一个action类UnitAct也要访问这个对象voucher,示例代码如下:
其中purchaseAct是之前配置好的Spring bean。
VoucherAct类中有check()方法,用来转发单据记账的请求,校验数据是否符合要求,如果不符合退出,符合再对单据voucher对象进行一些基本设置后调用voucherBiz的saveCheck()方法来处理单据记账操作的业务逻辑,示例代码如下:
31
④ 校验输入数据
服务器端的校验一般在表现层实现,也可以在业务逻辑层实现,表现层可以实现的校验绝对不在业务逻辑层进行校验工作。
对于不需要访问数据库的校验在表现层实现,如校验某个值是否为空或校验某个值是否符合输入规则(如日期)等,VoucherAct类有validation()方法,校验输入的数据是否符合规范,如果校验不通过会在页面上提示校验错误信息,校验进货日期不能为空的示例代码如下:
其中addFieldError()是接口IFieldValidation的方法,类VoucherAct实现了接口IFieldValidation。 (3) 业务逻辑层实现
为业务逻辑类VoucherBizImpl配置Spring bean,代码如下:
voucherBiz是VoucherBizImpl类型的bean,VoucherBiz是接口,VoucherBizImpl实现了VoucherBiz接口。
编写业务逻辑类VoucherBizImpl继承于接口VoucherBiz,VoucherBizImpl通过set注入的方式访问数据访问类VoucherDAO,代码如下:
VoucherBizImpl类有saveCheck()方法,处理单据记账操作的业务逻辑并调用VoucherDAO的方法访问数据库,其中业务逻辑主要包括单据、库存和账款信息的更新,示例代码如下:
32
对于要访问数据库操作的服务器端校验要在业务逻辑层实现,如进货退货单记账时要校验要出库的商品库存是否充足,如果库存足够继续单据记账操作,如果库存不足则提示某个商品库存不足的信息。类VoucherBizImpl有validation()方法,利用IFieldValidation接口将调用该方法的action传递到VoucherBizImpl,错误提示信息传递给action后再传到页面显示出来。 (4) 数据访问层实现
为数据访问类VoucherDAOImpl配置Spring bean,代码如下:
voucherDAO是VoucherDAOImpl类型的Spring bean,VoucherDAO是接口,VoucherDAOImpl实现了接口VoucherDAO,由于VoucherDAOImpl继承父类HibernateDaoSupport,它会自动注入Hibernate的会话工厂sessionFactory。
编写数据访问类VoucherDAOImpl实现接口VoucherDAO,它有save()方法,用于往数据库的单据表里添加一条记录,代码如下:
2. 单据冲抵
如果发现已记账的业务单据有错,只能对该单据执行冲抵,原单据的冲抵标识属性改为true并更新原单据。复制原单据另存为冲抵单据,单据编码和原单据一样,单据制单人和记账人改为当前用户,制单日期改为当前日期,单据中商品的数量以及金额属性乘以-1,单据中与金额有关的属性也乘以-1,单据的记账标识和冲抵标识都设置为true,记账该单据并更新库存信息(出库采用先进先出算法)和账款信息,跳转到“业务单据历史”界面。单据冲抵的流程图如图5.5所示。
33

