如何使用JSF 2.0复合组件实现dynamic列表?

我问了这个问题,尽pipe答案直接满足了我的需求,但我还是有一种感觉,就是对这个问题有一个更简单的解决scheme。

我想有一个复合组件接受项目列表(商定的项目的types,以便成员可以在复合组件中自由使用)

CC(复合组件)显示项目列表并允许项目的增加和减less。

我想以最简单和有效的方式做到这一点。

为了说明这个问题,举个例子:

在这里输入图像描述

定义应该相当简单(当然,除非:-)):

<special:dynamicFieldList value="#{bean.fieldList} /> 

Field对象最抽象的forms是:

 public class Field{ String uuid; String value; } 

我想就是这样。 你将如何以简单的方式实现这个?

谢谢!

我会在一个复合组件中使用一个<h:dataTable>和一个可以通过<composite:interface> componentType属性绑定的UIComponent 。 在后台UIComponent您可以维护DataModel并定义操作。

dynamicFieldList.xhtml

 <ui:composition xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:cc="http://java.sun.com/jsf/composite" > <cc:interface componentType="dynamicFieldList"> <cc:attribute name="value" type="java.util.List" required="true" /> </cc:interface> <cc:implementation> <h:dataTable id="table" binding="#{cc.table}" value="#{cc.attrs.value}" var="field"> <h:column><h:outputLabel value="#{field.label}" /></h:column> <h:column><h:inputText value="#{field.value}" /></h:column> <h:column><h:commandButton value="remove" action="#{cc.remove}" /></h:column> </h:dataTable> <h:commandButton value="add" action="#{cc.add}" /> </cc:implementation> </ui:composition> 

(如果需要, <h:inputText>可以是您的复合字段组件)

com.example.DynamicFieldList

 @FacesComponent(value="dynamicFieldList") // To be specified in componentType attribute. @SuppressWarnings({"rawtypes", "unchecked"}) // We don't care about the actual model item type anyway. public class DynamicFieldList extends UINamingContainer { private UIData table; public void add() { ((List) getAttributes().get("value")).add(new Field("somelabel")); } public void remove() { ((List) getAttributes().get("value")).remove(table.getRowData()); } public UIData getTable() { return table; } public void setTable(UIData table) { this.table = table; } } 

使用它如下:

 <h:form> <my:dynamicFieldList value="#{bean.fields}" /> </h:form> 

与此同时

 @ManagedBean @ViewScoped public class Bean implements Serializable { private List<Field> fields; public Bean() { fields = new ArrayList<>(); } public List<Field> getFields() { return fields; } } 

 public class Field implements Serializable { private String label; private String value; public Field() { // } public Field(String label) { this.label = label; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }