如何解决如何使用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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。