dataTable排序问题(JSF2.0 + primefaces)

时间:2011-03-30 14:32:52

标签: java jsf java-ee jsf-2 primefaces

我不知道为什么当我点击排序箭头时,我的dataTable没有对列进行排序。它只适用于我首先在过滤器上键入内容并将其删除。(就像它需要在过滤器上至少有一个字符才能正确排序)。

我会在此处粘贴代码:

这是带有dataTable的JSF页面

<!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:

@ManagedBean
@ViewScoped implements Serializable
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 implements Serializable{

@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

3 个答案:

答案 0 :(得分:3)

我的经验是,主要支持bean(ViewScoped!)必须拥有它自己的行列表。因此,例如,如果每次请求p:dataTable时都查询数据库:值排序将不起作用。解决方案:从数据库中收集列表并将其保存在辅助bean中的本地List变量中。

在您提供的代码中

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

您可以获得每个请求的列表。它并没有像设计那样工作。希望有所帮助。

答案 1 :(得分:2)

我想确认我遇到与primefaces-2.2.1描述的完全相同的问题。

我的dataTable的值(行元素)是从查询计算的。

对一个简单的名称进行排序String属性会失败,除非我也有一个filterBy,即使这样,只有当我在过滤器框中输入至少一个字母时它才有效。然后我可以在过滤结果中对升序/降序进行排序。

Webel

答案 2 :(得分:1)

添加了答案,不再对以前的答案发表评论

更新:Primefaces 3.5似乎修复了这个p:dataTable sortBy我在2.2.1报告的问题,并且在3.3上仍然是一个问题。

但是,在Mac OS X上,p:dataTable仅在某些Max OS X版本的某些Firefox版本上正常工作。

在Mac OS X 10.6.8上的Firefox 20.0上都可以(两者都支持)。

在Mac OS X 10.5.8(也是行尾)的Firefox 16.0.2(行尾)上有许多非常奇怪的问题,例如编辑图标显示为笔,刻度线,交叉和行编辑根本没有激活,排序图标没有出现,排序列标题爆炸,并且奇怪地重复偏移到所有列标题的右侧。在Mac OS X 10.5.8上,使用Primefaces 3.3在Firefox 16.0.2(终止行)上进行行编辑工作正常。

在Mac OS X 10.5.8上,行编辑和sortBy在Safari 5.0.6和Chrome 21.0.1180.90上都可以。

这些测试是在Glassfish 3.1.1(在Netbeans7.1中)上进行的。 Primefaces 3.3

http://code.google.com/p/primefaces/issues/detail?id=2476

http://forum.primefaces.org/viewtopic.php?f=3&t=14845

http://forum.primefaces.org/viewtopic.php?f=3&t=14838