Primefaces DataTable过滤和RowSelection不起作用

时间:2011-06-14 22:16:57

标签: jsf primefaces managed-bean

我是PrimeFaces的新手。我用它来编写Saas应用程序的前端代码。我正在使用primefaces数据表来显示客户列表。我需要对值进行排序和过滤。此外,我需要在数据表上选择一行时填充另一个小部件。排序有效,但过滤和选择不起作用。下面是bean和faces页面的代码片段。我正在使用PrimeFaces 2.2.1和JSF 2.0.2。

<html xmlns="http://www.w3c.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head></h:head>
<h:body>

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

    <!-- Top Tabbed Panel -->

    <p:layoutUnit position="top" id="main" width="600" resizable="false">
        <center><h3>SAAS Admin Tool</h3></center>
        <p:tabView effect="opacity" effectDuration="normal" collapsible="true" >

        <p:tab title="Customer">
            <!-- Start of customer datatable -->
            <p:dataTable var="customer" value="#{customerBean.customers}" paginator="true" selection="#{customerBean.selectedCustomer}" 
            selectionMode="single" onRowSelectUpdate="custList" onRowSelectComplete="custTest.show()" id="custList" widgetVar="custList">
                <f:facet name="header">
                List of Customers
                    <p:outputPanel>
                        <p:commandButton value="+" type="button" onclick="addCustDlg.show()"/>
                     </p:outputPanel>
                </f:facet>


                <p:column sortBy="#{customer.id}" filterBy="#{customer.id}" update=":custList" headerText="ID">
                    <h:outputText value="#{customer.id}"/>
                </p:column>

                <p:column sortBy="#{customer.name}" filterBy="#{customer.name}" headerText="NAME" filterMatchMode="contains">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.name}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.name}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column sortBy="#{customer.description}" filterBy="#{customer.description}" headerText="DESCRIPTION">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.description}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.description}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column sortBy="#{customer.signupDate}" filterBy="#{customer.signupDate}" headerText="SIGN UP DATE">
                        <h:outputText value="#{customer.signupDate}"/>
                </p:column>

                <p:column sortBy="#{customer.validUntil}" filterBy="#{customer.validUntil}" headerText="EXPIRY DATE">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.validUntil}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.validUntil}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column sortBy="#{customer.status}" filterBy="#{customer.status}" headerText="STATUS">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.status}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.status}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column headerText="CREATION DATE" sortBy="#{customer.creationDate}" filterBy="#{customer.creationDate}">
                        <h:outputText value="#{customer.creationDate}"/>
                </p:column>

                <p:column headerText="LAST UPDATE DATE" sortBy="#{customer.lastUpdateDate}" filterBy="#{customer.lastUpdateDate}">
                        <h:outputText value="#{customer.lastUpdateDate}"/>
                </p:column>

                <p:column headerText="Options">
                    <p:rowEditor/>
                </p:column>

            </p:dataTable>
            <!-- End of dataTable (customer datatable) -->

                <!-- Customer Details Tabbed Panel-->
                <p:tabView effect="opacity" effectDuration="normal" id="custTab" widgetVar="custTab">
                    <p:tab title="Lines">
                        lines info..
                    </p:tab>
                    <p:tab title="LineCards">
                        Linecards.. 
                    </p:tab>
                </p:tabView>

                <!-- END of customer details tabbed view -->
        </p:tab>

        <p:tab title="Deployment">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputText value="software"/>
                </h:panelGrid>
        </p:tab>

        <p:tab title="Maintainence">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputText value="test."/>
                </h:panelGrid>
        </p:tab>

        <p:tab title="Audit Trail">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputText value="Hardware Summary"/>
                </h:panelGrid>
        </p:tab>

        </p:tabView>
    </p:layoutUnit>

    <!-- DIALOGs -->

    <p:dialog header="Add Customer" widgetVar="addCustDlg" id="addCustDlg" resizable="false" width="420" onCloseUpdate="custList">
        <h:panelGrid columns="2">
            <h:outputLabel value="Name:"/>
            <p:inputText value="#{customerBean.newCustomer.name}" required="true"/>
            <h:outputLabel value="Description:"/>
            <p:inputText value="#{customerBean.newCustomer.description}" required="true"/>
            <h:outputLabel value="Sign Up Date:"/>
            <p:inputMask value="#{customerBean.signDate}" mask="99/99/2099"/>
            <h:outputLabel value="Expiry Date:"/>
            <p:inputMask value="#{customerBean.exDate}" mask="99/99/2099"/>
            <h:outputLabel value="Status:"/>
            <p:inputText value="#{customerBean.newCustomer.status}" required="true"/>
            <p:commandButton value="Submit" oncomplete="addCustDlg.hide();" actionListener="#{customerBean.addCustomer}" update=":custList"/>
        </h:panelGrid>

    </p:dialog>

    <p:dialog header="customer info" widgetVar="custTest" id="custTest" closable="true">
            <h:outputLabel value="Name: #{customerBean.selectedCustomer.name}"/>
    </p:dialog>

    <!-- Save and Reset buttons -->
    <p:layoutUnit position="bottom" id="buttons" height="75">
    <center>
        <p:commandButton value="Save Changes" actionListener="#{customerBean.save}" update="growl"/>
        <p:commandButton value="Reset" actionListener="#{customerBean.reset}" update="growl"/>
    </center>
    </p:layoutUnit>

</p:layout>

</h:form>


</h:body>
</html>

Bean代码:

import java.io.Serializable;
import java.sql.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import com.assia.saas.dao.AbstractSearchDAO;
import com.assia.saas.dao.EntityManagerHelper;
import com.assia.saas.entities.Customer;


@ManagedBean(name="customerBean")
@ViewScoped
public class CustomerBean implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;
AbstractSearchDAO<Customer> custDao = new AbstractSearchDAO<Customer>() {

    @Override
    protected Class<Customer> getEntityClass() {
        return Customer.class;
    }

    @Override
    protected Customer getEntityReference(Customer entity) {
        return getEntityManager().getReference(Customer.class, entity.getId());
    }

};
List<Customer> customers = new ArrayList<Customer>();
private Customer selectedCustomer = new Customer();
private Customer newCustomer;
private String signDate;
private String exDate;

/**
 * @return the signDate
 */
public String getSignDate() {
    return signDate;
}

/**
 * @param signDate the signDate to set
 */
public void setSignDate(String signDate) {
    this.signDate = signDate;
}

/**
 * @return the exDate
 */
public String getExDate() {
    return exDate;
}

/**
 * @param exDate the exDate to set
 */
public void setExDate(String exDate) {
    this.exDate = exDate;
}

/**
 * @return the newCustomer
 */
public Customer getNewCustomer() {
    return newCustomer;
}

/**
 * @param newCustomer the newCustomer to set
 */
public void setNewCustomer(Customer newCustomer) {
    this.newCustomer = newCustomer;
}

public CustomerBean(){
    customers = custDao.findAll(null);
    newCustomer = new Customer();

}

public void save(){
    //TODO: CODE METHOD
}

public void reset(){
    //TODO: Code Method
}

/**
 * @return the customers
 */
public List<Customer> getCustomers() {
    return customers;
}

/**
 * @param customers the customers to set
 */
public void setCustomers(List<Customer> customers) {
    this.customers = customers;
}

/**
 * @param selectedCustomer the selectedCustomer to set
 */
public void setSelectedCustomer(Customer selectedCustomer) {
    this.selectedCustomer = selectedCustomer;
}

/**
 * @return the selectedCustomer
 */
public Customer getSelectedCustomer() {
    return selectedCustomer;
}

public void addCustomer(ActionEvent event) throws ParseException{

    Date date = new Date(Calendar.getInstance().getTimeInMillis());
    newCustomer.setCreationDate(date);
    newCustomer.setLastUpdateDate(date);

    DateFormat formatter;
    formatter = new SimpleDateFormat("MM/dd/yyyy");
    java.sql.Date sqlDate = new java.sql.Date(formatter.parse(signDate).getTime());
    newCustomer.setSignupDate(sqlDate);
    sqlDate = new java.sql.Date(formatter.parse(exDate).getTime());
    newCustomer.setValidUntil(sqlDate);

    EntityManagerHelper.beginTransaction();
    custDao.save(newCustomer);
    EntityManagerHelper.commit();

    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Success", "New Customer Added"));
}


}

代码没有填充bean中的“selectedCustomer”对象。

1 个答案:

答案 0 :(得分:3)

我想要解决的问题是你想要创建一个可编辑的数据表。当你使用dataTable属性selectionMode =“Single”时,这似乎一切都适合我。我不能说它出了什么问题,因为它涉及许多其他复杂性。但是你可以实现相同的功能(在backing bean中填充selectedCustomer)

<强>解决方法1:  你实现了下面的监听器

 rowEditListener="#{customerBean.listenerInBackingBean}"

并在支持豆..........

 public void listenerInBackingBean(org.primefaces.event.RowEditEvent ev) {

        Customer selectedCustomer  = (Customer) ev.getObject();
        //write Logic to Store Customer in Database

}

解决方案2:

 <p:commandButton >
  <f:setPropertyActionListener value="#{customer}" target="#{customerBean.selectedCustomer}" />
 </p:commandButton>

此处selectedCustomer是Customer类型的实例。