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)
您可能已经看到,这可能很难维护.
使用标签更清晰,更易于阅读.