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

uli*_*a69 0 datatable jsf primefaces jsf-2

如何在managedbean中绑定primefaces数据表?怎么放数据,怎么放列?

我的bean类:

public class BeanTest implements Serializable{
private String name;
private String email;
private int age;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我的托管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);
}
}
Run Code Online (Sandbox Code Playgroud)

JSF页面:

<p:dataTable id="datalist" binding="#{testeTabela.tabela}">
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

通常,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>
Run Code Online (Sandbox Code Playgroud)

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

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

this.getTabela().setVar("item");
Run Code Online (Sandbox Code Playgroud)

其次,将子UIOutput添加到列中,并将表达式添加到其value属性中.对于name列,它将是这样的:

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);
Run Code Online (Sandbox Code Playgroud)

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

...createValueExpression(context.getELContext(),"#{item.age}", Integer.class));
Run Code Online (Sandbox Code Playgroud)

您可能已经看到,这可能很难维护.

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