如何在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>
这会显示包含三列(正确,数字和标题)和三行(正确数字)的表格,但我的行中没有数据。只有边框单元格的空表。
发生了什么?我怎么能绑定列和数据?
答案 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));
正如您可能看到的,这可能很难维持。
使用标签更清晰,更易于阅读。