Primefaces commandButton:f:属性不起作用

时间:2012-09-19 14:25:31

标签: jsf jsf-2 spring-webflow

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;永远是空的。谁知道这里发生了什么?谢谢。

1 个答案:

答案 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