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

| 我问了这个问题,尽管答案直接满足了我的需求,但我仍然感到必须针对此特定问题提供更简单的解决方案。 我希望有一个接受项目列表的复合组件(商定的项目类型,以便成员可以在复合组件内自由使用) CC(复合组件)显示项目列表,并允许添加和减去项目。 我想以最简单有效的方式做到这一点。 为了说明问题,举一个例子: 定义应该非常简单(当然,除非不是:-)):
<special:dynamicFieldList value=\"#{bean.fieldList} />
Field
对象的最抽象形式为:
public class Field{
 String uuid;
 String value;
}
我想就是这样。 您将如何以简单的方式实现这一目标? 谢谢!     
已邀请:
        我将在支持component4ѭ的复合组件中使用
<h:dataTable>
,您可以通过
<composite:interface>
componentType
属性进行绑定。然后,您可以在支持
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>
(如有必要,ѭ11可以是您的复合字段组件)
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;
    }

}
    

要回复问题请先登录注册