如何使用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; } }