在popupPanel中选择extendedDataTable不在Ajax请求参数中
我有一个JSF页面,其中包含来自Richfaces的模式popupPanel,在这个popupPanel中是一个extendedDataTable。现在,每当用户选择新行时,我希望在我的bean中有用户选择。首先我想展示代码,然后我会解释问题 包含popupPanel和extendedDatatable的xhtml页面的一部分:在popupPanel中选择extendedDataTable不在Ajax请求参数中,ajax,jsf,datatable,request,richfaces,Ajax,Jsf,Datatable,Request,Richfaces,我有一个JSF页面,其中包含来自Richfaces的模式popupPanel,在这个popupPanel中是一个extendedDataTable。现在,每当用户选择新行时,我希望在我的bean中有用户选择。首先我想展示代码,然后我会解释问题 包含popupPanel和extendedDatatable的xhtml页面的一部分: <rich:popupPanel id="kontaktPanel" modal="true" onmaskclick="#{rich:component('ko
<rich:popupPanel id="kontaktPanel" modal="true" onmaskclick="#{rich:component('kontaktPanel')}.hide()">
<rich:extendedDataTable
value="#{nachfrageBean.loadedKontakte}" var="kontakt"
selection="#{nachfrageBean.selection}" id="kontaktTable">
<rich:column>
<f:facet name="header">
<h:outputText value="#{messages['tabelle.kontakt.instknz']}" />
</f:facet>
<h:outputText value="#{kontakt.instKnz}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="#{messages['tabelle.kontakt.name']}" />
</f:facet>
<h:outputText value="#{kontakt.name}" />
</rich:column>
<a4j:ajax execute="kontaktTable kontaktPanel" event="selectionchange" listener="#{nachfrageBean.selectedRecord}" />
</rich:extendedDataTable>
</rich:popupPanel>
public class NachfrageBean {
private KontaktDTO kontakt;
private List<KontaktDTO> loadedKontakte = new ArrayList<KontaktDTO>();
/** DOCUMENT ME! */
private Collection<Object> selection;
public Collection<Object> getSelection() {
return selection;
}
public void setSelection( Collection<Object> selection ) {
this.selection = selection;
}
public List<KontaktDTO> getLoadedKontakte() {
//contacts are successfully loaded
return kontaktBusiness.getAllKontakte( );
}
public KontaktDTO getKontakt() {
return kontakt;
}
public void setKontakt( KontaktDTO kontakt ) {
this.kontakt = kontakt;
}
public void selectedRecord( AjaxBehaviorEvent event ) {
UIExtendedDataTable dataTable = ( UIExtendedDataTable )event.getComponent();
Object originalKey = dataTable.getRowKey();
for( Object selectionKey : selection ) {
dataTable.setRowKey( selectionKey );
if( dataTable.isRowAvailable() ) {
// do something with the selection
}
}
dataTable.setRowKey( originalKey );
}
}
与侦听器和所需成员对应的bean:
<rich:popupPanel id="kontaktPanel" modal="true" onmaskclick="#{rich:component('kontaktPanel')}.hide()">
<rich:extendedDataTable
value="#{nachfrageBean.loadedKontakte}" var="kontakt"
selection="#{nachfrageBean.selection}" id="kontaktTable">
<rich:column>
<f:facet name="header">
<h:outputText value="#{messages['tabelle.kontakt.instknz']}" />
</f:facet>
<h:outputText value="#{kontakt.instKnz}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="#{messages['tabelle.kontakt.name']}" />
</f:facet>
<h:outputText value="#{kontakt.name}" />
</rich:column>
<a4j:ajax execute="kontaktTable kontaktPanel" event="selectionchange" listener="#{nachfrageBean.selectedRecord}" />
</rich:extendedDataTable>
</rich:popupPanel>
public class NachfrageBean {
private KontaktDTO kontakt;
private List<KontaktDTO> loadedKontakte = new ArrayList<KontaktDTO>();
/** DOCUMENT ME! */
private Collection<Object> selection;
public Collection<Object> getSelection() {
return selection;
}
public void setSelection( Collection<Object> selection ) {
this.selection = selection;
}
public List<KontaktDTO> getLoadedKontakte() {
//contacts are successfully loaded
return kontaktBusiness.getAllKontakte( );
}
public KontaktDTO getKontakt() {
return kontakt;
}
public void setKontakt( KontaktDTO kontakt ) {
this.kontakt = kontakt;
}
public void selectedRecord( AjaxBehaviorEvent event ) {
UIExtendedDataTable dataTable = ( UIExtendedDataTable )event.getComponent();
Object originalKey = dataTable.getRowKey();
for( Object selectionKey : selection ) {
dataTable.setRowKey( selectionKey );
if( dataTable.isRowAvailable() ) {
// do something with the selection
}
}
dataTable.setRowKey( originalKey );
}
}
公共类NachfrageBean{
私人康塔克托康塔克特;
私有列表loadedKontakte=newArrayList();
/**记录我*/
私人收藏选择;
公共集合getSelection(){
返回选择;
}
公开选举(集合选择){
this.selection=选择;
}
公共列表getLoadedKontakte(){
//联系人已成功加载
return kontaktBusiness.getAllKontakte();
}
公共空塔克托-格特空塔克特(){
返回康塔克;
}
公共无效设置空塔(空塔至空塔){
this.kontakt=kontakt;
}
public void selectedRecord(AjaxBehaviorEvent事件){
UIExtendedDataTable=(UIExtendedDataTable)事件。getComponent();
Object originalKey=dataTable.getRowKey();
用于(对象选择键:选择){
dataTable.setRowKey(selectionKey);
if(dataTable.isRowAvailable()){
//对选择做些什么
}
}
dataTable.setRowKey(originalKey);
}
}
当用户选择datatable中的一行时,侦听器被成功调用,但选择为null,因此我得到了一个NPE。当我删除popupPanel并将extendedDatatable直接放在我的页面中时,它就可以正常工作了。我总是打印出请求参数,当我在pupupanel中有datatable时,我可以看到有两个缺少的参数。这些请求参数是:
- 主要表格:Kontaktable:wi=
- 主要形式:kontaktable:si=3,3 | 3 | x