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 即使我使用以下代码
<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】:
问题显然与我们所有人的想法无关......只是<ui:composition> ... </ui:composition>
的错误用法
在我删除标签后,它被修复了。
这里的问题是<ui:composition>
忽略了它周围的所有内容(甚至像<head>
或<body>
这样的标签)。这意味着 xhtml 文件没有被解析为正确的 html 页面。如果没有任何<head>
-tag,则无法包含 javascript,因此该功能被禁用并且分页无法正常工作。
我希望这在某些时候可以帮助任何人。我显然不会再犯这个错误了。
感谢您在这方面花费的所有时间和帮助!
【讨论】:
应该......这就是为什么我说你可能在模板中丢失了 ah:head 或其他任何东西,所以这是我们正在考虑的方向(但你没有回应那条评论),你现在说你没有模板?好吧,是的,比没有加载 js 或 css。顺便说一句,其他的所有其他事情都是错误的。也许最好退后一步阅读一些基础知识以上是关于p:数据表分页不起作用的主要内容,如果未能解决你的问题,请参考以下文章