jsf-2 - 在 JSF 中,如何在不初始化 block 或构造函数的情况下在可编辑数据表中列出

标签 jsf-2 datatable primefaces

在我的应用程序中,我使用 primefaces 可编辑数据表,需要根据请求参数(blkcode)动态呈现那些 List(cmFieldsList) 值。

如果我在构造函数中初始化列表,我可以编辑和保存数据表对象。
对于我的应用程序,每次需要基于请求参数的动态列表时,因此如果没有在构造函数中初始化,我就无法在我的数据表中编辑或保存数据。
如果我尝试在不初始化的情况下编辑相同的内容,则会收到如下异常

Caused by: java.lang.IllegalArgumentException: row is unavailable at javax.faces.model.ListDataModel.getRowData(ListDataModel.java:69) at javax.faces.component.UIData.getRowData(UIData.java:433) at org.primefaces.component.datatable.DataTable.queueEvent(DataTable.java:522) at org.primefaces.component.behavior.ajax.AjaxBehaviorRenderer.decode(AjaxBehaviorRenderer.java:42) at javax.faces.component.behavior.ClientBehaviorBase.decode(ClientBehaviorBase.java:64) at org.primefaces.renderkit.CoreRenderer.decodeBehaviors(CoreRenderer.java:329) at org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:57)



所以没有在构造函数中初始化我怎么能做到这一点。

我的 JSF 托管 Bean 代码是
package com.dynamic.mbeans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;

import com.dynamic.model.CmFields;
import com.dynamic.services.CmFieldService;

@ManagedBean(name="cmFieldListBean")
@RequestScoped
public class CmFieldController implements Serializable  {

private static final long serialVersionUID = 6250736369064467010L;

private CmFields cmFields;
private List<CmFields> cmFieldsList;
@ManagedProperty(value="#{param.blkCode}")
public String blkCode;

public CmFieldController(){
    cmFields= new CmFields();
    //cmFieldsList= new ArrayList<CmFields>();
    //cmFieldsList.add(cmFields); 
}

@ManagedProperty("#{cmFieldService}")
private CmFieldService cmFieldService;

public String showForms(){
    System.out.println("blkCode =="+blkCode);
    cmFieldsList = cmFieldService.listAllCmField(blkCode);//lists CmFields from DB
    return "dynamic-cmfields-form";
}

public void onEdit(RowEditEvent event) {
    System.out.println("event started");
    System.out.println("event ended");
   // FacesMessage msg = new FacesMessage("CmFields Edited", ((CmFields) event.getObject()).getBlkCode() );  

   //FacesContext.getCurrentInstance().addMessage(null, msg);  
}  

public void onCancel(RowEditEvent event) {  
    FacesMessage msg = new FacesMessage("CmFields Cancelled", ((CmFields) event.getObject()).getBlkCode());  

    FacesContext.getCurrentInstance().addMessage(null, msg);  
}  

public CmFields getCmFields() {
    return cmFields;
}

public void setCmFields(CmFields cmFields) {
    this.cmFields = cmFields;
}

public CmFieldService getCmFieldService() {
    return cmFieldService;
}

public void setCmFieldService(CmFieldService cmFieldService) {
    this.cmFieldService = cmFieldService;
}

public List<CmFields> getCmFieldsList() {
    return cmFieldsList;
}

public void setCmFieldsList(List<CmFields> cmFieldsList) {
    this.cmFieldsList = cmFieldsList;
}

public String getBlkCode() {
    return blkCode;
}

public void setBlkCode(String blkCode) {
    this.blkCode = blkCode;
}


}

我将请求参数发送到托管 bean 的 JSF 代码是
 <h:form>
<h:commandLink action="#{cmFieldListBean.showForms}" value="LIST SALESMAN" >
<f:param name="blkCode" value="SALESMAN" />
 </h:commandLink>
 <br/>
 <br/>
 <h:commandLink action="#{cmFieldListBean.showForms}" value="LIST SALESMAN COMPANY" >
 <f:param name="blkCode" value="SALESMAN_COMP" />
 </h:commandLink>


 </h:form>

我在数据表中列出的 JSF 代码是
<h:form id="form">  

<p:growl id="messages" showDetail="true"/>  

<p:dataTable var="cmList" value="#{cmFieldListBean.cmFieldsList}" id="cmFieldsList" editable="true" preserveDataModel="false">  

    <f:facet name="header">  
       Grid Editing
    </f:facet>  

    <p:ajax event="rowEdit" listener="#{cmFieldListBean.onEdit}" update=":form:cmFieldsList" />  
    <p:ajax event="rowEditCancel" listener="#{cmFieldListBean.onCancel}" update=":form:cmFieldsList" />  

    <p:column headerText="Caption" style="width:200px">  
        <p:cellEditor>  
            <f:facet name="output">  
                <h:outputText value="#{cmList.fieldCaption}" />  
            </f:facet>  
            <f:facet name="input">  
                <p:inputText value="#{cmList.fieldCaption}" style="width:100%"/>  
            </f:facet>  
        </p:cellEditor>  
    </p:column>  

    <p:column headerText="Field Name" style="width:150px">  
        <p:cellEditor>  
            <f:facet name="output">  
                <h:outputText value="#{cmList.fieldName}" /> 
            </f:facet>  
            <f:facet name="input">  
                <p:inputText value="#{cmList.fieldName}" style="width:100%"/>    
            </f:facet>  
        </p:cellEditor>  
    </p:column>  
    <p:column headerText="Data Type" style="width:150px">  
        <p:cellEditor>  
            <f:facet name="output">  
                <h:outputText value="#{cmList.dataType}" /> 
            </f:facet>  
            <f:facet name="input">  
                <p:inputText value="#{cmList.dataType}" style="width:100%"/>    
            </f:facet>  
        </p:cellEditor>  
    </p:column>  


    <p:column headerText="Options" style="width:50px">  
        <p:rowEditor />  
    </p:column>  

</p:dataTable>  

最佳答案

将您的 bean 范围更改为 @ViewScoped : View 范围在很多情况下将用于数据表的支持,因为您不需要每次更改排序或过滤时都读取数据库中的数据。这当然是如果您要显示的记录列表不太长并在内存中一次读取它们。

关于jsf-2 - 在 JSF 中,如何在不初始化 block 或构造函数的情况下在可编辑数据表中列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12907954/

相关文章:

asp.net - 如何迭代DataTable中给定行中的所有项目

JSF PrimeFaces - 单击按钮时保存所选表格单元格的值

jsf - 无法在 Tomcat 7 中初始化 FacesServlet - ClassNotFoundException

html - 将 PDF 的第一页显示为图像

c# - 如何获取超网格的所有行甚至删除的行

javascript - 如何在数据表中创建可折叠列标题?

validation - 一起验证两个 inputText 字段时出错

java - 使用来自多个 selectOneMenus 和按钮的内容填充 inputTextArea

jsf - 从 bean 将 facet 添加到 primefaces 面板

primefaces - p :button to toggle inplace input