Prime面临CRUD操作

时间:2011-11-22 12:14:35

标签: jsf primefaces crud

  

我正在尝试在表格中执行插入操作。我在数据表中显示退出记录,并且在选择每一行时,详细信息显示在dataTable下面的panelGrid中。当用户单击“新建”按钮时,将显示带有空白inputText框的panelGrid。用户提交新记录并刷新dataTable。

提交时,我收到错误:

2011年11月22日下午5:02:22 com.sun.faces.lifecycle.ProcessValidationsPhase执行 警告:参数错误:参数targetClass为null java.lang.NullPointerException:参数错误:参数targetClass为null

代码如下:

<p:outputPanel header="MyTable Records" rendered="true" id="panel_MyTable">         
    <p:dataTable id="table_MyTable" value="#{myBean.records}" var="dataMyTable" onRowSelectUpdate="details_MyTable" selection="#{myBean.currentRec}" update="submitButton">
         <p:column>
               <f:facet name="header">
                    <h:outputLabel value="Label 1" />
               </f:facet>
               <h:outputLabel value="#{dataMyTable.Field1}"/>
         </p:column>

         <p:column>
             <f:facet name="header">
                 <h:outputLabel value="Label 2" />
             </f:facet>
             <h:outputLabel value="#{dataMyTable.Field2}"/>
         </p:column>

         <f:facet name="footer">
               <p:commandButton value="New"  image="ui-icon ui-icon-add" actionListener="#{myBean.prepareForInsertAction}" update="details_myTable,submitButton" />
         </f:facet>
  </p:dataTable>
</p:outputPanel>



<h:panelGrid id="details_MyTable">
    <h:outputLabel value="Label 1"/>
        <p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field1 : myBean.currentRec.Field1}" />
        <h:outputLabel value="Label 2"/>
        <p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field2 : myBean.currentRec.Field2}" />
</h:panelGrid>

<p:commandButton id="submitButton" actionListener="#{myBean.createAction}" value="Submit" update="table_MyTable,details_MyTable" rendered="#{myBean.editMode ? true : false}"/>




@ManagedBean(name="myBean")
@ViewScoped
public class MyBean
{
    public static List<MYTABLE> records;
    MYTABLE currentRec;
    Boolean editMode=false;

    public MyBean(){
        records = MYTABLE_CRUD.getAllRecs();
        currentRec = new MYTABLE();
    }

    public void prepareForInsertAction(){
        newRec = new MYTABLE();
        editMode = true;
    }
    public void setCurrentRec(MYTABLE v_currentRec) {
        this.currentRec = v_currentRec;
        editMode = false;
    }

}

2 个答案:

答案 0 :(得分:2)

那些value属性不正确:

<p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field1 : myBean.currentRec.Field1}" />
<p:inputText readonly="#{myBean.editMode ? false : true}" value="#{myBean.editMode ? myBean.newRec.Field2 : myBean.currentRec.Field2}" />

可以检索这些值,但无法设置新值。以下语法将起作用:

<p:inputText readonly="#{!myBean.editMode}" value="#{myBean[myBean.editMode ? 'newRec' : 'currentRec'].Field1}" />
<p:inputText readonly="#{!myBean.editMode}" value="#{myBean[myBean.editMode ? 'newRec' : 'currentRec'].Field2}" />

(请注意,我也改进了readonly属性评估)

但更好的是在两种编辑模式中只使用一个相同的属性,并使用action方法中的编辑模式值来确定如何处理它:

<p:inputText readonly="#{!myBean.editMode}" value="#{myBean.rec.Field1}" />
<p:inputText readonly="#{!myBean.editMode}" value="#{myBean.rec.Field2}" />

与例如

private Record rec;

public void save() {
    if (editMode) {
        // Treat "rec" as "currentRec".
    } else {
        // Treat "rec" as "newRec".
    }
}

答案 1 :(得分:1)

拥有单个panelGrid,并使用它来查看表行数据,还可以根据panelGrid中inputTexts值的动态绑定来接受用户的新记录详细信息 造成了这个问题。所以,我开始使用两个panelGrids,一个用于查看现有的表行数据,另一个用于接受用户的新记录数据。