ADF11g-002:为Backingbean创建基类

在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的基类,可以大大简化应用的开发,另外,随着应用开发经验的积累和实际需求,也可不断扩展该基类。

 

本文转自Oracle Seeker:http://oracleseeker.com/2009/12/30/adf_hadf_backingbean_baseclass/

 

你可能感兴趣的:(oracle,String,null,iterator,binding)