在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都繼承於該類,其代碼如下:
/**<br /> * @(#)CustomManagedBean.java<br /> *<br /> * HAND Enterprise Solution Company.<br /> * All rights reserved<br /> *<br /> */<br />package hand.hadf.common.view.backing;</p><p>import hand.hadf.common.view.HadfException;</p><p>import javax.el.ELContext;<br />import javax.el.ExpressionFactory;<br />import javax.el.ValueExpression;</p><p>import javax.faces.application.Application;<br />import javax.faces.context.FacesContext;</p><p>import oracle.adf.model.binding.DCBindingContainer;</p><p>import oracle.adf.model.binding.DCIteratorBinding;</p><p>import oracle.binding.AttributeBinding;<br />import oracle.binding.BindingContainer;<br />import oracle.binding.ControlBinding;<br />import oracle.binding.OperationBinding;</p><p>/**<br /> * 所有基於HADF架構進行的應用開發的BackingBean的基類,即所有客戶化開發建立的BackingBean均繼承於該類,<br /> * 同時要求所有子類實現Serializable介面<br /> * @author Eleven.Xu Nov.26th, 2009<br /> * @version 1.0.0.0<br /> */<br />public class CustomManagedBean {</p><p> /**<br /> * 預設的構造器<br /> */<br /> public CustomManagedBean() {<br /> }</p><p> /**<br /> * 解析EL運算式,並返回匹配對象或建立出相應對象<br /> * @param expression 待解析的EL運算式<br /> * @return 匹配的受管對象<br /> */<br /> public Object resolveExpression(String expression) {<br /> FacesContext facesContext = getFacesContext();<br /> Application app = facesContext.getApplication();<br /> ExpressionFactory elFactory = app.getExpressionFactory();<br /> ELContext elContext = facesContext.getELContext();<br /> ValueExpression valueExp =<br /> elFactory.createValueExpression(elContext, expression, Object.class);<br /> return valueExp.getValue(elContext);<br /> }</p><p> /**<br /> * 擷取當前FacesContext對象<br /> */<br /> public FacesContext getFacesContext() {<br /> return FacesContext.getCurrentInstance();<br /> }</p><p> /**<br /> * 擷取當前頁面的BindingContainer對象<br /> * @return 當前頁面的BindingContainer對象<br /> */<br /> public BindingContainer getBindingContainer() {<br /> return (BindingContainer)resolveExpression("#{bindings}");<br /> }</p><p> /**<br /> * 擷取當前頁面對應的DCBindingContainer<br /> * @return 當前頁面對應的DCBindingContainer<br /> */<br /> public DCBindingContainer getDCBindingContainer() {<br /> return (DCBindingContainer)getBindingContainer();<br /> }</p><p> /**<br /> * 在當前的DCBindingContainer中擷取OperationBinding<br /> * @param name 待擷取的OperationBinding名稱<br /> * @return OperationBinding對象<br /> */<br /> public OperationBinding findOperation(String name) {<br /> OperationBinding operationBinding =<br /> getDCBindingContainer().getOperationBinding(name);<br /> if (operationBinding == null) {<br /> throw new HadfException("Operation '" + name + "' not found");<br /> }<br /> return operationBinding;<br /> }</p><p> /**<br /> * 在當前BindingContainer中尋找Iterator Binding<br /> * @param iteratorName Iterator名稱<br /> * @return Iterator Binding<br /> */<br /> public DCIteratorBinding findIterator(String iteratorName) {<br /> DCIteratorBinding iter =<br /> getDCBindingContainer().findIteratorBinding(iteratorName);<br /> if (iter == null) {<br /> throw new HadfException("Iterator '" + iteratorName + "' not found");<br /> }<br /> return iter;<br /> }</p><p> /**<br /> * 擷取當前頁面繫結檔案中指定屬性的綁定值<br /> * @param attributeName 屬性名稱<br /> * @return 該屬性的值<br /> */<br /> public Object getBoundAttributeValue(String attributeName) {<br /> return findControlBinding(attributeName).getInputValue();<br /> }</p><p> /**<br /> * 為當前頁面綁定中的指定屬性設值<br /> * @param attributeName 屬性名稱<br /> * @param value 屬性值<br /> */<br /> public void setBoundAttributeValue(String attributeName, Object value) {<br /> findControlBinding(attributeName).setInputValue(value);<br /> }</p><p> /**<br /> * 根據屬性名稱尋找該屬性對應的綁定<br /> * @param attributeName 屬性名稱<br /> * @return 屬性綁定<br /> */<br /> public AttributeBinding findControlBinding(String attributeName) {<br /> return findControlBinding(getBindingContainer(), attributeName);<br /> }</p><p> private AttributeBinding findControlBinding(BindingContainer bindingContainer,<br /> String attributeName) {<br /> if (attributeName != null) {<br /> if (bindingContainer != null) {<br /> ControlBinding ctrlBinding =<br /> bindingContainer.getControlBinding(attributeName);<br /> if (ctrlBinding instanceof AttributeBinding) {<br /> return (AttributeBinding)ctrlBinding;<br /> }<br /> }<br /> }<br /> return null;<br /> }<br />}
使用這樣的一個Backingbean的基類,可以大大簡化應用的開發,另外,隨著應用開發經驗的積累和實際需求,也可不斷擴充該基類:)
本文轉自Oracle Seeker:http://oracleseeker.com/2009/12/30/adf_hadf_backingbean_baseclass/