【问题标题】:row editing is not working in datatable primefaces行编辑在数据表primefaces中不起作用
【发布时间】:2013-09-24 01:22:32
【问题描述】:

在编辑数据表值期间,屏幕和侦听器方法中的值不会更新。监听方法:

public void onEdit(RowEditEvent event) throws ClassNotFoundException, SQLException
{
    Employee e=(Employee) event.getObject();
    name=e.getName();
    department=e.getDepartment();
    salary=e.getSalary();
    place=e.getPlace();
          ......
           ..... update query
}

我只得到选定的对象及其值,而不是更新的值。

这是我的数据表 XHTML:

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

    <p:dataTable var="e" value="#{employees.eList}" id="elist1"
        editable="true">
        <f:facet name="header">
        In-Cell Editing
    </f:facet>

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

        <p:column headerText="name" style="width:30%">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{e.name}" />
                </f:facet>
                <f:facet name="input">
                    <h:inputText value="#{e.name}" style="width:100%" />
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="department" style="width:20%">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{e.department}" />
                </f:facet>
                <f:facet name="input">
                    <h:inputText value="#{e.department}" style="width:100%"
                        label="department" />
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="salary" style="width:20%">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{e.salary}" />
                </f:facet>
                <f:facet name="input">
                    <h:inputText value="#{e.salary}" style="width:100%" label="salary" />
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="place" style="width:20%">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{e.place}" />
                </f:facet>
                <f:facet name="input">
                    <h:inputText value="#{e.place}" style="width:100%" label="place" />
                </f:facet>
            </p:cellEditor>
        </p:column>



        <p:column style="width:6%">
            <p:rowEditor />
        </p:column>

    </p:dataTable>

</h:form>

这是我的托管 bean:

@ManagedBean(name = "employees")
@ViewScoped
public class UserData  
{
    // properties
    private String name;
    private String department;
    private String salary;
    private String place;
    private ArrayList<Employee> eList;
    private Employee selectedemp;



    private void clear()
    {
        name="";
        department="";
        salary="";
        place="";
    }

//returning all employees   
    public ArrayList<Employee> geteList() throws ClassNotFoundException, SQLException {
        Connection conn=DbConnection.connectFunc();
        Statement stmt=conn.createStatement();
        String sql="select * from employee";
        ResultSet rs=stmt.executeQuery(sql);
        eList=new ArrayList<Employee>();
        while(rs.next())
        {
            Employee emp=new Employee();
            emp.setName(rs.getString(2));
            emp.setDepartment(rs.getString(3));
            emp.setSalary(rs.getString(4));
            emp.setPlace(rs.getString(5));
            eList.add(emp);
        }
        return eList;
    }
public void onEdit(RowEditEvent event) throws ClassNotFoundException, SQLException
    {

    Employee e=(Employee) event.getObject();
     name=e.getName();
        System.out.println(name);
        department=e.getDepartment();
        System.out.println(department);
        salary=e.getSalary();
        System.out.println(salary);
        place=e.getPlace();
        System.out.println(place);

        Connection conn=DbConnection.connectFunc();
        Statement stmt=conn.createStatement();
        String sql="update employee set department='"+department+"',salary='"+salary+"',place='"+place+"'where name='"+name+"'";
        int i=stmt.executeUpdate(sql);
        if(i!=0)
        {
            FacesContext context=FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("updated  successfully"));
        }
        conn.close();
    }
//onCancel
    public void onCancel(RowEditEvent event)
    {

    }
...setter and getters

如果我使用视图范围,会出现以下异常:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.io.NotSerializableException: com.solv.datatable.UserData
    java.io.ObjectOutputStream.writeObject0(Unknown Source)
    java.io.ObjectOutputStream.writeObject(Unknown Source)
    java.util.HashMap.writeObject(Unknown Source)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    java.io.ObjectOutputStream.writeObject0(Unknown Source)
    java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    java.io.ObjectOutputStream.writeObject0(Unknown Source)
    java.io.ObjectOutputStream.writeArray(Unknown Source)
    java.io.ObjectOutputStream.writeObject0(Unknown Source)
    java.io.ObjectOutputStream.writeObject(Unknown Source)
    java.util.HashMap.writeObject(Unknown Source)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    java.io.ObjectOutputStream.writeObject0(Unknown Source)
    java.io.ObjectOutputStream.writeObject(Unknown Source)
    com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:325)
    com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:173)
    com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122)
    com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166)
    com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:419)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.26 logs.

【问题讨论】:

  • 您使用什么范围?也许您可以提供一些数据表代码?
  • @Darka 嗨,我添加了数据表代码

标签: jsf-2 primefaces primefaces-extensions


【解决方案1】:

您的 bean 必须实现接口 Serializable。这就是错误消息的内容

另一个问题是您总是通过 getEList 返回新列表。您可以在某种带有注释 @PostConstruct 的 init 方法中加载您的 ArayList。

@PostConstruct
public void init() {
       //code from getElist()...
}

你的 getter 应该是只返回 eList 的经典 getter。 通过这种方式,您可以在创建视图时加载列表。在您的情况下,每次更新都会再次加载列表,这是不好的做法。不要在 getter 中获取数据。编辑对您不起作用,因为您每次都返回一个新列表会丢失更新的值。

【讨论】:

  • 很好地纠正了异常......但我没有得到更新的值,仍然得到旧的值
  • 好的,再次:执行是否进入方法onEdit?你检查过这个吗?
  • 是的,它进入了 onEdit 方法,我的意思是,event.getObject() 方法返回未更新的旧对象
  • 我已经更新了我的答案。一开始我没有注意到问题出在你的 geteList() 上。
  • 很高兴能帮上忙。
【解决方案2】:

在你的

<p:ajax event="rowEdit" listener="#{employees.onEdit}"
            update=":form:messages" />

您只更新消息而不是数据表本身。试试这个:update=":form:messages, :form:elist1"。 这对我有用

【讨论】:

  • 我将代码更改为 但没有变化
  • 您使用什么范围?它是视图范围的bean吗?你做过调试吗?这个方法你输入还是不输入?
  • 我正在使用请求范围。我用您的代码更新了数据表组件,但它仍然无法正常工作..
  • 为什么使用请求范围而不是视图范围?你有具体原因吗?我建议的这个更新在请求范围内没有任何意义。
  • 我将范围更改为查看..但存在异常。我将异常和我的托管 bean 粘贴到我的问题中
【解决方案3】:

我认为你要么:

  • 需要在p:dataTable标签上定义rowKey属性。
  • 或者实现一个实现 SelectableDataModel 的数据模型(您将其输入数据表)。

rowKey 属性选项需要的工作量最少。例如: <p:dataTable var="e" value="#{employees.eList}" id="elist1" rowKey="#{e.name}" editable="true">

其中 e.name 是数据表中每个项目的标识符。它也应该是该对象的唯一值。 (像一个 id)

【讨论】:

  • 我不明白为什么他(或其他任何人)不应该使用视图范围 bean?
  • 是的,你是对的,再想想 viewscoped 应该没问题(从我的回答中删除)
【解决方案4】:

它可能对某人有所帮助。我有一个类似的问题,我在互联网上尝试了所有可能的事情。最终我放弃了,但后来不小心把它修好了。问题是我的 .xhtml 中使用了多个 并且由于某种原因没有传播更改。 希望它可以帮助某人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2012-11-19
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多