我有一个编辑屏幕,显示实体的一系列可编辑属性(字段)。并且这个字段列表是动态的,因为可以在没有任何代码更改的情况下从列表中添加/删除任何字段。我有一个这样的模型。
public class Property{
private String displayName;
private String value;
private int displayOrder;
//other props,getters,setters etc..
}
我的backingBean有这些属性的映射(出于其他原因,我们选择map作为数据结构)。
public class BackingBean{
private Map<String,Property> editableProps;
//other props,getters,setters etc..
}
问题在于迭代这个地图并为每个条目生成一个文本框。由于a4j:repeat(richfaces)没有遍历地图,我决定使用JSTL,代码片段看起来像这样,
<c:forEach items="${mybean.editableProps}"
var="item" >
<tr>
<td>
<c:out value="${item.value.displayName}"/>
</td>
<td>
<input type="text" value="${item.value.value}" />
</td>
</tr>
</c:forEach>
除了ui字段与bean属性的绑定不会自动发生之外,这将正常工作。如果我尝试在 c:forEach 中使用 h:inputText ,则组件不会被渲染。(猜猜jstl var不适用于jsf)。 是否有JSF方式完成所有这些(使用 hashmap )?这样就可以为地图中的每个条目生成一个文本框,对它的任何更改都会绑定到底层的java bean属性。?
答案 0 :(得分:0)
建议的代码可以在当前版本的JSF中使用。 但是,现在实现这一目标的一种更简单的方法是让你的bean成为一个地图。
@Component("prop")
public class PropertyBean extends HashMap<String, Property>{
public PropertyBean() {
this.put("prop1", property1);
this.put("prop2", property2);
}
}
在小面孔中
<h:outputText value="#{prop.prop1.displayName}" />
<h:outputText value="#{prop.prop1.value}" />