Как динамически создать форму редактирования бина - PullRequest
3 голосов
/ 10 августа 2011

Мне нужно построить форму, динамически помещая поле 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)}

, чтобы получить значение поля компонента.Код выше работает хорошо, если он используется только для просмотра страницы.но не при отправке формы, потому что невозможно установить значение поля по имени поля.Есть ли способ преодолеть проблему?Есть ли общий способ динамически создать форму редактирования бина?

1 Ответ

2 голосов
/ 10 августа 2011

Свяжите его со свойством 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>

Имя поля становится ключом карты, а значение поля становится значением карты.

...