EASBOS应用框架编程指南.doc
EAS-BOS应用框架编程指南1. 业务对象层应用框架在业务对象层建立了一些典型业务对象,可用做设计人员建立自己的业务对象的超类。这些用做超类的业务对象,既定义了对象属性,也提供了业务方法。例如,层次数据的超类TreeBase在数据保存时会自动维护level、isLeaf和longNumber的正确性。1.1. 类体系类体系内容CoreBase所有业务对象的超类|- ObjectBase普通业务对象的超类|- DataBase基础资料类业务对象的超类|- TreeBase层次数据类业务对象的超类|- BillBase单据业务对象的超类,对应单据头部分|- BillEntryBase单据业务对象的超类,对应单据体部分1.2. 所有业务对象超类CoreBase属性名称描述数据类型对应字段Id对象IDBOSUUIDFID方法名称描述addNew继承基类,添加时设置creator,createTime, lastUpdateUser, lastUpdateTime,等固定属性值。Update继承基类,更新时设置lastUpdateUser, lastUpdateTime, company等固定属性值。Submit设置业务数据生效,并保存save设为暂存状态,并保存cancel作废(逻辑删除),并保存cancelCancel取消作废状态,并保存checkStatusValid检查业务数据是否是有效canUpdate检查业务数据能否更新,逻辑条件是否满足更新要求(补充)isReferenced检查业务数据是否被引用,删除操作会调用此函数(补充)1.3. 普通业务对象超类ObjectBase属性名称描述数据类型对应字段Creator创建者连接属性连接到用户FCreatorIDCreateTime创建时间TimestampFCreateTimeLastUpdateUser最后修改者连接属性连接到用户FLastUpdateUserIDLastUpdateTime最后修改时间TimestampFLastUpdateTime方法名称描述常见问题1.问:Creator、CreateTime、LastUpdateUser、LastUpdateTime作用和意义? 答:所在普通业务对象的基本属性,由基类来维护,业务对象不能用作其他用途。 1.4. 基础资料超类DataBase属性名称描述数据类型Name名称(多语言)StringNumber编码Stringdescription描述(多语言)StringsimpleName简称String方法名称描述checkNameBlank名称是否为空checkNameDup名称是否重复checkNumberBlank编码是否为空checkNumberDup编码是否重复注:【名称与编码】检查方法都是需要根据业务要求进行调用的,应用框架本身不调用。常见问题1.问:为何继承自DataBase的类没有自动进行名称及编码的检查? 答:没办法统一检查机制,可能由于检查的条件不一样,如科目表使用全局的检查,就可直接调用如上的方法来完成。2.问:编码规则如何起作用? 答:编码规则在DataBase类起作用。从DataBase继承的类如果定义了编码规则就会自动由基类来完成,子类不需要关心。1.5. 层次数据超类TreeBase属性名称描述数据类型对应字段IsLeaf是否叶节点BooleanFIsLeafLevel所在级次IntegerFLevelLongNumber节点完整编号StringFLongNumber因为超类中定义的关系无法实例化,所以TreeBase并未定义parent关联属性。要求在子类中自行建立这个表示指向父节点的关联属性,并且约定属性名一定是parent。方法名称描述updateLeafByLongNumber父节点编号更新时重设所有子节点编号checkParentDataExist检查该编号下的父节点是否存在checkParentValid校验父节点的状态应为有效,父节点是否被删除。checkParentBeUsed校验父节点是否被其他数据使用。如果被使用则不能新建子节点。子类需要通过重载_isReference来定义引用逻辑getRoot获取根节点getChildren返回儿子节点集合getAllChildren返回所有后代节点集合deleteWithChildren删除自身及其所有后代节点常见问题1.问:isLeaf、level、longNumber由基类处理吗? 答:是的。父类自动维护,子类不需要进行干预。2.问:检查编码重复的注意事项。 答:原则:输入项必须完整,生成项可以没有,如level,isLeaf,longnumber等,传递给基类的值要求有id,number,name,description。1.6. 单据超类BillBase(单据头)属性名称描述数据类型对应字段Number单据编号StringFNumberhandleTime经办时间TimeStampFHandleTimeHandler经手人连接属性连接到用户FhandlerIDDescription备注(多语言)StringFdescriptionhasEffected是否曾经生效BooleanFhasEffectedAuditor审核人连接属性连接到用户FcheckIDsourceBillId原始单据IDStringFsourceBillIDsourceFunction来源功能StringFsourceFunction方法名称描述checkOut结清(关闭)业务数据passAudit审核通过UnpassAudit设置为未审核状态Freeze冻结业务数据Unfreeze解冻业务数据checkStatusFreeze检查业务数据是否被冻结checkNumberDup检查单据编号是否重复checkNumberBlank检查单据编号是否为空checkHandleTimeBlank检查经办时间是否为空checkHandlerBlank检查经办人是否为空checkLineExist检查是否至少有一条分录可选的方法:1. protected SystemEnum getOwnedSys():定义单据所属的系统。通常情况下一种单据所属的系统是确定的,可以在单据对象的扩展属性予以定义。超类负责处理这种情况。对于一种类型的单据被实例化到不同系统的情况,可以增加实体属性,并重载这个方法。常见问题1.问:单据生成凭证的处理? 答:校验是否已经生成过凭证,如果已经生成过则抛异常。2.问:单据关联关系处理。 答:处理所有的分录关联。分为暂存与提交两类。1.7. 单据超类BillEntryBase(单据体)属性名称描述数据类型对应字段Sequence单据分录序列号(定义为序列属性即使用seq)IntegerFSequence常见问题1.8. 通用设计方法1.8.1. 业务数据状态管理业务数据状态属于数据的附加描述属性,表达业务数据经过的处理过程,例如:是否已生效、是否已审核,并据此进行相应的逻辑控制。业务数据状态根据业务数据的不同类型会有不同组合,例如:基础资料中可能只有是否生效状态,而单据中会有是否已审核及是否已关闭等状态。在应用架构中会抽象业务数据中存在的状态种类,并在超类体系里固化对某些通用状态的处理逻辑。状态配置表下表列出了所有已知的数据状态属性,这些属性将作为基础的状态属性供定义具体的业务对象时选择使用。状态名状态描述状态枚举类型属性名字段名说明生效状态0:暂存EffectedStatusEnumEffectedStatusFEffectedStatus暂存的业务数据不需要进行数据合法性检查,不参与统计报表和结账结算处理1:生效作废状态0:普通DeletedStatusEnumDeletedStatusFDeletedStatus作废的业务数据不参与统计报表和结账结算处理待添加的隐藏文字内容31:作废审核状态0:未审核CheckedStatusEnumCheckedStatusFCheckedStatus1:已审核冻结状态0:未冻结BlockedStatusEnumBlockedStatusFBlockedStatus冻结的业务对象禁止参与新的业务活动,但已经存在的业务活动不受影响。有的业务对象的冻结状态可能会进一步细分,如“客户”的冻结可能会包含:Posting block、Order block、Delivery block、Invoicing block1:已冻结下达状态0:未下达ReleasedStatusEnumReleasedStatusFReleasedStatus订单类的单据一般会有下达状态1:已下达预算审批状态0:未审批BudgetAuditedStatusEnumBudgetAuditedStatusFBudgetAuditedStatus1:审批未通过2:审批已通过交付状态0:未交付DeliveredStatusEnumDeliveredStatusFDeliveredStatus1:部分交付2:全部交付FI记账状态0:未记账FIPostedStatusEnumFIPostedStatusFFIPostedStatus1:已记账MA记账状态0:未记账MAPostdStatusEnumMAPostdStatusFMAPostdStatus1:已记账关闭(结清)状态0:未关闭ClosedStatusEnumClosedStatusFClosedStatus1:已关闭说明:1、 属性对应的数据类型都是相应的枚举类型,类型为Int。字段的数据类型也使用Int。2、 在com.kingdee.eas.framework包中定义了枚举类型供使用。使用方法所有基础的状态属性被定义于配置表中,已集成于BOS Studio中。如果业务对象要使用某个状态属性,可方便地选取即可。单据状态单据状态往往是由多个基础状态属性组合后对外的统一表现形式。以订单处理为例,可能表现为六种状态:在内部处理中,实际上选择了三个基础的状态属性来实现控制逻辑:作废状态、完成状态和关闭状态。控制逻辑的规则是:单据状态状态判断操作控制取消只要作废状态为1 若单据进入取消状态,则只有恢复后才能进行其它所有单据操作关闭单据不是取消状态且关闭状态为1禁止除与取消相关外的其它操作计划单据不是取消状态也不是关闭状态,且完成状态为0(未下达)允许下达操作下达单据不是取消状态也不是关闭状态,且完成状态为1(下达)允许撤消操作进行中单据不是取消状态也不是关闭状态,且完成状态为2(进行中)完成单据不是取消状态也不是关闭状态,且完成状态为3(完成)允许关闭操作从编程的方便性考虑,推荐为单据状态定义自己的枚举,并为值对象增加一个getBillStatus方法。该方法通过计算基本属性的取值而得到对应的单据状态。需要注意的是,设置单据状态的操作仍将操作基本状态属性,并且在设置某个状态属性时可能需要根据控制逻辑同时设置其它属性。2. UI层UI层提供数据的展现方式与客户端控制逻辑。2.1. 通用设计方法2.1.1. 数据绑定数据绑定主要分为两种类型:查询类界面的数据绑定和编辑类界面的数据绑定。对于查询类界面,数据绑定是一个从Query对象到KDTable的单向过程。通常在设计期定义完绑定关系后,不会在代码中再关注绑定问题。相关方法是:1. 由KDTable的setFormatXML方法完成列的定义2. 由KDTable的putBindContents传递绑定关系3. 在KDTalbe的doRequestRowSet事件中完成数据的获取与显示 对于编辑类界面,由loadFields和storeFields方法定义了Entity对象与界面控件双向的绑定关系。如果对象是聚合类型的数据(例如单据)并选择KDTable显示单据体,则进一步由loadLineFields和storeLineFields定义了单据行与KDTable的绑定关系。如果在BOS Studio中定义绑定关系,那么这些方法会由BOS自动生成。注意:不管是完全不使用BOS Studio来定义绑定关系,还是只有部分控件使用BOS Studio定义了绑定关系,你都需要重载这些方法,并通过手工编码来把所有绑定关系补充完整。这是因为超类依赖于这些方法来管理绑定关系。示例:假设币别编辑界面没有为isoCode在设计期定义绑定关系,那么需要补充定义:public void loadFields()super.loadFields();/ editData允许强类型访问txtIsoCode.setText(editData.getIsoCode();public void storeFields()super.storeFields();editData.setIsoCode(txtIsoCode.getText();2.1.2. UI元素的使能控制对UI元素进行使能控制有两种方法:一是利用setOprtState方法,二是利用checkActionStatus方法。在BOS的UI设计器中,可以利用状态编辑视图定义各种状态下控件的使能情况。BOS会自动生成反映满足这种定义的setOprtState方法。当然,也可以不用BOS的定义能力而重载后完全自行编码,尤其是在需要定义更多逻辑时:例如控件的使能可能需要检查当OprtState处于某种状态时,某些数据是否同时符合要求。而checkActionStatus方法会在按钮的事件响应完毕后被调用,作为一种推荐的检查控件使能的统一位置。checkActionStatus的调用频率比较高,故检查逻辑最好比较简单。注意:这种方式与UI的OprtState没有关系,视为对OprtState机制的一种补充。2.1.3. UILoadListener应用框架提供一种扩展机制,允许在加载UI对象和注销UI对象时加入自定义的处理逻辑。public interface IUILoadListener extends EventListener public void load(UILoadEvent e); public void unload(UILoadEvent e); 例如,想实现用户监控功能,可以按如下步骤进行:1. 在BOS Studio中定义UI对象的扩展属性。此处定义功能编号和功能描述。2. 编写IUILoadListener的实现类,在load事件中访问UI元数据,获取扩展属性中定义的信息,注册用户监控信息;在unload事件中访问UI元数据,获取扩展属性中定义的信息,注销用户监控信息。2.2. 序时簿类UI序时簿是EAS规范地展现数据的方式,提供查询过滤的能力,并可打开维护数据的编辑类界面。序时簿使用查询对象来执行查询,使用KDTable来展现数据。2.2.1. 类体系类体系内容CoreUIEAS的UI最高超类,继承BOS定义的CoreUIObject(从KDPanel派生,这样UI可以方便地嵌入到其它UI中)。|- ListUI序时簿类UI的最高超类,提供数据查询与显示,关联编辑界面的管理等。适用于小数据量的基础资料、无过滤条件的查询等。|- CommonQueryListUI带通用查询对话框的序时簿类UI的超类。适用于基础资料、带过滤条件的查询等。|- BillListUI单据序时簿类UI的超类。支持针对单据类的通用操作处理,例如结清、冻结、审核等。处理状态过滤与显示。|- TreeListUI层次数据序时簿的UI超类。支持层次数据的展现,提供KDTree与KDTable的关联处理,支持层次分类数据本身的编辑。|- ComboTreeListUI带拥有者的层次数据序时簿的UI超类。适用于层次数据本身还有分类的情形,例如物料按仓位分类。|- TreeDetailListUI层次数据序时簿的UI超类。支持层次数据的展现,提供KDTree与KDTable的关联处理,支持层次分类数据本身的编辑。|- ComboTreeDetailListUI带拥有者的层次数据序时簿的UI超类。适用于层次数据本身还有分类的情形,例如科目按科目表分类。2.2.2. 通用基类UI完成了通用职责处理,在此,进行了权限、License、网络控制的通用处理。2.2.3. 普通序时簿类UI从CoreUI继承下来。下图是一个普通的序时簿界面的样例。截图。类方法介绍普通序时簿类UI从com.kingdee.eas.framework.client.ListUI继承。通过BOS Studio完成UI对象的创建、更改继承Query对象的类型以及KDTable控件绑定等。必须重载的方法:1. protected abstract String getEditUIName():指示关联的编辑UI对象名示例:protected String getEditUIName() return “com.kingdee.eas.basedata.assistant.client.CurrencyEditUI”;2. protected abstract IObjectBase getBizInterface():获取列表对应实体的业务接口,以便调用业务方法。要求实体必须从ObjectBase及其子类派生。示例:protected IObjectBase getBizInterface() return CurrencyFactory.getRemoteInstance();可选的方法:1. protected void prepareUIContext(UIContext uiContext, java.awt.event.ActionEvent e):允许构造传递给EditUI的UIContext。利用这个方法,你可以加入需要的任何对象并传递给EditUI。示例:protected void prepareUIContext(UIContext uiContext, java.awt.event.ActionEvent e) / 检查是否按下新建按钮 if (e.getSource() = btnAddNew) uiContext.put(“myObject”, null); else uiContext.pub(“myObject”, getMyObject();2. protected String getEditUIModal():产生编辑UI的方式,缺省是Dialog方式。可以重载这个方法,指定其它的模式。示例:protected String getEditUIModal()return UIFactoryName.EDITWIN;3. protected boolean initDefaultFilter():设置默认过滤条件。该方法被onLoad调用。4. protected void refresh(ActionEvent e):界面刷新方法。通过传递的参数e可以知道触发事件源。在ListUI的缺省实现中,refresh是靠调用execQuery把数据重新获取一遍来达到刷新的效果的。派生类可以依据实际情况来定义更合理的刷新策略。5. protected String getKeyFieldName():获取KDTable中的主键列名称,供编辑/删除时获取主键用。默认值为"id"。注意:BOS自动生成KDTable的列时,使用的是query对象名.id的形式,与超类中约定并不一致。要么在设计期将列名修改,要么在重载该方法返回正确的列名。常见问题1. 问:序时簿界面打开时会自动查询并显示所有的数据,我想加入一个过滤条件应该怎么做?答:重载initDefaultFilter方法,为mainQuery对象(类型是EntityViewInfo)增加过滤条件(filterItem)。也可弹出一个对话框(例如通用查询对话框),让用户指定过滤条件。2. 问:我增加了一个按钮,想在执行完毕的时候刷新一下列表,该怎么做?答:在actionPerformed方法最后一行加调用exceQuery()的代码即可。3. 问:我增加了一个按钮,想在执行前先检查列表是否有选中的行,该怎么做?答:在actionPerformed方法第一行加调用checkSelected()的代码即可。该方法在检查到没有选中的行时,会弹出对话框提示用户,并且不再继续执行actionPerformed方法中后面的代码。4. 问:如何得到选中行的主键值?答:使用getSelectedKeyValue方法即可 2.2.4. 带通用查询的序时簿类UI界面样式。超类为CommonQueryListUI,从ListUI继承。在超类基础上增加了对通用查询对话框的管理。类方法介绍带通用查询的序时簿类UI从com.kingdee.eas.framework.client.CommonQueryListUI继承。可选的方法:1. protected void prepareCommonQueryParam(CommonQueryParam param):在该方法中定义要传递给通用查询对话框的参数。超类的该方法已经把查询对象放到了param中,通常可不必再重载。如果有特别的需要,则按通用查询对话框的要求进行设置。示例(用一个自己编写的过滤页面替换掉通用过滤页面):protected void prepareCommonQueryParam(CommonQueryParam param) super.prepareCommonQueryParam(param); param.setShowFilter(false); / 不显示通用过滤页面 param.addPanel(new MyQueryPanel(); / 加入自己的过滤页面常见问题1. 问:打开带通用查询的序时簿类UI,缺省会弹出通用查询对话框,我怎么调整这个行为?答:超类使用getDefaultFilterInited()方法来判定UI是否已设置了缺省的filter。当没有设置时,就会弹出通用查询对话框。你可以重载initDefaultFilter方法,设置缺省的filter并返回true(不设置filter也没有关系,主要是返回true即可)。2.2.5. 单据序时簿类UI超类为BillListUI,从CommonQueryListUI继承。在超类基础上增加了对单据通用操作的处理。2.2.6. 层次数据序时簿类UI超类为TreeListUI,从ListUI继承。在超类基础上,增加了一个KDTree,以管理层次数据。除支持在KDTable中展现数据的编辑外(该能力从ListUI继承),还支持Tree本身的编辑(典型如地址簿分类的编辑)。类方法介绍层次数据序时簿类UI从com.kingdee.eas.framework.client.TreeListUI继承。通过BOS Studio完成UI对象的创建、更改继承Query对象的类型以及处理控件绑定等。KDTree上每个节点的类型为KDTreeNode类型。必须重载的abstract方法:1. protected abstract String getQueryFieldName():点击树上节点时形成过滤条件时的字段,例如地址簿序时簿界面右边的地址列表要依据左边Tree上选中的地址分类而刷新,此处则返回Address.class即可。2. protected abstract ITreeBase getTreeInterface():获取层次数据实体的业务接口,以便调用业务方法。要求实体必须从TreeBase及其子类派生。可选的方法:1. protected void buildTreeFilter():构造查询子节点数据的过滤条件。在TreeListUI中默认实现为在EntityViewInfo中添加一个getQueryFieldName()=treeNodeInfo的过滤条件,即查询对象的某个属性关联到Tree节点所代表的对象。超类认为这种查询条件是是最常见的情况,例如地址簿对象有一个属性指向关联的地址簿分组对象。该默认实现依赖于getQueryFieldName纯虚方法。如果你需要构造的查询条件不是这种形式,则需要重载本方法自行设定过滤条件。示例:protected void buildTreeFilter()KDTreeNode treeNode = (KDTreeNode)treeMain.getLastSelectedPathComponent();AddressClassInfo info = (AddressClassInfo)treeNode.getUserObject();/ 清空并加入自己的过滤条件(通讯地址包含被选中地址簿分类的名称=>仅示意而已)FilterItemCollection items = mainQuery.getFilter().getFilterItems();items.clear();items().add(new FilterItemInfo ("postalAddress",info.getClassName(),CompareType.LIKE)2. protected String getGroupEditUIName():指示Tree关联的类别编辑UI对象名,如果界面需要实现类别编辑,则需要重载该方法。3. protected String getGroupEditUIModal():与ListUI类似,表示产生类别编辑UI的方式。4. protected void prepareGroupUIContext(UIContext uiContext, ActionEvent e):类似于ListUI对关联EditUI的处理方式,允许构造传递给GroupEditUI的UIContext。超类默认对于新增类别,传入了当前选中的节点对象(默认为是新增节点的父节点,通过UIContext.PARENTNODE传递)。5. protected String getRootName():定义一个虚拟根节点的显示名称,默认返回null,即不需要虚拟根节点。此时,所有节点都依据实际的数据构造,可能会有多个一级节点。继承类可以重载,定义虚拟根结点。示例(地址簿序时簿需要定义一个虚的根节点):protected String getRootName()return "地址分类"6. protected void initTree():初始化构造Tree。一般情况下请不要重载这个方法,除非你决定用自己的ITreeBuilder接口的实现类替换掉超类默认提供的LNTreeBuilder。7. protected ILNTreeNodeCtrl getLNTreeNodeCtrl():返回与LNTreeBuilder配合使用的ILNTreeNodeCtrl实现类。超类提供默认的实现类DefaultLNTreeNodeCtrl。在特定情况下需要重载,例如菜单树需要根据权限进行过滤而不是仅根据longnumber过滤时。常见问题1. 问:如何启用TreeListUI对Tree分组的编辑能力?答:首先将分组编辑相关的按钮Visible属性设置为true,然后重载getGroupEditUIName方法指示关联的编辑UI对象名。2. 问:如何获得选中节点?如何获得选中节点的主键值?答:使用getSelectedNode获得选中节点所对应的对象。为方便获取主键值,提供了getSelectedNodeKeyValue方法。Tree的构造机制及如何扩展?树的构造由ITreeBuidler接口定义。主要的方法是:l public JTree buildTree(JTree tree):构建树,若传入tree为null,则新建树。l public void refreshTreeNode(KDTreeNode treeNode):重新取数,刷新节点。针对EAS处理层次数据采用长编码(longnumber)的情况,应用框架提供了LNTreeBuilder这个特定实现类。与此配合,又定义了ILNTreeNodeCtrl接口和该接口的实现类DefaultLNTreeNodeCtrl。1. LNTreeBuilder:实现ITreeBuilder接口,提供树的构建能力。2. ILNTreeNodeCtrl接口:根据父结点信息,获取指定层次子孙结点信息。主要的方法是:l public AbstractObjectCollection getChildren(TreeBaseInfo parentNodeInfo, int level):获取指定结点的指定级次的子孙结点。若parent=null,则获取从1到指定级次的结点。3. DefaultLNTreeNodeCtrl:实现ILNTreeNodeCtrl接口,完成根据longnumber获取下级节点数据的能力。如果有不基于longnumber方式的层次数据,可通过实现ITreeBuilder接口予以扩展。2.2.7. 带拥有者的层次数据序时簿类UI超类为ComboTreeListUI,从TreeListUI继承。2.2.8. 带分类的层次数据序时簿UI超类为TreeDetailListUI,从ListUI继承。类方法介绍层次数据序时簿类UI从com.kingdee.eas.framework.client.TreeListUI继承。通过BOS Studio完成UI对象的创建、更改继承Query对象的类型以及处理控件绑定等。KDTree上每个节点的类型为KDTreeNode类型。必须重载的abstract方法:1. protected abstract String getQueryFieldName():点击树上节点时形成过滤条件时的字段,例如地址簿序时簿界面右边的地址列表要依据左边Tree上选中的地址分类而刷新,此处则返回Address.class即可。2. protected abstract ITreeBase getTreeInterface():获取层次数据实体的业务接口,以便调用业务方法。要求实体必须从TreeBase及其子类派生。3. protected abstract String getGroupEditUIName():关联的类别编辑UI对象名,如果界面需要实现类别编辑,则需要重载该方法。可选的方法:参考层次数据序时簿类UI。2.2.9. 带拥有者和分类的层次数据序时簿UI超类为ComboTreeDetailListUI,从TreeDetalListUI继承。2.3. 编辑类UI2.3.1. 类体系类体系内容CoreUIEAS的UI最高超类,继承BOS定义的CoreUIObject(从KDPanel派生,这样UI可以方便地嵌入到其它UI中)。|- EditUI编辑类UI的超类,支持实体对象的编辑能力,与ObjectBase配合使用。|- BillEditUI单据编辑类UI的超类,与BillBase配合使用。2.3.2. 普通编辑类UI超类为EditUI,从CoreUI继承。EditUI支持实体对象的编辑,提供新增、删除、提交、暂存、作废数据、放弃作废、打印及上一条、下一条等功能。EditUI支持的实体对象必须从ObjectBase及其子类继承。类方法介绍普通编辑类UI从com.kingdee.eas.framework.client.EditUI继承。通过BOS Studio完成UI对象的创建、更改继承Entity对象的类型以及处理控件绑定等。必须重载的方法:1. protected IObjectValue createNewData():新建业务对象,并设置初始值。示例:protected IObjectValue createNewData() CurrencyInfo info = new CurrencyInfo(); / 设定初值 info.setCreator(sysContext.getOperator(); info.setIsoCode(defaultIsoCode); info.setSign(defaultSign);return info;2. protected abstract IObjectBase getBizInterface():获取实体对象的业务接口,供调用后台方法使用。示例:protected IObjectBase getBizInterface()return CurrencyFactory.getRemoteInstance();可选的方法:1. protected void verifyInput () throws Exception:校验输入的