p:数据表分页不起作用

Posted

技术标签:

【中文标题】p:数据表分页不起作用【英文标题】:p:datatable pagination does not work 【发布时间】:2015-11-02 12:10:10 【问题描述】:

我正在尝试使用分页呈现 DataTable,但到目前为止我发现没有任何代码 sn-p 真正有效。我想我错过了一些非常少的东西......

这是我的测试站点,代码非常少,但仍然无法正常工作:

test.xhtml

<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:p="http://primefaces.org/ui">

<body>
<ui:composition>

    <h:form>
        <p:dataTable id="dataTable" var="car" value="#testBean.createCars(50)"
            paginator="true" rows="10"
            paginatorTemplate="CurrentPageReport  FirstPageLink PreviousPageLink PageLinks NextPageLink LastPageLink RowsPerPageDropdown"
            rowsPerPageTemplate="5,10,15">
            <f:facet name="header">
            Ajax Pagination
        </f:facet>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Brand" />
                </f:facet>
                <h:outputText value="#car.brand" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Year" />
                </f:facet>
                <h:outputText value="#car.year" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Color" />
                </f:facet>
                <h:outputText value="#car.color" />
            </p:column>
        </p:dataTable>
    </h:form>

</ui:composition>
</body>
</html>

testBean.java(代码取自http://www.primefaces.org/showcase/ui/data/datatable/paginator.xhtml)

@Named 
public class TestBean implements Serializable 

/** serialVersionUID. */
private static final long serialVersionUID = 1L;

private final static String[] colors;

private final static String[] brands;

static 
    colors = new String[10];
    colors[0] = "Black";
    colors[1] = "White";
    colors[2] = "Green";
    colors[3] = "Red";
    colors[4] = "Blue";
    colors[5] = "Orange";
    colors[6] = "Silver";
    colors[7] = "Yellow";
    colors[8] = "Brown";
    colors[9] = "Maroon";

    brands = new String[10];
    brands[0] = "BMW";
    brands[1] = "Mercedes";
    brands[2] = "Volvo";
    brands[3] = "Audi";
    brands[4] = "Renault";
    brands[5] = "Fiat";
    brands[6] = "Volkswagen";
    brands[7] = "Honda";
    brands[8] = "Jaguar";
    brands[9] = "Ford";


public List<Car> createCars(int size) 
    List<Car> list = new ArrayList<Car>();
    for (int i = 0; i < size; i++) 
        list.add(new Car(getRandomId(), getRandomBrand(), getRandomYear(), getRandomColor(), getRandomPrice(), getRandomSoldState()));
    

    return list;


private String getRandomId() 
    return UUID.randomUUID().toString().substring(0, 8);


private int getRandomYear() 
    return (int) (Math.random() * 50 + 1960);


private String getRandomColor() 
    return colors[(int) (Math.random() * 10)];


private String getRandomBrand() 
    return brands[(int) (Math.random() * 10)];


public int getRandomPrice() 
    return (int) (Math.random() * 100000);


public boolean getRandomSoldState() 
    return (Math.random() > 0.5) ? true : false;


public List<String> getColors() 
    return Arrays.asList(colors);


public List<String> getBrands() 
    return Arrays.asList(brands);

我的输出总是:

http://i.stack.imgur.com/MXy7Y.png

有人可以帮我吗?

更新 1 即使我使用以下代码

&lt;p:dataTable id="dataTable" var="car" value="#testBean.cars"

@PostConstruct
public void createCars() 
    int size = 50;
    if (cars == null) 
        cars = new ArrayList<Car>();
        for (int i = 0; i < size; i++) 
            cars.add(new Car(getRandomId(), getRandomBrand(), getRandomYear(), getRandomColor(), getRandomPrice(), getRandomSoldState()));
        
    


public List<Car> getCars() 
    return cars;

还是不行

【问题讨论】:

现在检查你的 postconstruct 被调用的频率。很可能超出您的预期。检查你的 beanscope 我添加了一个 system.out.println(...) 并且该消息从服务器启动到页面显示仅显示一次。如果我重新打开该页面,它不会再次被调用,所以我认为我的 beanscope 在这里还可以吗?这对不显示的分页按钮有何影响? 或者你甚至有嵌套的表单 【参考方案1】:

也许只是你没有粘贴所有代码,但我缺少范围。

试试看

@SessionScope

就在之前

@Named

并保留 Kukeltje 给您的代码。这绝对是朝着正确方向迈出的一步

更新: 尝试在 ui:composition 中添加标签

<html> 
 <body> 
   <ui:composition
   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:p="http://primefaces.org/ui">

我认为css没有加载

更新 2:

这是来自 primefaces 展示的带有工作分页的代码。与您的代码进行比较并进行测试。

 <?xml version="1.0" encoding="UTF-8"?> 
<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:ui="http://java.sun.com/jsf/facelets"     xmlns:p="http://primefaces.org/ui">     
<h:head>    
</h:head>   
<h:body>        
<h:form prependId="false">          
<p:dataTable id="dataTable" var="car" value="#tableBean.cars" paginator="true" rows="10" paginatorTemplate="CurrentPageReport FirstPageLink PreviousPageLink PageLinks NextPageLink LastPageLink RowsPerPageDropdown"rowsPerPageTemplate="5,10,15">
            <f:facet name="header">
                Ajax Pagination
            </f:facet>
         <p:column>
            <f:facet name="header">
                <h:outputText value="Brand" />
            </f:facet>
            <h:outputText value="#car.brand" />
        </p:column>

        <p:column>
            <f:facet name="header">
                <h:outputText value="Year" />
            </f:facet>
            <h:outputText value="#car.year" />
        </p:column>

        <p:column>
            <f:facet name="header">
                <h:outputText value="Color" />
            </f:facet>
            <h:outputText value="#car.color" />
        </p:column>  </p:dataTable>

    </h:form>   
</h:body>
 </html>

【讨论】:

添加了注释,但没有成功。我的分页仍然看起来像这样“pp12345pp” 我改了,你的更新也没用。我怎样才能让它们加载? 我在看我在做什么不同,现在唯一的区别是我有 你有 下载展示中的官方 primefaces 示例。还有方法:mkyong.com/jsf2/primefaces/… @DomenPetrič:可能会有更多差异,你不能确定【参考方案2】:

我遇到了这个问题。但问题是我有两个数据列表具有相同的widgetVar 名称。也许它对某人有帮助。

【讨论】:

【参考方案3】:

通过添加为“Sytem.out.println”来检查您的“createCars(50)”被调用的频率。很可能超出您的预期。然后看看与 PrimeFaces Showcase 的区别。

您指向的代码是这样做的:

@PostConstruct
public void init() 
    cars = service.createCars(50);


public List<Car> getCars() 
    return cars;

<p:dataTable var="car" value="#dtPaginatorView.cars"...

当您直接拨打createCars(...)时。

奇怪的是,您看到的所有“示例”都不起作用,因为 PrimeFaces 展示效果完美。

另请参阅:

Why JSF calls getters multiple times

【讨论】:

您的代码不可读。而且“它仍然不起作用”是含糊的。如果您只是分析行为,您可以自己进行大量调试。截图什么也没说。发生的事情是您每次都看到相同的数据。还是这样吗?然后检查在您创建新数据的位置调用您的方法的频率。 新数据现在在注入后创建一次。不知道这是否对“错误”分页有任何影响......它只是不可点击。我想念 .js 或 .css -files 或 images 吗? 是的,你也错过了h:head 添加了它,但它仍然是相同的输出 嗯,可能是主页中的头部丢失了。请创建一个 mcve。所有这些猜测都需要很长时间【参考方案4】:

问题显然与我们所有人的想法无关......只是&lt;ui:composition&gt; ... &lt;/ui:composition&gt;的错误用法

在我删除标签后,它被修复了。 这里的问题是&lt;ui:composition&gt; 忽略了它周围的所有内容(甚至像&lt;head&gt;&lt;body&gt; 这样的标签)。这意味着 xhtml 文件没有被解析为正确的 html 页面。如果没有任何&lt;head&gt;-tag,则无法包含 javascript,因此该功能被禁用并且分页无法正常工作。

我希望这在某些时候可以帮助任何人。我显然不会再犯这个错误了。

感谢您在这方面花费的所有时间和帮助!

【讨论】:

应该......这就是为什么我说你可能在模板中丢失了 ah:head 或其他任何东西,所以这是我们正在考虑的方向(但你没有回应那条评论),你现在说你没有模板?好吧,是的,比没有加载 js 或 css。顺便说一句,其他的所有其他事情都是错误的。也许最好退后一步阅读一些基础知识

以上是关于p:数据表分页不起作用的主要内容,如果未能解决你的问题,请参考以下文章

jquery数据表服务器端分页不起作用

jquery数据表分页不起作用

DataTables - 排序,搜索,分页不起作用

使用服务器端时搜索和分页不起作用

Android房间分页不起作用

Kendo UI Grid 上的分页不起作用