3

追加、フィルタリング、編集、削除、ページ付け機能を備えたCRUDPrimeFacesdataTableを作成したいと思います。PrimeFaces 3.4.2 dataTable、JSF 2.1を使用して、ダイアログ(つまりモーダルポップアップウィンドウ)に新しいレコードを「追加」しようとしています。

他のすべての操作は正常に機能していますが、add操作後にdataTableが正しく更新されていません。最初の追加操作後に正しく更新されます。その後、2行目を追加すると、dataTableが更新されますが、最初に追加された行が2回目に追加された行に置き換えられます。その後、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の投稿に関する解決策は私にとって貴重であるため、Mr.BalusCに言及しないと不完全です。

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同じではありません。ゲッターの名前とは異なるプロパティ名を使用したと思います)

于 2013-01-15T15:36:02.123 に答える
0

@PostConstructアノテーションは、NetBeansサンプルアプリケーションScrumToysに基づくinit()メソッドに使用されます。

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

PrimeFacesフォーラムの情報は、モデルのJavaコードの問題を特定するのにも役立ちました。

于 2013-01-21T07:34:49.500 に答える