为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的基类,可以大大简化应用的开发,另外,随着应用开发经验的积累和实际需求,也可不断扩展该基类:)
相关文章:
qi said on 十二月 10, 2010
值得学习学习
qi said on 十二月 10, 2010
支持支持支持