Как Динамично добавить строку в таблице в JSF?

В моем приложении я должен добавить строку при щелчке кнопки, и эта кнопка будет во всех строках. Нуждаетесь в помощи, чтобы сделать это?

Класс объекта

public class Item {
 public Item()
{

}
private String value;
public Item(String value) { this.value = value; }
public void setValue(String value) { this.value = value; }
public String getValue() { return value; }
}

Управляйте классом компонента

public class MyMB 
{
private List<Item> list;    

public void addItem() { // JSF action method
    list.add(new Item("Default"));
    Iterator<Item> iterator = list.iterator();
    while(iterator.hasNext())
    {
        Item item = (Item)iterator.next();
        System.out.println(item.getValue());
    }
    System.out.println();
    }
/**
 * @return the list
 */
public List<Item> getList() {
    if(list==null)
    {
        loadList();
    }
    return list;
}
private void loadList() {
    list = new ArrayList<Item>();
    list.add(new Item("Data"));
}

}

Код JSF

<h:form>
   <rich:dataTable value="#{myMB.list}" var="item" id="tabel">
    <h:column><h:inputText value="#{item.value}" /></h:column>
    <h:column><a4j:commandButton value="Add"  actionListener="#{myMB.addItem}" reRender="tabel"/></h:column>

7
задан Tiny 10 March 2015 в 11:31
поделиться

2 ответа

Все, что вам нужно сделать, это просто добавить пустой объект в модель данных за атрибутом value h: dataTable .

Но такая же пустая строка должна быть сохранена и в последующем запросе. Если компонент поддержки имеет область действия запроса, то модель данных будет перезагружена без пустой строки. Все это должно работать, когда bean-компонент имеет область видимости сеанса.

Кроме того, в вашем коде JSF есть несколько ошибок. Атрибут h: dataTable var отсутствует, и содержимое столбца должно находиться внутри h: column .

<h:form>
    <h:dataTable value="#{bean.list}" var="item">
        <h:column><h:inputText value="#{item.value}" /></h:column>
    </h:dataTable>
    <h:commandButton value="Add" action="#{bean.add}"/>
</h:form>

Компонент сеанса или представления может выглядеть следующим образом:

public class Bean {
    private List<Item> list;

    public Bean() {
        list = new ArrayList<Item>();
    }

    public void add() {
        list.add(new Item());
    }

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

Класс Item , конечно, должен иметь конструктор по умолчанию без аргументов. Обычно это уже неявно доступно, но если вы определяете свой собственный конструктор с аргументами, он больше не доступен. Вам нужно будет явно определить его, иначе вы больше не сможете выполнять Item item = new Item (); .

public class Item {

    private String value;

    public Item() {
        // Keep default constructor alive.
    }

    public Item(String value) {
        this.value = value;
    }

    // ...
}

Если вы предпочитаете хранить компонент в области запроса , тогда вам необходимо поддерживать количество вновь добавленных элементов, чтобы компонент мог сохранять такое же количество при загрузке.

public class Bean {
    private List<Item> list;
    private HtmlInputHidden count = new HtmlInputHidden();

    public Bean() {
        count.setValue(0);
    }

    public void add() {
        list.add(new Item());
    }

    public List<Item> getList() {
        if (list == null) loadList();
        return list;
    }

    public HtmlInputHidden getCount() {
        return count;
    }

    public void setCount(HtmlInputHidden count) {
        this.count = count;
    }

    private void loadList() {
        list = new ArrayList<Item>();

        // Preserve list with newly added items.
        for (int i = 0; i < (Integer) count.getValue(); i++) {
            list.add(new Item());
        }
    }
}

Вам нужно только добавить следующее в страницы JSF:

<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" />

Для получения дополнительных сведений об использовании таблиц данных любым способом, эта статья может оказаться полезной: Использование таблиц данных . Он также содержит файл WAR с множеством примеров как для запроса, так и для сеанса.

9
ответ дан 6 December 2019 в 23:04
поделиться

Возьмите эту таблицу в качестве примера:

<h:datatable value="#{myBean.list}" ...>
    ...
    <h:column>
       <h:commandButton value="Add a row" action="#{myBean.addRow}"/>
    </h:column>
</h:datatable>

Метод myBean.addRow просто добавит новый элемент в ваш список:

public class MyBean {

    private List<SomeClass> list;

    ...

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

    public void addRow() {
        list.add(new SomeClass());
    }
}

Когда вы нажмете кнопку, метод addRow добавит новый элемент в список . Страница обновится и отобразит таблицу с новой строкой.

Редактировать:

Что касается вашего выпуска сообщения, три вещи:

Пункт 1: Не могли бы вы прикрепить трассировку стека вашей ошибки?

Пункт 2: Ваш метод addRow возвращает Строка , которая представляет собой идентификатор, используемый JSF для навигации. Поскольку это действие не связано с навигацией (т.е. пользователь остается на той же странице), просто верните null или "" :

public String addRow() {
    list.add(new Item("new data"));
    return null;
}

Пункт 3: Я предлагаю, чтобы ваш класс Элемент предоставляет пустой конструктор (в дополнение к вашему текущему конструктору):

public Item() {
}
2
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: