Использование <ui: repeat> <h: inputText> в списке <String> не обновляет значения модели
Вот сценарий (упрощенный):
Существует bean (назовем его mrBean) членом и соответствующими геттерами/сеттерами:
private List<String> rootContext;
public void addContextItem() {
rootContext.add("");
}
Код JSF:
<h:form id="a_form">
<ui:repeat value="#{mrBean.stringList}" var="stringItem">
<h:inputText value="#{stringItem}" />
</ui:repeat>
<h:commandButton value="Add" action="#{mrBean.addContextItem}">
<f:ajax render="@form" execute="@form"></f:ajax>
</h:commandButton>
</h:form>
Проблема заключается в том, что при нажатии кнопки "Добавить" значения, введенные в <h:inputText/>, которые представляют строки в stringList, не выполняются.
Собственно, установщик mrBean.stringList (setStringList(List<String> stringList)) никогда не вызывается.
Любая идея, почему?
Некоторая информация -
Я использую MyFaces JSF 2.0 на Tomcat 6.
Ответы
Ответ 1
Класс String является неизменным и не имеет установки для значения. Геттер - это в основном метод Object#toString().
Вам нужно получить/установить значение непосредственно на List. Вы можете сделать это с помощью индекса списка, доступного <ui:repeat varStatus>.
<ui:repeat value="#{mrBean.stringList}" varStatus="loop">
<h:inputText value="#{mrBean.stringList[loop.index]}" />
</ui:repeat>
Вам также не нужен установщик для stringList. EL получит элемент List#get(index) и задает элемент List#add(index,item).