与primefaces相关的问题p:datatable与p:dialog结合使用

时间:2012-07-13 15:35:14

标签: dialog datatable primefaces

我花了好几个小时来解决我的问题,但不幸的是没有成功。

我将用户数据显示在p:datatable中正常工作。每行都有一个p:commandbutton,它应该显示一个用于编辑所选用户的p:对话框。这也很好。问题是对话框中的fiedls没有填充用户数据。

奇怪的是,如果我从对话框中删除所有p:inputtext字段,则剩余的h:outputtext字段id =“edit_dlg_bngrp”和id =“edit_dlg_username”显示数据。如果我更换它们,将显示数据。

我的xhtml页面

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:sec="http://www.springframework.org/security/facelets/tags">
<h:body>

<ui:composition template="../template/commonTemplate.xhtml">
    <ui:define name="body">

        <h:form id="formTable">
            <div class="largeText alignLeft"
                style="min-width:600px; width: 100%; margin: 0 auto;">

                <p:panel header="Benutzerübersicht" styleClass="largeText" >  

                    <!-- ERROR MESSAGES -->
                    <div class="largeText alignLeft" style="width: 600px;">
                        <p:messages id="messages" />
                    </div>

                    <div style="height: 10px;">
                    </div>


                    <!-- ========================================================================= -->
                    <!-- =======================DATATABLE USER OVERVIEW ========================== -->
                    <!-- ========================================================================= -->

                    <p:dataTable var="user" 
                                 widgetVar="userTable" 
                                 value="#{benutzerBean.userTableData}"
                                 filteredValue="#{benutzerBean.filteredTableData}"
                                 emptyMessage="Keine Daten verfügbar"
                                 paginator="true" rows="25"  
                                     paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"  
                                     rowsPerPageTemplate="25,50,100" 

                                     >

                            <f:facet name="header" style="background:white;">  
                                <p:outputPanel style="background:white;" >


                                    <div class="floatRight" >
                                        <h:outputText value="Suche:  " />  
                                        <p:inputText id="globalFilter" onkeyup="userTable.filter()" style="width:150px" />
                                    </div>
                                </p:outputPanel>
                            </f:facet>

                            <p:column id="bngroup_id"  filterStyle="display:none"
                                      sortBy="#{user.benutzergruppe.name}" 
                                      filterBy="#{user.benutzergruppe.name}"   
                                      headerText="Benutzergruppe" 
                                      filterMatchMode="contains">
                                <h:outputLabel value="#{user.benutzergruppe.name}" />
                            </p:column>

                            <p:column id="firstname_id" filterStyle="display:none"
                                      sortBy="#{user.vorname}"
                                      filterBy="#{user.vorname}"   
                                      headerText="Vorname" 
                                      filterMatchMode="contains" >
                                <h:outputLabel value="#{user.vorname}" />
                            </p:column>

                            <p:column id="lastname_id" filterStyle="display:none"
                                      sortBy="#{user.nachname}"
                                      filterBy="#{user.nachname}"   
                                      headerText="Nachname" 
                                      filterMatchMode="contains" >
                                <h:outputLabel value="#{user.nachname}" />
                            </p:column>

                            <p:column id="username_id" filterStyle="display:none"
                                      sortBy="#{user.benutzername}" 
                                      filterBy="#{user.benutzername}" 
                                      headerText="Benutzername"   
                                      filterMatchMode="contains">
                                <h:outputLabel value="#{user.benutzername}" />
                            </p:column>

                            <p:column id="email_id" filterStyle="display:none"
                                      sortBy="#{user.email}"
                                      filterBy="#{user.email}"   
                                      headerText="E-mail" 
                                      filterMatchMode="contains" >  
                                <h:outputLabel value="#{user.email}" />
                            </p:column>

                            <p:column id="aktiv_id" filterStyle="display:none"
                                      sortBy="#{user.aktiv}"
                                      filterBy="#{user.aktiv}"   
                                      headerText="Aktiv" 
                                      filterMatchMode="contains" >
                                <h:outputLabel value="#{user.aktiv}" />
                            </p:column>

                            <p:column id="edit_id"
                                      style="width:80px;"
                                      styleClass="alignCenter" >

                                <p:commandButton value="bearbeiten"  update=":formTable:edit" oncomplete="editDialog.show()" style="font-size:10px;">
                                    <f:setPropertyActionListener target="#{benutzerBean.selectedUser}" value="#{user}" />
                                </p:commandButton>
                            </p:column>

                            <p:column id="delete_id"
                                      style="width:80px;"
                                      styleClass="alignCenter"  >
                                <p:commandButton value="löschen" update=":formTable:deleteUserdialog" oncomplete="deleteUserdialog.show()"  style="font-size:10px;">
                                    <f:setPropertyActionListener target="#{benutzerBean.selectedUser}" value="#{user}" />
                                </p:commandButton>
                            </p:column>
                    </p:dataTable>


                    <!-- ========================================================================= -->
                    <!-- =======================  EDIT USER DIALOG      ========================== -->
                    <!-- ========================================================================= -->

                    <p:dialog id="editUserDialog" header="Benutzer bearbeiten" widgetVar="editDialog" 
                              resizable="false" modal="true" showEffect="clip" hideEffect="clip" >
                        <p:panelGrid id="edit"  columns="2" style="width:400px;">

                                <h:outputText value="Benutzergruppe" />
                                <h:outputText id="edit_dlg_bngrp" value="#{benutzerBean.selectedUser.benutzergruppe.name}" />

                                <h:outputText value="Benutzername:" />
                                <h:outputText id="edit_dlg_username" value="#{benutzerBean.selectedUser.benutzername}" />

                                <h:outputText value="Vorname:" />
                                <p:inputText id="edit_dlg_firstname" styleClass="width_100" value="#{benutzerBean.selectedUser.vorname}" />

                                <h:outputText value="Nachname:" />
                                <p:inputText id="edit_dlg_lastname" styleClass="width_100" value="#{benutzerBean.selectedUser.nachname}"  />


                                <h:outputText value="Email" />
                                <p:inputText id="edit_dlg_email" styleClass="width_100" value="#{benutzerBean.selectedUser.email}" />

                                <p:commandButton id="save" value="Speichern"  process="editUserDialog"  actionListener="#{benutzerBean.submitEditUser}" oncomplete="editDialog.hide()" />
                                <p:commandButton value="Abbrechen" type="reset" onclick="editDialog.hide()" />

                        </p:panelGrid>
                    </p:dialog>





                    <!-- ========================================================================= -->
                    <!-- =======================  DELETE USER DIALOG    ========================== -->
                    <!-- ========================================================================= -->  
                    <p:dialog id="deleteUserdialog" header="Benutzer erstellen" widgetVar="deleteUserdialog" resizable="false" modal="true" >
                                <h:outputText id="delete" value="#{benutzerBean.selectedUser.vorname} löschen" />
                    </p:dialog>
                </p:panel>
            </div>
        </h:form>
    </ui:define>
</ui:composition>

我的ManagedBean

@Controller
@ManagedBean
@Scope(value="view")
public class BenutzerBean {

@Autowired
BenutzerService benutzerService;


private List<Benutzer> userTableData = new ArrayList<Benutzer>();
private List<Benutzer> filteredTableData;
private Benutzer selectedUser;


public BenutzerBean(){
}

@PostConstruct
public void populateTable(){
    userTableData = benutzerService.getAllBenutzer();
}

public void submitEditUser(){
    saveUser(selectedUser);
}

private void saveUser(Benutzer benutzer){
    benutzerService.saveBenutzer(benutzer);
    populateTable();
}

public List<Benutzer> getFilteredTableData() {
    return filteredTableData;
}

public void setFilteredTableData(List<Benutzer> filteredTableData) {
    this.filteredTableData = filteredTableData;
}

public void setUserTableData(List<Benutzer> userTableData) {
    this.userTableData = userTableData;
}

public List<Benutzer> getUserTableData(){
    return userTableData;
}

public Benutzer getSelectedUser() {
    return selectedUser;
}

public void setSelectedUser(Benutzer selectedUser) {
    this.selectedUser = selectedUser;
}

Benutzer Class

@Entity(name="BENUTZER")
public class Benutzer implements Serializable {


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private Long id;


@ManyToOne
@JoinColumn(name = "BENUTZERGRUPPEN_ID")
@NotNull
private Benutzergruppe benutzergruppe;


@Column(name="VORNAME")
@NotNull
@Length(min=3, message="vorn")
private String vorname;


@Column(name="NACHNAME")
@NotNull
@Length(min=3, message="nach")
private String nachname;


@Column(name="BENUTZERNAME")
@NotNull
@Length(min=4, message="benu")
private String benutzername ;


@Column(name="PASSWORT")
private String passwort;


@Column(name="EMAIL")
private String email;


@Column(name="AKTIV")
private boolean aktiv = true;


@Column(name="GELOESCHT")
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime deleted;


@ManyToMany ( fetch= FetchType.EAGER)
@JoinTable( name="BENUTZER_ROLLEN", 
            joinColumns={@JoinColumn(name="BENUTZER_ID")} ,
            inverseJoinColumns={@JoinColumn(name="ROLLE_ID")}
          )
public List<Rolle> rollen = new LinkedList<>();


/////////////////////////////
//  GETTER SETTER
///////////////////////////

public Benutzer(){}

public Benutzer(Benutzergruppe benutzergruppe ,String nachname, String vorname, String username,
        String password, String email,  boolean enabled) {
    this();
    this.benutzergruppe = benutzergruppe;
    this.nachname = nachname;
    this.vorname = vorname;
    this.benutzername = username;
    this.passwort = password;
    this.email = email;
    this.aktiv = enabled;
}



//--------- OTHER METHODS ---------------


public void deleteUser(){
    aktiv = false;
    setDeleted(DateTime.now());
}

public boolean isUserDeleted(){
    return deleted != null;
}

public void disableUser(){
    setAktiv(false);
}

public void enableUser(){
    setAktiv(true);
}

public void addRole(Rolle role){

    if(role == null)
        throw new IllegalArgumentException("Add Role: role must not be null");

    if(!rollen.contains(role)){
        rollen.add(role);
        role.addBenutzer(this);
    }
}

public void removeRole( Rolle role){
    if(role == null)
        throw new IllegalArgumentException("Remove Role: role must not be null");

    if(rollen.contains(role)){
        rollen.remove(role);
        role.removeBenutzer(this);
    }

}


//============================================
// GETTER SETTER
//=========================================

public Long getId() {
    return id;
}


public void setId(Long benutzerId) {
    this.id = benutzerId;
}

public Benutzergruppe getBenutzergruppe() {
    return benutzergruppe;
}

public void setBenutzergruppe(Benutzergruppe benutzergruppe) {
    this.benutzergruppe = benutzergruppe;
}

public String getNachname() {
    return nachname;
}

public void setNachname(String nachname) {
    this.nachname = nachname;
}

public String getVorname() {
    return vorname;
}

public void setVorname(String vorname) {
    this.vorname = vorname;
}

public String getBenutzername() {
    return benutzername;
}

public void setBenutzername(String username) {
    this.benutzername = username;
}

public String getPasswort() {
    return passwort;
}

public void setPasswort(String password) {
    this.passwort = password;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public boolean isAktiv() {
    return aktiv;
}

private void setAktiv(boolean enabled) {
    this.aktiv = enabled;
}

public List<Rolle> getRollen() {
    return Collections.unmodifiableList(rollen);
}

public void setRollen(List<Rolle> rollen) {
    this.rollen = rollen;
}

public DateTime getDeleted() {
    return deleted;
}

private void setDeleted(DateTime timestamp) {
    this.deleted = timestamp;
}

有没有人知道如何解决这个问题?

祝你好运 彼得

2 个答案:

答案 0 :(得分:2)

您的数据表<h:form id="formTable">内的对话框。当您唤起对话框时,请调用:update =“:formTable:edit”。

你需要:

  1. 将对话框放在当前主要表单<h:form id="formTable">
  2. 之外
  3. 在对话框中放置一个新的<h:form>。例如:<h:form id="dlgForm">。对话框中的所有内容都将在新的h:form。
  4. 从dataTable调用更新,如下所示:update=":dlgForm:edit"。您正在引用表单内的对话框和面板网格中的表单。

答案 1 :(得分:0)

仔细检查您的更新ID。我认为你的麻烦在于:

<p:commandButton value="bearbeiten"  update=":formTable:edit" oncomplete="editDialog.show()" style="font-size:10px;">

我认为你的更新应该是update =“:formTable:editUserDialog:edit”。使用FireBug或类似方法确认正确的ID。