2011-03-30 237 views
1

我一直試圖修復這個dataTable的sortBy函數(Primefaces組件),但我只是不明白爲什麼它不工作,當其他功能如分頁或過濾器正常工作。對於這個dataTable,我只需要爲其標記屬性(稱爲「value」)傳遞一個數組,併爲標記屬性(稱爲「var」)指定一個同一類型的數組。在下面我會發布我的代碼。爲什麼這個dataTable sortBy函數不起作用?

這是DataTable中

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:t="http://myfaces.apache.org/tomahawk" 
xmlns:p="http://primefaces.prime.com.tr/ui"> 
    <ui:composition template="WEB-INF/templates/BasicTemplate.xhtml"> 
<ui:define name="resultsForm"> 
<h:form enctype="multipart/form-data"> 
    <h:inputText id="search" value="" /><h:commandButton value="search"/> 

    <p:dataTable var="garbage" value="#{resultsController.allGarbage}" dynamic="true" paginator="true" paginatorPosition="bottom" rows="10" 
      paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
      rowsPerPageTemplate="5,10,15">   

      <p:column filterBy="#{garbage.filename}" filterMatchMode="startsWith" sortBy="#{garbage.filename}" parser="string"> 
      <f:facet name="header"> 
      <h:outputText value="Filename" /> 
      </f:facet> 
      <h:outputText value="#{garbage.filename}" /> 
      </p:column> 

      <p:column filterBy="#{garbage.description}" filterMatchMode="contains"> 
      <f:facet name="header"> 
      <h:outputText value="Description" /> 
      </f:facet> 
      <h:outputText value="#{garbage.description}" /> 
      </p:column> 

      <p:column sortBy="#{garbage.uploadDate}" parser="string"> 
      <f:facet name="header"> 
      <h:outputText value="Upload date" /> 
      </f:facet> 
      <h:outputText value="#{garbage.uploadDate}" /> 
      </p:column>     
    </p:dataTable> 
</h:form> 
</ui:define> 

這裏的託管Bean與該頁面交互的JSF頁面:

@ManagedBean 
@RequestScoped 
public class ResultsController { 

@EJB 
private ISearchEJB searchEJB; 

private Garbage garbage; 

public List<Garbage> getAllGarbage() { 
    return searchEJB.findAllGarbage(); 
} 

public Garbage getGarbage() { 
    return garbage; 
} 

public void setGarbage(Garbage garbage) { 
    this.garbage = garbage; 
} 

的EJB訪問數據庫:

@Stateless(name = "ejbs/SearchEJB") 
public class SearchEJB implements ISearchEJB { 

@PersistenceContext 
private EntityManager em; 
public List<Garbage> findAllGarbage() { 
    Query query = em.createNamedQuery("findAllGarbage"); 
    List<Garbage> gList = new ArrayList<Garbage>(); 

    for (Object o : query.getResultList()) { 
     Object[] cols = (Object[]) o; 
     Garbage tmpG = new Garbage(); 
     tmpG.setFilename(cols[0].toString()); 
     tmpG.setDescription(cols[1].toString()); 
     tmpG.setUploadDate(cols[2].toString()); 

     gList.add(tmpG); 
    } 
    return gList; 
} 

}

與JPQL命名查詢實體使用:

@NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description, g.uploadDate FROM Garbage g;") 
    @Entity 
    public class Garbage { 

@Id 
@GeneratedValue 
@Column(nullable = false) 
private Long id; 
@Column(nullable = false) 
private String filename; 
@Column(nullable = false) 
private String fileType; 
@Column(nullable = false) 
private String uploadDate; 
@Column(nullable = false) 
private String destroyDate; 
@Lob 
@Column(nullable = false) 
private byte[] file; 
@Column(nullable = false) 
private String description; 

打印屏幕與瀏覽器輸出

enter image description here

控制檯輸出刷新頁面時 (嚴重:行1:61沒有可行的替代字符';'):

enter image description here

+0

PrimeFaces使用什麼版本? – Mark 2011-03-30 12:43:05

+0

我使用的版本是2.2.1 – sfrj 2011-03-30 12:53:31

回答

3

更改ResultsController到@ViewScoped範圍。 ResultsController和Garbage對象需要實現java.io.Serializable。


也許這會有所幫助。下面是我的代碼,我開始工作:

index.xhmtl

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.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"> 
    <f:view contentType="text/html" > 
     <h:head> 
      <title>PrimeFacesTest</title> 
     </h:head> 
     <h:body> 
      <h:form> 
       <p:dataTable var="garbage" value="#{indexBean.allGarbage}" 
          dynamic="true" paginator="true" paginatorPosition="bottom" rows="4" 
          paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
          rowsPerPageTemplate="5,10,15"> 

        <p:column filterBy="#{garbage.filename}" filterMatchMode="startsWith" sortBy="#{garbage.filename}" > 
         <f:facet name="header"> 
          <h:outputText value="Filename" /> 
         </f:facet> 
         <h:outputText value="#{garbage.filename}" /> 
        </p:column> 

        <p:column filterBy="#{garbage.description}" filterMatchMode="contains" > 
         <f:facet name="header"> 
          <h:outputText value="Description" /> 
         </f:facet> 
         <h:outputText value="#{garbage.description}" /> 
        </p:column> 

        <p:column sortBy="#{garbage.uploadDate}" parser="string"> 
         <f:facet name="header"> 
          <h:outputText value="Upload date" /> 
         </f:facet> 
         <h:outputText value="#{garbage.uploadDate}" /> 
        </p:column> 
       </p:dataTable> 

      </h:form> 

     </h:body> 
    </f:view> 
</html> 

IndexBean.java

@ManagedBean 
@ViewScoped 
public class IndexBean implements Serializable { 

    private ArrayList allGarbage; 

    public IndexBean() { 
     allGarbage = new ArrayList(); 
     allGarbage.add(new Garbage("Abc", "Abc", "28/03/2011 12:13:32")); 
     allGarbage.add(new Garbage("Bbc;", "bbc", "28/03/2011 12:14:32")); 
     allGarbage.add(new Garbage("Cbc", "Cbc", "28/03/2011 12:17:32")); 
     allGarbage.add(new Garbage("1Abc", "1Abc", "28/03/2011 12:13:32")); 
     allGarbage.add(new Garbage("2Bbc;", "2bbc", "28/03/2011 12:14:32")); 
     allGarbage.add(new Garbage("3Cbc", "3Cbc", "28/03/2011 12:17:32")); 
     allGarbage.add(new Garbage("4Abc", "4Abc", "28/03/2011 12:13:32")); 
     allGarbage.add(new Garbage("5Bbc;", "5bbc", "28/03/2011 12:14:32")); 
     allGarbage.add(new Garbage("6Cbc", "6Cbc", "28/03/2011 12:17:32")); 
    } 

    public ArrayList getAllGarbage() { 
     return allGarbage; 
    } 

} 

Garbage.java

public class Garbage implements Serializable { 

    private String filename; 
    private String description; 
    private String uploadDate; 

    public Garbage(String filename, String description, String uploadDate) { 
     this.filename = filename; 
     this.description = description; 
     this.uploadDate = uploadDate; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getFilename() { 
     return filename; 
    } 

    public void setFilename(String filename) { 
     this.filename = filename; 
    } 

    public String getUploadDate() { 
     return uploadDate; 
    } 

    public void setUploadDate(String uploadDate) { 
     this.uploadDate = uploadDate; 
    } 

} 
+1

Button?點擊列標題時它排序嗎? – Mark 2011-03-30 13:30:15

+0

謝謝你,當我點擊列標題,但只有當我第一次在過濾器上鍵入內容時,它才奏效。它不起作用,如果我只刷新頁面,我點擊列標題。 – sfrj 2011-03-30 13:44:09

+0

我播下你最後的編輯。它的作品謝謝你:) – sfrj 2011-03-30 14:19:56

0

這個答案有點晚,但我希望它可以幫助別人。 我在Java7上有同樣的問題,使用Primefaces 4的JSF2,我的修復是在創建Bean時初始化ArrayList <>。 否則,排序功能無法對數據進行排序,並且只有在之前過濾了某些內容的情況下才能像描述的那樣工作。

所以豆將如下所示:

@ManagedBean 
@ViewScoped 
public class IndexBean implements Serializable { 

private ArrayList<Garbage> allGarbage; 

@PostConstuct 
public init() 
{ 
    allGarbage = new ArrayList<Garbage>(); 
    allGarbage.add(new Garbage("Abc", "Abc", "28/03/2011 12:13:32")); 
    allGarbage.add(new Garbage("Bbc;", "bbc", "28/03/2011 12:14:32")); 
    allGarbage.add(new Garbage("Cbc", "Cbc", "28/03/2011 12:17:32")); 
    allGarbage.add(new Garbage("1Abc", "1Abc", "28/03/2011 12:13:32")); 
    allGarbage.add(new Garbage("2Bbc;", "2bbc", "28/03/2011 12:14:32")); 
    allGarbage.add(new Garbage("3Cbc", "3Cbc", "28/03/2011 12:17:32")); 
    allGarbage.add(new Garbage("4Abc", "4Abc", "28/03/2011 12:13:32")); 
    allGarbage.add(new Garbage("5Bbc;", "5bbc", "28/03/2011 12:14:32")); 
    allGarbage.add(new Garbage("6Cbc", "6Cbc", "28/03/2011 12:17:32")); 
} 

public ArrayList<Garbage> getAllGarbage() 
{ 
    return allGarbage; 
} 

public void setAllgarbage(ArrayList<Garbage> garbage) 
{ 
    this.allGarbage = garbage; 
} 

} 

你不需要 'filteredBy' 和 'filterMatchMode' 屬性了。