簡體   English   中英

JSF + Primefaces:“主-詳細信息-視圖”中的Ajax CRUD-Action每頁加載僅工作一次

[英]JSF + Primefaces: Ajax CRUD-Actions in Master-Detail-View only work once per page-load

我在帶有Primefaces 2.2.1 + Hibernate的JBoss AS 6上使用Mojarra 2.0.3。

我有一個p-datatable和p:dialog為Person(姓氏,姓氏)的主從視圖。

Person.java代碼:

@Entity
public class Person implements Serializable {

private static final long serialVersionUID = 279906432340876832L;
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
private Long id;

private String prename;
private String lastname;

    // getter and setter...
}

使用“創建”按鈕可以創建新實例,使用“編輯”按鈕可以編輯所選項目。

.xhtml的代碼:

<h:form id="personForm">

    <!-- 2 Buttons to open create/edit Dialog -->
    <p:panel id="tableButtons">
        <p:commandButton value="create" action="#{personBean.showCreateView}"
            update="personForm:detailPanel" oncomplete="personDialog.show()" />
        <p:commandButton value="edit" action="#{personBean.showEditView}"
            update="personForm:detailPanel" oncomplete="personDialog.show()"
            rendered="#{personBean.rowSelected}" />
    </p:panel>

    <!--  DataTable for list-View -->
    <p:dataTable var="item" styleClass="table"
        value="#{personBean.personList}" id="personTable" paginator="true"
        selectionMode="single" selection="#{personBean.selectedPerson}"
        rowSelectListener="#{personBean.select}"
        onRowSelectUpdate="personForm:tableButtons"
        rowUnselectListener="#{personBean.unselect}"
        onRowUnselectUpdate="personForm:tableButtons" rows="10">
        <p:column sortBy="#{item.prename}">
            <f:facet name="header">
                <h:outputText value="prename" />
            </f:facet>
            <h:outputText value="#{item.prename}" />
        </p:column>
        <p:column sortBy="#{item.lastname}">
            <f:facet name="header">
                <h:outputText value="lastname" />
            </f:facet>
            <h:outputText value="#{item.lastname}" />
        </p:column>
    </p:dataTable>

    <!--  Dialog for detailed-View -->
    <p:dialog id="personDialog" widgetVar="personDialog">
        <p:panel id="detailPanel">
            <h:panelGrid cellpadding="4">
                <h:outputText value="prename: " />
                <h:inputText value="#{personBean.selectedPerson.prename}" />
                <h:outputText value="lastname: " />
                <h:inputText value="#{personBean.selectedPerson.lastname}" />
            </h:panelGrid>
            <p:commandButton value="persist"
                actionListener="#{personBean.persist}"
                rendered="#{personBean.createView}" update="personForm"
                oncomplete="personDialog.hide()" />
            <p:commandButton value="save" actionListener="#{personBean.merge}"
                update="personForm" rendered="#{personBean.editView}"
                oncomplete="personDialog.hide()" />
        </p:panel>
    </p:dialog>

</h:form>

ManagedBean擁有2個布爾屬性createView / editView,它們出現在對話框命令按鈕的渲染屬性中,DataTable的列表,Detail-View的“ selectedPerson”列表,以及另一個在選擇行時觸發edit-Button的布爾值。數據表。

托管Bean代碼:

@ManagedBean(name = "personBean")
@ViewScoped
public class PersonMBean {

private List<Person> personList;
private Person selectedPerson;

// row in the table has been selected
private boolean rowSelected;

// only render the active View
private boolean createView;
private boolean editView;
// ... displayView and more possible

@EJB
private CRUDService crudService;

public PersonMBean() {
    personList = new ArrayList<Person>();
    selectedPerson = new Person();
}

// CRUD-options
public String persist(ActionEvent actionEvent) {
    crudService.persist(selectedPerson);
    return null;
}
public String merge(ActionEvent actionEvent) {
    selectedPerson = crudService.merge(selectedPerson);
    return null;
}

// switch between Views
public String showCreateView() {
    selectedPerson = new Person();
    createView = true;
    editView = false;
    return null;
}
public String showEditView() {
    createView = false;
    editView = true;
    return null;
}

public List<Person> getPersonList() {
    return crudService.getAllPerson();
}

public Person getSelectedPerson() {
    if (selectedPerson == null) {
        selectedPerson = new Person();
    }
    return selectedPerson;
}

public String select(SelectEvent event) {
    setRowSelected(true);
    return null;
}

public String unselect(UnselectEvent event) {
    setRowSelected(false);
    return null;
}

// getter + setter
public void setPersonList(List<Person> personList) {this.personList = personList;}
public void setSelectedPerson(Person selectedPerson) {this.selectedPerson = selectedPerson;}
public boolean isRowSelected() {return rowSelected;}
public void setRowSelected(boolean rowSelected) {this.rowSelected = rowSelected;}
public void setCreateView(boolean createView) {this.createView = createView;}
public boolean isCreateView() {return createView;}
public void setEditView(boolean editView) {this.editView = editView;}
public boolean isEditView() {return editView;}

}

問題是,雖然單個創建/編輯人員成功,但是之后,創建動作將插入空行,而編輯動作將插入具有錯誤值的行。 當我重新加載頁面時,再次執行第一個操作就可以了,第二個操作失敗了... :(

我想PersonMBean.selectedPerson的狀態已經過時,但是我無法弄清楚,也找不到解決方案。

ps crudService只是調用em.persist + em.merge

CRUDService的代碼:

@Stateless
public class CRUDService {

@PersistenceContext
EntityManager em;

public <T> T persist(T t) {
    this.em.persist(t);
    return t;
}

public <T> T merge(T t) {
    return this.em.merge(t);
}

@SuppressWarnings("unchecked")
public List<Person> getAllPerson() {
    Query q = em.createQuery("from Person");
    return q.getResultList();
}
}

web.xml看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID"
version="3.0">
<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>
<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>

我真的很努力,希望您能幫助我。

如果格式/樣式有任何問題,請告訴我,以便我進行更新。

查看http://www.jaxio.com/cn/celerio.html,它輸出JSF + Primefaces主頁面/詳細頁面,可以用作示例

您可以將其添加到web.xml中,然后重新運行代碼嗎?

<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM