【问题标题】:dataTable sorting problem (JSF2.0 + primefaces)数据表排序问题(JSF2.0 + primefaces)
【发布时间】:2011-03-30 14:32:51
【问题描述】:

我不知道为什么当我单击排序箭头时我的 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;

带有浏览器输出的打印屏幕

【问题讨论】:

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


    【解决方案1】:

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

    在您提供的代码中

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

    你会得到每个请求的列表。它不是按设计那样工作的。希望对您有所帮助。

    【讨论】:

    • 所以你认为只是缺少一个列表作为局部变量来充当交换内存或类似的东西吗?我现在就试试。我将添加 List allGarbage;到我的代码。
    • 我只是尝试添加变量 List allGarbage;正如你所说,到我的托管 bean,但它仍然不能正确排序(我的意思是一次)。
    • allGarbage 是否被懒惰初始化?也许代码......当您完全删除过滤器内容时,它是否都按预期工作?
    • 您使用的是哪个版本的 primefaces?
    • 一旦我在过滤器上输入了一些东西,然后删除它所有的工作。但是,当我在页面刷新后直接排序时,它不起作用。 Primefaces 版本是 2.2.1
    【解决方案2】:

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

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

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

    韦贝尔

    【讨论】:

    • 我进一步测试了仅在页面加载时初始化列表(使用 )并且问题仍然存在,尽管策略确实确保 p:dataTable 的其他功能,例如内联 cellEditor 现在可以正常工作(如stackoverflow.com/questions/6365877/… 所述)。我认为我们遇到了一个真正的错误,而不是对 p:dataTable 的滥用。
    • 我从来没有修过那个。可能正如您所说,我们面临一个错误,也许使用不同版本的 primefaces 事情会有所不同。我还是不知道怎么解决。
    【解决方案3】:

    作为答案添加,而不是长期以来对先前答案的评论

    更新:Primefaces 3.5 似乎修复了我在 2.2.1 上报告的 p:dataTable sortBy 问题,但在 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 上的 Firefox 16.0.2(行尾)上的 Primefaces 3.3 上运行良好。

    在 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

    【讨论】:

    • 是的,我过去也遇到过类似的问题。这是我前段时间添加的一个问题,但我认为现在新版本的primefraces这个问题可能已经消失了。从那以后我没有尝试过。我会给你+1的研究。 Tnx
    • 这里有一个关于新样本实体 p:dataTable 测试套件的相关问题的详细讨论:forum.primefaces.org/viewtopic.php?f=3&t=29893 p:dataTable: 测试套件:每个视图使用许多表进行排序
    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2013-02-16
    • 2019-10-21
    相关资源
    最近更新 更多