【问题标题】:PrimeFaces DataTable sortingPrimeFaces 数据表排序
【发布时间】:2015-04-08 07:29:33
【问题描述】:

我是 JSF 新手,无法在 DataTable 中进行排序。我使用 Tomcat 7 和 Jetty 9(用于测试的 Jetty)和 PrimeFaces 5.1 和 JSF-2.2。 我在 DataTable 的页面上显示一些结果。我想要这个可排序的,并且使用我的代码,列显示排序箭头,但单击它们不会对表格进行排序,它只会更改列标题中的排序指示符箭头。 我知道 question ,但其中的解决方案不起作用并且与 PrimeFaces showcase 中的代码相矛盾。

我做了一个小样本来演示这个问题:

table.xhtml:

<?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://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
    <h:form>
        <p:dataTable value="#{tableTest.list}" var="token">
            <p:column headerText="Fisch" sortBy="#{token}">
                <h:outputText value="#{token}"/>
            </p:column>
        </p:dataTable>
    </h:form>
</h:body>
</html>

支持 bean:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.Arrays;
import java.util.List;

@ManagedBean(name = "tableTest")
@RequestScoped
public class TableTest {

    public List<String> getList() {
        return Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
    }
}

web.xml中的servlet映射:

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
    <!-- Production -->
</context-param>

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<!-- HTML comments become components unless they're stripped -->
<context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>

当我使用 firefox 的调试模式检查 newtork 时,我看到点击排序的以下响应:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1">
    <changes>
        <update id="j_idt4:j_idt5">
            <![CDATA[
            <tr data-ri="0" class="ui-widget-content ui-datatable-even" role="row">
                <td role="gridcell">Aal</td>
            </tr><tr data-ri="1" class="ui-widget-content ui-datatable-odd" role="row">
                <td role="gridcell">Zander</td>
            </tr>
            <tr data-ri="2" class="ui-widget-content ui-datatable-even" role="row">
                <td role="gridcell">Barsch</td>
            </tr>
            <tr data-ri="3" class="ui-widget-content ui-datatable-odd" role="row">
                <td role="gridcell">Brasse</td>
            </tr>
            <tr data-ri="4" class="ui-widget-content ui-datatable-even" role="row">
                <td role="gridcell">Wels</td>
            </tr><tr data-ri="5" class="ui-widget-content ui-datatable-odd" role="row">
                <td role="gridcell">Feldchen</td>
            </tr>]]>
        </update>

        <update id="j_id1:javax.faces.ViewState:0">
            <![CDATA[5844788699585149238:6667543622103173254]]>
        </update>
    </changes>
</partial-response>

我是 JSF 新手,不知道如何让排序工作。有人可以帮我让排序功能正常工作吗?

【问题讨论】:

    标签: sorting jsf primefaces datatable jsf-2.2


    【解决方案1】:

    您可能希望查看支持 bean 的范围并添加如下列表属性:

    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    import java.util.Arrays;
    import java.util.List;
    
    @ManagedBean(name = "tableTest")
    @ViewScoped
    public class TableTest {
    
        private List<String> fishList;
    
        @PostConstruct
        public void init() {
            this.fishList = Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
        }
    
        public List<String> getFishList() {
            return this.fishList;
        }
    
    }
    

    确切地说:视图范围是可选的,但您需要一个真实的属性。 所以这个例子也可以,虽然我不推荐它:

    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;
    
    import java.util.Arrays;
    import java.util.List;
    
    @ManagedBean(name = "tableTest")
    @RequestScoped
    public class TableTest {
    
        private List<String> list = Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
    
        public List<String> getList() {
            return list;
        }
    
    }
    

    这种行为的原因是,在请求期间多次访问属性(列表)。 在您的示例中,您总是在每次访问该属性时返回一个新列表(Arrays.asList 创建一个具有新 id 的新列表)。 然而,列表排序似乎只在请求期间列表对象保持不变时才有效。

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2019-04-29
      • 2016-04-08
      • 1970-01-01
      • 2018-04-11
      相关资源
      最近更新 更多