使用@ManageProperty和datatable var“currentRow”

时间:2011-08-31 18:35:45

标签: jsf jsf-2

我有一个视图范围的bean ManageFoo.java:

@ManagedBean(name = "ManageFoo")
@ViewScoped
public class ManageFoo {

  @ManagedProperty(value = "#{currentRow}")
  private Foo currentRowBean;
  .
  .
  public void setCurrentRowBean(Foo foo) {...}
  public Foo getCureentRowBean() {...}

  public void edit(ActionEvent e) {
    getCurrentRowBean();
    .
    .
  }
}

然后我有facelets文件ManageFoo.xhtml:

<h:dataTable value=#{ManageFoo.foos} var="currentRow">
  <h:column>
    <h:commandLink actionListener="#{ManageFoo.edit}"/>
.
.

当点击'commandLink'时,'getCurrentRowBean'返回null。

我使用FacesContext和getBean(“currentRow”)辅助方法可以正常工作,但我正在尝试使用ManagedProperty,ManagedBean等来“JSF 2ify”我的Web应用程序。我只是没有正确实现或我是否试图以一种没有意义的方式使用ManageProperty?

在Balus的反馈之后,他的解决方案适用于我的操作方法,但是我无法使其适用于返回值的方法(例如布尔值)。以下方法用于每行的一组“呈现”属性。例如,如果您正在编辑某一行,则其他行上的所有其他编辑按钮将消失,并且当前行的编辑按钮将被取消编辑按钮和保存按钮替换。因此,此方法对每一行都有不同的返回结果:

public boolean isCurrentRowEditing() {
    if(getCurrentRowDataBean().equals(getCurrentDataEditing())) {
        return true;
    } else {
        return false;
    }
}

由于我试图在任何地方消除“getCurrentRowDataBean()”方法,我需要一种方法来实现这一点。

1 个答案:

答案 0 :(得分:1)

@ManagedProperty在bean构造之后直接设置。在构造bean的时候,JSF绝对没有忙于迭代数据表。此外,您的bean被放入视图范围,因此它是在第一次请求视图时设置的,而不是在您将表单提交到同一视图时设置的。 #{currentRow}始终为null

有几种方法可以实现这一目标。如果您正在运行支持EL 2.2的容器或使用JBoss EL,那么您可以将其传递给操作(而不是监听器!)方法:

<h:commandLink action="#{manageFoo.edit(currentRow)}"/>

(请注意,我修改了托管bean名称以小写字母开头,符合编码约定)

public void edit(Foo currentRow) {
    // ...
}

如果你没有运行支持EL 2.2的容器也不能使用JBoss EL,那么你需要将数据表的值绑定到DataModel并在action(listener)方法中使用DateModel#getRowData()获取当前行。

另见:


根据您的更新

更新,只需在EL中进行比较即可。 E.g。

rendered="#{currentRow == manageFoo.currentRow}"

rendered="#{currentRow != manageFoo.currentRow}"

(请注意,这只适用于equals()已正确实施的情况!)