为Backingbean创建基类

十二月 30, 2009 in Oracle 融合中间件

在Oracle ADF中,经常会使用Backing Scope的ManagedBean,也就是通常所描述的Backingbean,而在这些Backingbean中,有一些操作在很多页面中会被反复重用,例如:

1)根据属性名称从当前页面的绑定中取值

2)向指定的当前页面绑定的属性中设值

3)查找AM中发布成为Client Interface的方法的OperationBinding

4)解析EL表达式

5)其他

既然有了重用,那么我们就可以创建Backingbean的基类,将这些可重用方法抽象到该类,在Oracle ADF的Best Practise中,恰好建议我们这样去做。

在HADF框架的设计与实现的过程时,我们就设计了这样的一个基类,所有基于HADF框架开发的Backingbean都继承于该类,其代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/**
 * @(#)CustomManagedBean.java
 * 
 * HAND Enterprise Solution Company.
 *                          All rights reserved
 * 
 */
package hand.hadf.common.view.backing;
 
import hand.hadf.common.view.HadfException;
 
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
 
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
 
 
import oracle.adf.model.binding.DCBindingContainer;
 
import oracle.adf.model.binding.DCIteratorBinding;
 
import oracle.binding.AttributeBinding;
import oracle.binding.BindingContainer;
import oracle.binding.ControlBinding;
import oracle.binding.OperationBinding;
 
/**
 * 所有基于HADF框架进行的应用开发的BackingBean的基类,即所有客户化开发创建的BackingBean均继承于该类,
 * 同时要求所有子类实现Serializable接口
 * @author Eleven.Xu Nov.26th, 2009
 * @version 1.0.0.0
 */
public class CustomManagedBean {
 
 
  /**
   * 默认的构造器
   */
  public CustomManagedBean() {
  }
 
  /**
   * 解析EL表达式,并返回匹配对象或创建出相应对象
   * @param expression 待解析的EL表达式
   * @return 匹配的受管对象
   */
  public Object resolveExpression(String expression) {
    FacesContext facesContext = getFacesContext();
    Application app = facesContext.getApplication();
    ExpressionFactory elFactory = app.getExpressionFactory();
    ELContext elContext = facesContext.getELContext();
    ValueExpression valueExp =
      elFactory.createValueExpression(elContext, expression, Object.class);
    return valueExp.getValue(elContext);
  }
 
  /**
   * 获取当前FacesContext对象
   */
  public FacesContext getFacesContext() {
    return FacesContext.getCurrentInstance();
  }
 
  /**
   * 获取当前页面的BindingContainer对象
   * @return 当前页面的BindingContainer对象
   */
  public BindingContainer getBindingContainer() {
    return (BindingContainer)resolveExpression("#{bindings}");
  }
 
  /**
   * 获取当前页面对应的DCBindingContainer
   * @return 当前页面对应的DCBindingContainer
   */
  public DCBindingContainer getDCBindingContainer() {
    return (DCBindingContainer)getBindingContainer();
  }
 
  /**
   * 在当前的DCBindingContainer中获取OperationBinding
   * @param name 待获取的OperationBinding名称
   * @return OperationBinding对象
   */
  public OperationBinding findOperation(String name) {
    OperationBinding operationBinding =
      getDCBindingContainer().getOperationBinding(name);
    if (operationBinding == null) {
      throw new HadfException("Operation '" + name + "' not found");
    }
    return operationBinding;
  }
 
  /**
   * 在当前BindingContainer中查找Iterator Binding
   * @param iteratorName Iterator名称
   * @return Iterator Binding
   */
  public DCIteratorBinding findIterator(String iteratorName) {
    DCIteratorBinding iter =
      getDCBindingContainer().findIteratorBinding(iteratorName);
    if (iter == null) {
      throw new HadfException("Iterator '" + iteratorName + "' not found");
    }
    return iter;
  }
 
  /**
   * 获取当前页面绑定文件中指定属性的绑定值
   * @param attributeName 属性名称
   * @return 该属性的值
   */
  public Object getBoundAttributeValue(String attributeName) {
    return findControlBinding(attributeName).getInputValue();
  }
 
 
  /**
   * 为当前页面绑定中的指定属性设值
   * @param attributeName 属性名称
   * @param value 属性值
   */
  public void setBoundAttributeValue(String attributeName, Object value) {
    findControlBinding(attributeName).setInputValue(value);
  }
 
 
  /**
   * 根据属性名查找该属性对应的绑定
   * @param attributeName 属性名称
   * @return 属性绑定
   */
  public AttributeBinding findControlBinding(String attributeName) {
    return findControlBinding(getBindingContainer(), attributeName);
  }
 
 
 
  private AttributeBinding findControlBinding(BindingContainer bindingContainer,
                                              String attributeName) {
    if (attributeName != null) {
      if (bindingContainer != null) {
        ControlBinding ctrlBinding =
          bindingContainer.getControlBinding(attributeName);
        if (ctrlBinding instanceof AttributeBinding) {
          return (AttributeBinding)ctrlBinding;
        }
      }
    }
    return null;
  }
}

使用这样的一个Backingbean的基类,可以大大简化应用的开发,另外,随着应用开发经验的积累和实际需求,也可不断扩展该基类:)

相关文章:

  1. 通过Accessor来取得相关的实体
  2. 通过代码获取AM的实例
  3. AM中用代码创建ViewCriteria进行查询
  4. 获取AM指定的JDBC Datasource
  5. 用代码实现页面Action跳转
  6. 在Groovy中调用ViewImpl与ViewRowImpl的方法
  7. ADF应用程序中创建和恢复保存点
  8. MyEclipse7下安装插件
  9. 使用clientlistener和serverlistener刷新InlineFrame
  10. 在ADF中使用AutoSuggest

2 responses to 为Backingbean创建基类

  1. 值得学习学习

  2. 支持支持支持

Leave a reply

You must be logged in to post a comment.