EBS OAF开发中的绑定值(BoundValues)

来源:互联网 发布:广联达软件包含哪些 编辑:程序博客网 时间:2024/04/29 18:35

EBS OAF开发中的绑定值(BoundValues)

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)

来源:JDeveloper安装目录->jdevdoc->WebHelp\fwkdevguide.htm->BoundValues

概览

数据绑定允许你把UIX web bean与BC4J 组件相互映射数据,为两者之间的空隙架设了连接的桥梁,这样你可以为每个用户创建可以生成动态内容的HTML页面。就像EBS OAF开发中的绑定值(Bound Values)提到的, OAF web bean属性都是作为数据绑定值来实现的,因此映射到组件的数据源(BC4J)直到生成的时候才可以决定的(UIX框架)。 OAF使用UIX的oracle.cabo.ui.data.BoundValue, oracle.cabo.ui.data.DataObjectoracle.cabo.ui.data.DataObjectList接口在运行时进行数据绑定。

Table中的内容切换器(table contentSwitcher),从另一方面来说,就是一个拥有两个或者更多显示选项的区域。显示选项都是预定义好的,但在任意时间只有一个被选中来生成显示出来。

绑定值(BoundValues) VS. 表内容切换器(TableContent Swithers)

应该只限制在表中使用切换器,特别是当你想在不同类型的web bean中切换时,比如一个poplist 或者一个checkbox. 当你仅有一种类型的web bean,但是web bean的属性值在运行时不同,那么你应该实现那个属性为绑定值而不是切换器。

不管怎样,这也有例外,就像ToolBox Tutorial Delete Lab演示的.教程示例中创建了一个雇员表,里面包含一个删除列。删除列允许用户从表中删除一个雇员,这依赖于雇员的状态—如果这个雇员是有效的,删除图标是启用的,否则它是禁用的。但是,要满足508,标准,替代文本关联了启用图标,也关联了禁用图标。在运行时,要显示启用删除图标和替代文本,或者禁用删除图标极其替代问题,教程中为了方便使用了表内容切换器在同一中web bean类型中的两个不同的属性值集之间进行切换。

在这种情况下,如果你想使用绑定值来替换切换器的话,你需要绑定删除图标的图像源到一个视图属性上以便得到图像的文件名,并绑定替代文本到另一个视图属性上以便得到图像的替代文本。

注意:尽管你可以在表的外面使用表内容切换器,但UIX不鼓励这么做。反而,如果可能的话,你应该绑定已索引子对象的Rendered 属性。

内容

l  绑定值

Ø  为什么使用绑定值?

Ø  OAF中的数据绑定

Ø  表之外字段的数据绑定

Ø  表中字段的数据绑定

l  声明式实现

l  运行时控制

绑定值

为什么使用绑定值?

既然可以写自定义的代码来填充HTML页面的内容,就像从在OA扩展属性面板中指定的元数据获取UI内容一样,为什么还要使用绑定值?这里有几个原因,首要原因是绑定值可以简化在生成时从数据源获取值时所需要代码。

对于相互依赖的属性,一个属性的值依赖于另一个属性的值,使用绑定值可以避免大量的重复的代码。考虑下这个例子,”如果类型是NUMBER,右对齐”。如果没有数据绑定,你可能不得不要写下面的代码:

public void setDataType(String type){  if ("NUMBER".equals(type))  {    setAttributeValue(HALIGN_ATTR, HALIGN_RIGHT);    setAttributeValue(DATATYPE_ATTR, type);  } }public void setHAlign(String hAlign){  if ("NUMBER"Equals(getAttributeValue(DATATYPE_ATTR)))  {    setAttributeValue(HALIGN_ATTR, HALIGN_RIGHT);  }  else  {    setAttributeValue(HALIGN_ATTR, hAlign);  }} public String getDataType(){  return getAttributeValue(DATATYPE_ATTR, type);} public String getHAlign(){  if ("NUMBER"Equals(getAttributeValue(DATATYPE_ATTR)))  {    return HALIGN_RIGHT;    return getAttributeValue(HALIGN_ATTR, hAlign);  }}

 

通过绑定值来实现的话,你可以把代码简化为:

bean.setAttributeValue(HALIGN_ATTR, new HAlignBoundValue(bean));

且HAlignBoundValue的定义如下:

public class HAlignBoundValue implements BoundValue{  private OAWebBean mOAWebBean;  HAlignBoundValue(OAWebBean bean)  {    mOAWebBean = bean;  }  public Object getValue(RenderingContext context)  {    if ("NUMBER"Equals(bean.getDataType()))    {      return HAlignRight;    }  }}

注意当依赖的属性值在任意点都可能改变直到生成时,绑定值是尤其相关了.另一个示例参考运行时控制部分。

需要绑定值的另一中情况是在表中,你有少量的列,但是有不知数量的行,与其为每一行和列使用一个bean,这也不可测量,或者使用多层次的bean,不如在每个列绑定数据到一个数据源,比如一个视图对象。

OAF中数据绑定

要理解绑定值如何工作,让我们看一下典型的web bean的结构. 它可能包含已索引的子web bean,命名的子web bean和属性。属性从名/值对的数据字典中获取它们的值。一些名/值对是静态的值,比如prompt/”Employees”或者style “Ora TipTexx”, 并且是在OA扩展属性面板中在设计时就指定好的。其它的则以数据绑定值的方式来实现的,比如消息bean上的文本属性(TEXT_ATTR),它的值是在生成时从数据源中获取的。

对于比如TEXT_ATTR的属性,UIX调用OABoundValue类,一个OA实现了UIX BoundValue接口的类。这个类只包含了一个方法;

public Object getValue(RenderingContext context);

在检查从BoundValue对象中如何取得值之前,注意OAF为每个数据源创建了一个名为DataObject的对象,然后在oracle.cabo.ui.RenderingContext缓存了这些DataObject对象。一个数据源是由webbean上的viewName集合所标示的。OAF然后使用bean上的viewAttr属性作为查找键从DataObject上获取值。Oracle Applications实现了UIX Data Object接口为OADictionaryDataViewObject, OADictionaryDataRow, 和 OADictionaryDataString.

在生成时,当UIX使用BounValue对象为TEXT_ATTR属性获取值时,BoundValue对象中的getValue方法使用viewName和viewAttr构建了一个键,并且获取了缓存在RenderingContext上的命名的DataObject对象。BoundValue对象里的逻辑然后调用了selectValue方法,UIXDataObject接口中的唯一方法,其转而调用了其潜在的视图对象上的getAttrbute方法来获取值。这个值被放到BoundValue.getValue方法上,也就是在生成时这个属性要返回的值。

注意在多线程环境中要保证线程安全,OAF为web beans的属性值使用了数据绑定值(OABoundValue)。实现了OAWebBean的类在需要的地方要使用数据绑定值。如果这些web bean 类提供了一个方法的多个版本比如setText(String text)和setText(OAPageContext pageContext, String text),然后使用数据绑定值,确认要选择带有OAPageContext参数的方法。不带OAPageContext参数的方法通常是继承自基类。比如,使用OAMessageTextInputBean.setText(OAPageContextpage context, String text),而不是OAMessageTextInputBean.setText(String text).。

避免类似setAttributeValue(TEXT_ATTR,"<hardcoded string>")的调用,因为在这种情况下属性值不少数据绑定值。如果你想通过setAttributeValue方法来设置你自定义属性值,你应该设置属性值为你自己自定义数据绑定值对象。

注意当你想从一个bean中获取属性值时,如果可能的话使用getAttributeValue(RenderingContext,AttributeKey)签名的方法来保证属性值被正确地获取。简单地调用属性设置器或者getAttributeValue(AttributeKey)方法而不传递RenderingContext方法,如果属性设置为绑定值的话,它可能返回不正确的结果。比如,使用:

getAttributeValue(pageContext.getRenderingContext(),RENDERED_ATTR);

你在Oracle EBS中可以使用的公开的绑定值对象如下,更多信息可以在运行时控制中找到:

OADataBoundValueAppModule
OADataBoundValueViewObject
OAFunctionSecurityBoundValue

表外的数据绑定

当OAF为表外的字段实现绑定值时,命名的DataObject字典是在当前上下文中维护的。每个bean的数据对象名称是有下面的方式来定义的:

l  Application模块名和视图对象实例名-服役视图对象数据

l  NON_VIEW_OBJECT_DATA(oracle.apps.fnd.framework.webui.OAWebBeanConstants接口的static变量)—对于非视图对象数据

每个bean的数据属性名称是由下面的方式来定义的:

l  视图属性名-对于视图对象数据

l  区域编码,item名称,等等—对于非视图对象数据

表中字段的数据绑定

当你为表中的字段实现绑定值时,OAF生成了一个DataObjectList对象而不是一个单独的DataObject对象。一个DataObjectList对象简单来说就是DataObjects对象的列表。因此,文本属性的绑定值使用了”当前的DataObject”来获取它的值,就像上面描述的.

声明式实现

特定的属性(属性面板中的Required, Rendered, Disabled, 和 Read Only属性)可以使用SPELbinding来进行声明式值绑定。

运行时控制

OAF提供了三种你可以使用的绑定值的实现:

oracle.apps.fnd.framework.webui.OADataBoundValueViewObject, oracle.apps.fnd.framework.webui.OADataBoundValueAppModuleoracle.apps.fnd.framework.webui.OAFunctionSecurityBoundValue.

OADataBoundValueViewObject

你可以使用OADataBoundValueViewObject类来绑定一个webbean属性和一个视图对象属性。要这么做的话,设置属性,代替web bean的属性:

new OADataBoundValueViewObject(webBean, viewAttrName)

在生成时,属性值变成关联到web bean的视图实例(默认是OA扩展中视图实例属性)的viewAttrName的值。如果你想覆盖默认的视图实例,你可以使用替代的构造器,它允许指定视图实例的名称:

new OADataBoundValueViewObject(webBean, viewAttrName, viewUsageName)

你也可以指明要不要格式化绑定值的输出。

像下面指定OADataBoundValueViewObject,来绑定需要在页面上格式化和生成的属性(比如TITLE_ATTR, TEXT_ATTR, PROMPT_ATTR, ...).输出结果通常是字符串,根据web bean或者视图属性的类型来格式化。

OADataBoundValueViewObject(OAWebBeanwebBean,                                 String lookupName,                                 String viewUsageName) OADataBoundValueViewObject(OAWebBeanwebBean,                                StringlookupName)

像下面指定OADataBoundValueViewObject,来绑定在页面生成时不需要格式的属性(比如RENDERED_ATTR, READONLY_ATTR, DISABLED_ATTR, ...),传递’false’给参数formatToString.

OADataBoundValueViewObject(OAWebBean webBean,                                 String lookupName,                                String viewUsageName,                                boolean formatToString)  OADataBoundValueViewObject(OAWebBean webBean,                                 String lookupName,                                 boolean formatToString)

示例

下面的代码展示了如何绑定Total bean的currency code属性来根据表中每行中的currency code属性值来显示格式化的总计。

// Now format the order total value based on the PO's currency code. // "CurrencyCode" is the name of the attribute in the POSimpleSummaryVO    // that this table is referencing. OAMessageStyledTextBean orderTotal =   (OAMessageStyledTextBean)webBean.findIndexedChildRecursive("OrderTotal");if (orderTotal !== null) {   orderTotal.setAttributeValue(CURRENCY_CODE,     new OADataBoundValueViewObject(orderTotal, "CurrencyCode")); }
 

OADataBoundValueAppModule

你可以使用OADataBoundValueAppModule类来绑定一个web bean属性到一个AM返回的值。要这么做的话,覆盖AM中的initializeWebValues(Hashtable paramValues)方法来把值通过lookupName放到Hashtable中。比如,要一个特定的web bean的提示来自于AM返回值的其中之一,put(lookupName,"Value of the prompt")。然后设置属性,代表web bean的属性:

new OADataBoundValueAppModule(webBean, lookupName)

在生成时,属性值基于lookupName从web 值的Hashtable取出。

OAFunctionSecurityBoundValue

OAFunctionSecurityBoundValue是一个基于当前会话用户是否有权访问一个特定function而返回Boolean.TRUE或者 Boolean.FALSE的绑定值.使用这个类来检查一个特定的function基于特定的数据上下文是不是允许访问。比如,你可以绑定RENDERED_ATTR属性到一个function,那么如果不能访问这个function,这个bean就会被隐藏。

//Hides the customer name bean if function 'ShowCustomerNameFunction' is not granted....OAFunctionSecurityBoundValue fSBoundValue =   OAFunctionSecurityBoundValue("ShowCustomerNameFunction");custNameBean.setAttribute(pageContext.getRenderingContext(),   RENDERED_ATTR, fSBoundValue);...

其它的UIX绑定值

UIX提供了很多其它的非常有用的绑定值。下面表中列出了支持一些基本操作的绑定值。

操作

UIX绑定值

Arithmetic

AddBoundValue, ConcatBoundValue

Comparison

ComparisonBoundValue, AndBoundValue, OrBoundValue, NotBoundValue

Type Conversion

ToBooleanBoundValue, ToDateBoundValue, ToCharacterBoundValue, ToIntegerBoundValue, ToStringBoundValue

Matching Attribute Values Among Beans

NodeAttributeBoundValue

UIX绑定值的完整列表,参考包oracle.cabo.ui.data.bind。

示例1

下面的代码展示了如果绑定一个基于另一个属性值的属性。在这种情况下,如果salary bean没生成的话,total bean也不会生成:

OAMessageStyledTextBean totalBean =   (OAMessageStyledTextBean)webBean.findIndexedChildRecursive("totalBean"); OAMessageStyledTextBean salaryBean =   (OAMessageStyledTextBean)webBean.findIndexedChildRecursive("salaryBean"); if(totalBean!=null && salaryBean!=null){  totalBean.setAttribute(RENDERED_ATTR,     new NodeAttributeBoundValue(salaryBean, RENDERED_ATTR));} 
 

示例2

下面的代码展示了如何使用UIX标准绑定值来实现更复杂或者复合的绑定。在这个示例中,在生成时由name属性和description属性连接生成的。

OAMessageStyledTextBean totalBean =   (OAMessageStyledTextBean)webBean.findIndexedChildRecursive("totalBean"); OAMessageStyledTextBean salaryBean =   (OAMessageStyledTextBean)webBean.findIndexedChildRecursive("salaryBean"); if(totalBean!=null && salaryBean!=null){  totalBean.setAttribute(RENDERED_ATTR,     new NodeAttributeBoundValue(salaryBean, RENDERED_ATTR));} 

Form提交绑定值

在特殊情况下当一个组件被激活时,你需要强制form提交时使用的绑定值时的更多信息参考Submitting the Form。

0 0
原创粉丝点击