3

我想制作具有添加、过滤、编辑、删除、分页功能的 CRUD PrimeFaces 数据表。我正在尝试使用 PrimeFaces 3.4.2 dataTable、JSF 2.1 在对话(即模式弹出窗口)中“添加”新记录。

所有其他操作都运行良好,但添加操作后 dataTable 未正确更新。它在第一次添加操作后正确更新。之后我添加第二行数据表被更新,但首先添加的行被第二次添加的行替换。之后我添加了第 3 行,第 1 行已被第 3 行替换。在所有情况下,数据库表都得到了完美的更新。

来自 jsf 和托管 bean 的代码片段:

JSF 代码

<h:body>
<h:form id="form1">

            <h:messages id="messages1"/>
            <br/>

            <p:commandButton id="Addbtn" value="Add" oncomplete="AddDialog.show()" update=":addform"/>                
            <br/>

            <p:dataTable id="dtusers" value="#{userdataController.retrieveData()}" var="item" 
                         rows="8" paginator="true" emptyMessage="No Records Found" 
                         paginatorAlwaysVisible="false">

                <p:column style="width:150px" filterMatchMode="contains" filterBy ="#{item.id}">
                    <f:facet name="header"> Id </f:facet>
                    <h:outputText value="#{item.id}"/>
                </p:column>

                <p:column style="width:150px" filterMatchMode="contains" filterBy="#{item.name}">
                    <f:facet name="header"> Name </f:facet>
                    <h:outputText value="#{item.name}"/>
                </p:column>     

                <p:column style="width:150px">  
                    <p:commandButton id="editButton" update=":editform" oncomplete="EditDialog.show()" value="Edit">
                        <f:setPropertyActionListener value="#{item}" target="#{userdataController.selectedUser}"/>
                    </p:commandButton>                       
                </p:column>

                <p:column style="width:150px">  
                    <p:commandButton id="deleteButton" update=":deleteform" oncomplete="UserDialog.show()" value="Delete">
                        <f:setPropertyActionListener value="#{item}" target="#{userdataController.selectedUser}"/>
                    </p:commandButton>    
                </p:column>                 

            </p:dataTable>
        </h:form>   

 <p:dialog header="Add User Data" resizable="false" id="AddDialog" widgetVar="AddDialog" modal="true" showEffect="fade" hideEffect="fade" position="center" dynamic="true">
            <h:form id="addform">
                <p:outputPanel id="AddDisplay">

                    <p:panelGrid columns="2" >

                        <f:facet name="header">
                            Add Userdata
                        </f:facet>

                        <h:outputLabel for="Id" value="Enter Id:"/>
                        <p:inputText id="Id" value="#{userdataController.selected.id}" />

                        <h:outputLabel for="Name" value="Enter Name:"/>
                        <p:inputText id="Name" value="#{userdataController.selected.name}"/>

                        <p:commandButton  actionListener="#{userdataController.create}" update=":form1:dtusers :form1:messages1" value="Save" oncomplete="AddDialog.hide()" style="margin:0"/>                 

                    </p:panelGrid>
                </p:outputPanel>
            </h:form>
        </p:dialog> 
 </h:body>

Manaed Bean 代码片段

@ManagedBean(name = "userdataController")
    @SessionScoped
    public class UserdataController implements Serializable {

    private Userdata current;
    private DataModel items = null;
    @EJB
    private PrimeFacesDb.session.UserdataFacade ejbFacade;
    private int id;
    private String name;
    private Userdata SelectedUser;

    public UserdataController() {
   }
 //getters setters for id,name and SelectedUser

  private UserdataFacade getFacade() {
    return ejbFacade;
  }
  public List retrieveData() {
    List result = getFacade().findAll();
    return result;
  }

   public void create() {
    try {
        getFacade().create(current);
        JsfUtil.addSuccessMessage("Userdata created successfully");
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, "Persistence Error occured");
    }
  }
 }

PrimeFaces 论坛、NetBeans 示例代码和可编辑数据示例 (mastertheboss.com/primefaces/datatables-with-primefaces/…;) 中提供的信息帮助我创建了一个更好的可演示 CRUD 数据表,其中包含创建、过滤、编辑和删除功能。不提及 Mr.BalusC 将是不完整的,因为他对 JSF 2.x 帖子的评论和解决方案对我很有价值。

4

2 回答 2

1

您似乎缺少/误解了 Java 的面向对象的本质。您每次都在添加表单中重用相同的对象实例/引用。

基本上,您的流程如下:

List<Userdata> users = new ArrayList<Userdata>();
Userdata current = new Userdata();
current.setName("foo");
users.add(current);
current.setName("bar"); // Look, it's still the same instance! So the one in the list is also changed!
users.add(current); // It now contains 2 references of exactly the same instance!
current.setName("baz"); // Still the same reference!
users.add(current); // It now contains 3 references of exactly the same instance!
// ...

虽然你实际上应该做

List<Userdata> users = new ArrayList<Userdata>();
Userdata current = new Userdata();
current.setName("foo");
users.add(current);
current = new Userdata(); // New instance!
current.setName("bar");
users.add(current);
current = new Userdata(); // Another new instance!
current.setName("baz");
users.add(current);
// ...

因此,请相应地修复您的create()方法:

getFacade().create(current);
current = new Userdata();

(请注意,您的视图和模型彼此不完全匹配......selected并且current不一样,我假设您只是使用了与 getter 命名不同的属性名称)

于 2013-01-15T15:36:02.123 回答
0

@PostConstruct 注释用于 init() 方法,基于 NetBeans 示例应用程序 ScrumToys。

@PostConstruct public void init() { current = new Users(); }

PrimeFaces 论坛的信息也帮助我确定了模型中 java 代码中的问题。

于 2013-01-21T07:34:49.500 回答