在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都继承于该类,其代码如下:
- /**
- * @(#)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的基类,可以大大简化应用的开发,另外,随着应用开发经验的积累和实际需求,也可不断扩展该基类。
转自:http://blog.csdn.net/ygj26/article/details/5915587