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

В базе данных postgres у меня есть таблица, среди прочего, с полем int [].

В моей модели у меня есть постоянный компонент, который отображает таблицу, включая поле int [].В этом классе я реализовал все необходимые сеттеры / геттеры.

Теперь у меня есть управляемый компонент, который также играет роль контроллера и связан с компонентом модели.Итак, в моем xhtml я пытаюсь сделать это:

<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
    <h:inputText value="#{baseNumber}"/>
</ui:repeat>

baseSetList это массив int [].

Проблема в том, что при отправке формы только этот элемент не обновляется.Инициализация работает, вызывается геттер, но не сохраняется, так что это должно быть обязательным.Короче говоря, я попытался заменить массив int [] на ArrayList пользовательского класса, который может обернуть int (как записываемое целое число), но он не работает.

Может быть, это повторениене связывает должным образом, я действительно не знаю.Это мой первый проект в Java после многих лет PHP:).

Ответы [ 2 ]

10 голосов
/ 10 марта 2011

Если editableBaseSetList - это int [], то baseNumber - это int. Теперь вы связываете компонент ввода текста с этим int.

Однако эта привязка не является двунаправленной. Элемент input может видеть только элемент, к которому вы привязываете, а не коллекцию, из которой он происходит. Таким образом, он не знает, как обновить эту коллекцию.

Таким образом, вам нужно привязать что-то, что можно обновить. Например, если ваш список содержит IntHolder с getter и setter для внутреннего целого числа (скажем, getInt () и setInt ()), и список будет ArrayList, который вы используете:

<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
    <h:inputText value="#{baseNumber.int}"/>
</ui:repeat>

После обратной передачи JSF вызовет метод setInt () для каждого IntHolder в списке с предоставленными значениями.

Для коллекции, которая уже содержит целые числа или другие неизменяемые типы, преобразование ее в такую ​​коллекцию, упомянутую выше, может быть затруднительным. Однако есть и другое решение. Там вы не используете var атрибут ui:repeat, но используете его индекс. Затем вы присваиваете h:inputText привязку к коллекции, проиндексированной этим индексом var.

1017 * Е.Г. *

Предположим, у вас есть следующий компонент:

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class RepeatBean {

    List<Integer> list;

    public List<Integer> getList() {
        return list;
    }

    @PostConstruct
    public void initList() {
        list = new ArrayList<Integer>();
        list.add(10);
        list.add(20);
        list.add(30);
    }

    public String save() {
        // list now contains the values provided by the user.
        return "";

    }

}

Используется на следующем Facelet:

<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="#{repeatBean.list}" varStatus="status">            
                <h:inputText value="#{repeatBean.list[status.index]}" />
            </ui:repeat>
            <h:commandButton value="Save" action="#{repeatBean.save}" />
        </h:form>

    </h:body>
</html>

Первоначально на вашем экране будет отображаться 10 20 30. Когда вы измените числа и нажмете «Сохранить», вы можете проверить, например, с помощью точка останова, что переменная экземпляра списка содержит обновленные числа.

2 голосов
/ 10 марта 2011

Не знаю, правильно ли я вас понял, но baseNumber не связан ни с одним свойством какого-либо управляемого компонента.Он существует только в области ui:repeat.

. Вы должны сделать что-то вроде:

<ui:repeat value="#{editableBaseSetList}" var="myVariable">
    <h:inputText value="#{managedBean.property}" />
</ui:repeat>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...