Как сохранить список / карту / набор в JSF с помощью h: inputText + управляемого компонента - PullRequest
1 голос
/ 31 августа 2011

То, чего я пытаюсь достичь, очень похоже на то, что опубликовано в следующей ссылке.

Как сохранить массив в 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 сможет пролить свет в нужном мне направлении.

1 Ответ

6 голосов
/ 31 августа 2011

Просто добавьте кнопку «Добавить», которая добавляет новый String в список.

<ui:repeat value="#{myBean.choices}" varStatus="status">            
    <h:inputText value="#{myBean.choices[status.index]}" />
</ui:repeat>
<h:inputText value="#{myBean.newChoice}" />
<h:commandButton value="Add" action="#{myBean.add}" />
<h:commandButton value="Save" action="#{myBean.save}" />

с

private String newChoice;

public void add() {
    choices.add(newChoice);
    newChoice = null;
}

// ...

Обратите внимание, что это работает, только если бин помещен впросмотреть объем.Запрос в одной области будет создаваться при каждом запросе, и, таким образом, каждый раз пересматривать список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...