如何绑定来自managedbean的primefaces数据表

时间:2015-02-09 19:40:10

标签: jsf jsf-2 primefaces datatable

如何在managedbean中绑定primefaces数据表?如何放置数据,以及如何放置列?

我的豆类:

public class BeanTest implements Serializable{
private String name;
private String email;
private int age;
//getters and setters
}

我的托管bean:

public class TestTable implements Serializable{
private DataTable tabela;
private List<BeanTest> lista;

@PostConstruct
public void init() {
int age= 18;
this.lista = new ArrayList<>();
this.lista.add(new BeanTest("name1", "email1", age));
this.lista.add(new BeanTest("name2", "email2", age++));
this.lista.add(new BeanTest("name3", "email3", age++));

this.tabela = new DataTable();
Column column1 = new Column();
column1.setHeaderText("Nome");

Column column2 = new Column();
column2.setHeaderText("Email");

Column column3 = new Column();
column3.setHeaderText("Idade");

this.getTabela().getChildren().add(column1);
this.getTabela().getChildren().add(column2);
this.getTabela().getChildren().add(column3);

this.getTabela().setValue(this.lista);
}
}

JSF页面:

<p:dataTable id="datalist" binding="#{testeTabela.tabela}">
</p:dataTable>

这会显示包含三列(正确,数字和标题)和三行(正确数字)的表格,但我的行中没有数据。只有边框单元格的空表。

发生了什么?我怎么能绑定列和数据?

1 个答案:

答案 0 :(得分:5)

通常,JSF组件有3个部分:标记,组件类和渲染器。

标签负责组件配置。它将实例化您的组件并设置适当的属性,侦听器和构面。配置完成后,组件将放在组件树上。

使用您的示例,页面代码将类似于:

<p:dataTable id="dataTable" var="item" value="#{bean.list}">
    <p:column headerText="Name">#{item.name}</p:column>
    <p:column headerText="Email">#{item.email}</p:column>
    <p:column headerText="Age">#{item.age}</p:column>
</p:dataTable>

这样做更容易。但是,如果您想在代码中执行操作,则需要在列中添加一些组件以使其工作。

首先,在数据表上设置 var 属性。组件(datatable)将迭代您的项目并将当前项目绑定到该名称,因此子组件可以使用表达式动态获取该值。

this.getTabela().setVar("item");

其次,将一个子 UIOutput 添加到该列,并将表达式添加到其属性中。对于名称列,它将是这样的:

FacesContext context = FacesContext.getCurrentInstance();
//Creates the output and sets the value to an expression language
UIOutput output1 = new UIOutput();
output1.setValueExpression("value",context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(),"#{item.name}", String.class));
//Add the output to the column
column1.getChildren().add(output1);

对于其他列,除了第三个UIOutput值的类型外,它的想法是一样的:

...createValueExpression(context.getELContext(),"#{item.age}", Integer.class));

正如您可能看到的,这可能很难维持。

使用标签更清晰,更易于阅读。