3

我需要构建一个动态放置 inputText 字段的表单,我正在使用以下代码:

<h:form>
    <c:forEach items="#{userBean.getFieldList()}"  var="field">
        <h:inputText value="#{userBean.getFieldValue(field.name)}" />                       
    </c:forEach> 
    <h:commandButton value="Login" action="#{userBean.loginAction}" />          
</h:form>

var 字段是元数据,不拥有字段值,仅拥有它们的属性。所以我用

#{userBean.getFieldValue(field.name)}

获取 bean 字段值。如果仅用于查看页面,则上面的代码效果很好。但不在表单提交上,因为无法按字段名称设置字段值。有没有办法解决这个问题?有没有一种通用的方法来动态构建一个 back bean 编辑表单?

4

1 回答 1

2

将其绑定到一个Map<String, Object>属性并使用大括号表示法[]作为动态映射键。

例如

private List<Field> fields; // +getter (no setter required)
private Map<String, Object> values; // +getter (no setter required)

public UserBean() {
    fields = populateItSomehow();
    values = new HashMap<String, Object>();
}

// ...

<h:form>
    <c:forEach items="#{userBean.fields}" var="field">
        <h:inputText value="#{userBean.values[field.name]}" />                       
    </c:forEach> 
    <h:commandButton value="Login" action="#{userBean.loginAction}" />          
</h:form>

字段名称成为映射键,字段值成为映射值。

于 2011-08-10T12:56:15.027 回答