Не пытайтесь поместить <p:ajax>
внутрь <p:dataTable>
.Это один из компонентов PrimeFaces, где вы объявляете связанные с Ajax атрибуты прямо в самом компоненте.
Вот пример из документации PrimeFaces:
<p:dataTable
var="car"
value="#{carBean.cars}"
selectionMode="single"
selection="#{carBean.selectedCar}"
onRowSelectUpdate="carListForm:dialogContent"
rowSelectListener="#{carBean.onCarSelect}">
...columns
</p:dataTable>
Посмотрите, как rowSelectListener
атрибут объявлен прямо внутри <p:dataTable>
?
Ошибка, которую вы получили: Родитель не является экземпляром ClientBehaviorHolder
Это означает, что родительский тег не может содержатьAjax-тегПриведенный выше пример взят из документации по PrimeFaces 2.2, но я считаю, что версия 3.0 похожа.
РЕДАКТИРОВАТЬ:
Моя ошибка!Я ответил из дома и не имел доступа к своему коду, который использует PrimeFaces 3.0.В PF 3.0 (в отличие от PF 2.2) вы можете встроить элемент <p:ajax>
.Вот пример кода, который работает для меня:
<p:dataTable
id="myDataTable"
value="#{myBean.rowObjectList}
var="rowObject"
selection="#{myBean.selectedRowObject}"
selectionMode="single">
<p:ajax
event="rowSelect"
listener="#{myBean.onRowSelect}"
update="someElement" />
<p:ajax
event="rowUnselect"
listener="#{myBean.onRowUnselect}"
update="someElement" />
</p:dataTable>
Вот мои сигнатуры методов слушателя:
public void onRowSelect(SelectEvent event) {
// your code here...
}
public void onRowUnselect(UnselectEvent event) {
// your code here...
}
Я не знаю достаточно о вашем веб-приложении, чтобы понять, как происходит ваше перенаправлениедолжен работать, но я также дам вам пример кода, который я использую в своем веб-приложении после того, как пользователь нажмет кнопку «Выйти» и перенаправлю их на страницу «Вы вышли из системы».Этот код вызывается из метода действия.
FacesContext ctx = FacesContext.getCurrentInstance();
ExternalContext ectx = ctx.getExternalContext();
ServletContext sc = (ServletContext) ectx.getContext();
ectx.redirect("http://somedomain.org/somepage.html");