使用JSF绑定动态属性

时间:2010-09-20 13:37:25

标签: java jsf

我有一个编辑屏幕,显示实体的一系列可编辑属性(字段)。并且这个字段列表是动态的,因为可以在没有任何代码更改的情况下从列表中添加/删除任何字段。我有一个这样的模型。

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属性。?

1 个答案:

答案 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}" />