То, чего я пытаюсь достичь, очень похоже на то, что опубликовано в следующей ссылке.
Как сохранить массив в JSF с помощью пользовательского интерфейса: repeat + h: inputText + управляемого компонента?
Я особенно восхищен ответом Арджана Тиймса в приведенной выше ссылке, однако то, чего я хочу достичь, немного отличается. Рассмотрим следующие фрагменты кода.
Боб
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
@RequestScoped
@Named
public class MyBean {
List<String> choices;
public List<String> getChoices() {
return choices;
}
@PostConstruct
public void initChoices() {
choices= new ArrayList<String>();
}
public String save() {
// should save all the choices into some repository
return "";
}
}
и страница на лицевой стороне
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:body>
<h:form>
<ui:repeat value="#{myBean.choices}" varStatus="status">
<h:inputText value="#{myBean.choices[status.index]}" />
</ui:repeat>
<h:commandButton value="Save" action="#{myBean.save}" />
</h:form>
</h:body>
</html>
Дело в том, что это сработает, если у нас в начале будут какие-то начальные данные. А как насчет ситуаций, когда начальный список будет пустым?
Идеальное решение, которое я ищу, это иметь 1 ч: inputText для каждого выбора, а когда нажимается кнопка сохранения, все варианты в каждом h: inputText затем добавляются в список выбора. Я искал все выше и ниже, но, похоже, не могу найти никаких подсказок о том, как это можно сделать.
Если JSF 2 действительно не поддерживает это, я думаю, мне придется использовать уродливый способ только с одним h: inputText и использовать конвертер для преобразования в и из списка, но я все еще надеюсь, что идеал решение может быть найдено.
Надеюсь, кто-то из stackoverflow сможет пролить свет в нужном мне направлении.