我有一个视图作用域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")助手方法,但我试图"JSF 2ify"我的web应用程序通过使用ManagedProperty的,ManagedBean的,等。我只是没有正确地实现这一点,还是我试图使用ManageProperty的方式,没有意义?
经过Balus的反馈,他的解决方案对我的操作方法工作得很好,但我有麻烦让它对返回值(如布尔)的方法工作。下面的方法用于每行的一组"呈现"属性。例如,如果您正在编辑某一行,其他行上的所有其他编辑按钮都将消失,当前行的编辑按钮将被取消编辑按钮和保存按钮所取代。因此,该方法对每行有不同的返回结果:
public boolean isCurrentRowEditing() {
if(getCurrentRowDataBean().equals(getCurrentDataEditing())) {
return true;
} else {
return false;
}
}
由于我试图消除"getCurrentRowDataBean()"方法无处不在,我需要一种方法来工作
@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(侦听器)方法中使用DateModel#getRowData()
来获取当前行。
参见:
- 我怎么能通过选定的行commandLink内dataTable?(显示所有可能的方式) 推荐的JSF 2.0 CRUD框架(显示
- 从h:commandButton和JPA更新datatable中的backing bean(显示EL 2.2方式)
DataModel
方式)Update按你的更新,只比较它在EL。例如
rendered="#{currentRow == manageFoo.currentRow}"
和
rendered="#{currentRow != manageFoo.currentRow}"
(注意,这只有在equals()
正确实现的情况下才有效!)