Все, что вам нужно сделать - это просто добавить пустой объект в модель данных за атрибутом 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>
Сеанс или область видимости * bean-компонент может выглядеть следующим образом:
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());
}
}
}
Вам нужно всего лишь добавить следующее к <h:form>
страницы JSF:
<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" />
Для получения дополнительной информации об использовании таблиц данных любым способом вы можете найти эту статью полезной: Использование таблиц данных . Он также содержит файл WAR с множеством примеров как в запросе, так и в сеансе.