【问题标题】:How to pass a parameter to JSF dataTable's value attribute如何将参数传递给 JSF dataTable 的 value 属性
【发布时间】:2026-01-22 23:10:01
【问题描述】:

在 JSF 2.1 应用程序中,我需要构建一个 JSF dataTable(使用 PrimeFaces),它只显示属于登录用户的数据库记录。

所以,我需要将用户名传递给与 dataTable 的 value 属性关联的 bean:

value="#{tableBuilder.records}"

这是表格 bean:

@ManagedBean
@ViewScoped
public class TableBuilder {
    private List<MyRecord> records;
    private String username;
    // getters and setters
}

知道应用程序由单个网页组成,容器管理的身份验证通过LoginBean(一个 SessionScoped ManagedBean)实现,这很有用。这意味着在用户登录时通知 TableBuilder 的额外工作。

我想到的唯一方法是将LoginBean通过@ManagedProperty注解注入TableBuilder,并检查getRecords的每个请求,如果LoginBean的用户名属性发生了变化。

也许有更好的方法?

【问题讨论】:

  • 那么,在您的 Web 应用程序中,登录用户可能在视图的初始请求和成功回发到同一视图之间发生变化?
  • 正确。可能是第一个用户登录,然后退出,然后另一个用户使用同一个网页登录。

标签: jsf jakarta-ee primefaces facelets


【解决方案1】:

如果您的环境支持 EL 2.2(您的问题历史证实 Java EE 6),那么“就这么做”:

<h:dataTable value="#{bean.getModel(user)}">

public List<Item> getModel(User user) {
    // ...
}

无论是正确的方式还是有更好的方式,我都会中途离开。请记住,调用 getter 的次数与 EL 计算值表达式的次数一样多。

【讨论】:

  • 感谢您的回答。但是我应该在哪里以及如何在网页中为user 赋值?
  • 就像我的回答一样? #{user} 代表当前登录的用户。
  • @BalusC 那么,在这种特殊情况下,将列表填充到 getter 中是否可以?
  • @Alexander:如果你得到正确的延迟加载,从而确保在每个迭代轮次甚至每次回发期间都不会不必要地调用服务方法,那么可以。主要问题不是 getter 本身,而是效率(和干净的代码)。