Project使用Spring Webflow和JSF(PrimeFaces)。我有一个带有f:attribute
的p:commandButton<p:commandButton disabled="#{editGroupMode=='edit'}" action="edit_article_group" actionListener="#{articleGroupManager.setSelectedRow}" ajax="false" value="Edit">
<f:attribute name="selectedIndex" value="${rowIndex}" />
</p:commandButton>
后端代码(Spring注入bean):
@Service("articleGroupManager")
public class ArticleGroupManagerImpl implements ArticleGroupManager{
public void setSelectedRow(ActionEvent event) {
String selectedIndex = (String)event.getComponent().getAttributes().get("selectedIndex");
if (selectedIndex == null) {
return;
}
}
}
属性&#34; selectedIndex&#34;永远是空的。谁知道这里发生了什么?谢谢。
答案 0 :(得分:2)
变量名称“rowIndex”表示您已在迭代组件中声明了此内容,例如<p:dataTable>
。
这确实无法奏效。在组件树中物理上只有一个JSF组件,在生成HTML输出期间多次重复使用。 <f:attribute>
在创建组件时进行评估(在迭代之前很久就会发生一次!),而不是在组件基于当前迭代的行生成HTML时。它确实总是null
。
无论如何,有几种方法可以达到您的具体功能要求。最理智的方法是将其作为方法参数传递:
<p:commandButton value="Edit"
action="edit_article_group"
actionListener="#{articleGroupManager.setSelectedRow(rowIndex)}"
ajax="false" disabled="#{editGroupMode=='edit'}" />
与
public void setSelectedRow(Integer rowIndex) {
// ...
}
无关,我在这个特殊情况下只使用了一个带有请求参数的GET链接来使请求具有幂等性(可书签,可重新执行而不会影响服务器端, searchbot-crawlable等)。另请参阅Communication in JSF 2.0 - Processing GET request parameters。