我有一个视图范围的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()”方法,我需要一种方法来实现这一点。
答案 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()
获取当前行。
DataModel
方式)更新,只需在EL中进行比较即可。 E.g。
rendered="#{currentRow == manageFoo.currentRow}"
和
rendered="#{currentRow != manageFoo.currentRow}"
(请注意,这只适用于equals()
已正确实施的情况!)