ADF:将UI类别与动态表单一起使用
默认情况下,每个视图对象都有一个预定义的类别“默认”。 我创建了三个新类别“名称”,“联系人”,“其他”,并为其分配了属性。 在此选项卡上,我们还可以为我们的类别定义标签和工具提示。 在“应用程序模块测试器”窗口中,它看起来像这样:
根据文档 , 动态表格和搜索表格应使用UI类别。 ADF Faces动态表单组件确实具有新的属性Category 。 该表格过滤VO的属性,仅显示指定类别的属性。 例如,如果我想显示“ 名称”类别的属性,则可以使用以下构造:
<dynamic:form value="#{bindings.VEmployeesIterator}" id="f3" category="Name"/>
因此,如果我们要分别显示不同的类别,则必须为每个类别使用<dynamic:form标记。 但是文档提供了一个非常有趣的句子“ 对于动态表单,每个类别的属性将出现在单独的选项卡中 ”。 我想我们应该自己实现此功能:)。 在这篇文章中,我将展示我们如何做到这一点
在我的视图对象的实现类中,我定义了一些API方法来获取视图对象的所有UI类别(默认类别除外):
public List<Category> getAttrCategries() { return getOrderedCategories(false, //except Default CategoryType.ATTRIBUTE, null); }
为了在页面上为每个UI分类绘制选项卡,我使用了以下jspx代码:
因此,在这种简单的构造中,我在navgationPane中使用forEach标签为每个类别绘制commandNavigationItem。 MainDynamicBean托管bean的Java代码如下所示:
//Currently selected tab private String selectedItem; //Getting categories list public List<Category> getCategoryList() { return (List<Category>) resolveExpression("#{bindings.VEmployeesIterator.viewObject.attrCategries}"); } //Just a setter public void setSelectedItem(String selectedItem) { this.selectedItem = selectedItem; } //Getting selected item public String getSelectedItem() { //If nothing is selected, then select the first one if (selectedItem == null) { List<Category> l = getCategoryList(); if (l.size()>0) selectedItem = l.get(0).getName(); } return selectedItem; } //Resolving EL expressions public static Object resolveExpression(String expression) { FacesContext facesContext = FacesContext.getCurrentInstance(); Application app = facesContext.getApplication(); ExpressionFactory elFactory = app.getExpressionFactory(); ELContext elContext = facesContext.getELContext(); ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class); return valueExp.getValue(elContext); }
最后,我使用以下构造绘制具有所选类别属性的动态表单:
<dynamic:form value="#{bindings.VEmployeesIterator}" id="f2" binding="#{MainDynamicBean.dynform}" forceRefresh="#{MainDynamicBean.needRefresh}"/>
和适当的一段Java代码:
private DynamicForm dynform; //Setter public void setDynform(DynamicForm dynform) { this.dynform = dynform; } //Getter public DynamicForm getDynform() { return dynform; } public Boolean getNeedRefresh() { //If selected category is not equal to dynform's category //then set needed category and refresh the dynamic form if (dynform.getCategory()!=getSelectedItem()) { this.dynform.setCategory(getSelectedItem()); return true; } else return false; }
作为我们工作的结果,我们得到了以下屏幕:
就这样!
您可以下载此帖子的示例应用程序 。
参考:来自ADF实践博客的JCG合作伙伴 Eugene Fedorenko的“ 动态使用UI类别”表单 。
翻译自: https://www.javacodegeeks.com/2012/04/adf-using-ui-categories-with-dynamic.html