【问题标题】:How bind primefaces datatable from managedbean如何从 managedbean 绑定 primefaces 数据表
【发布时间】:2015-04-09 16:07:22
【问题描述】:

如何在 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>

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

发生了什么事?如何绑定列和数据?

【问题讨论】:

  • 避免 binding 和乏味的 Java 代码方式,直到/除非在某些(非常)特殊情况下绝对必要,在这种情况下似乎是绝对多余的。查看showcase 上的示例。 (不要忘记单击该页面上的相应链接)。

标签: jsf jsf-2 primefaces datatable


【解决方案1】:

一般来说,一个 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 属性。组件(数据表)将遍历您的项目并将当前项目绑定到该名称,因此子组件可以使用表达式动态获取该值。

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

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

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));

如您所见,这可能很难维护。

使用标签更简洁,更易于阅读。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2014-01-21
    • 2014-05-19
    • 2012-08-27
    相关资源
    最近更新 更多