Вы можете использовать AJAX здесь, чтобы сделать partial submit
* данных вашей формы.Я приведу пример, используя встроенную поддержку JSF 2.0 AJAX и стандарт dataTable
, но идея аналогична для JSF 1.x (например, a4j) и dataGrid
:
Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:head/>
<h:body>
<h:form id="form">
<h:dataTable id="table" value="#{singleListSelectBean.items}" var="item">
<h:column>
#{item}
<h:inputText id="input" value="#{singleListSelectBean.value}" />
<f:ajax execute="input">
<h:commandButton value="Select" action="#{singleListSelectBean.select(item)}" />
</f:ajax>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
Bean:
@ManagedBean
@ViewScoped
public class SingleListSelectBean {
private List<String> items = Arrays.asList("a", "b", "c");
private String value;
public void select(String item) {
System.out.format("Selecting item %s with value %s.", item, value);
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public List<String> getItems() {
return items;
}
}
В данном случае тег <f:ajax>
применяет возможности Ajax ккомандная кнопка.Через атрибут execute
вы сообщаете ему, что должен обрабатываться только ввод компонента с идентификатором input
.
В контексте рендеринга каждой кнопки команды идентификатор input
преобразуется в другой фактический client ID
для каждого ряда.Например, form:table:0:input
для первого ряда, form:table:1:input
для второго ряда и так далее.Посредством этого выполняется частичная передача, и привязка единственного значения вашего компонента поддержки получает значение для строки, по которой щелкнул пользователь.
Обратите внимание, что в данном примере таблица не перерисовывается изначение будет «прилипать» к каждому входному текстовому компоненту.Это может создать иллюзию того, что ваш компонент поддержки связан с несколькими значениями, но это не случай.
(*) Хотя концептуально мы говорим о partial submit
конкретная реализация JSF (например, Mojarra) все еще может разместить всю форму и отфильтровать ее на стороне сервера.