3

项目使用 Spring Webflow 和 JSF (PrimeFaces)。我有 ap:commandButton 和 f:attribute

<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;
    }
  }
}

属性“selectedIndex”始终为空。有人知道这里发生了什么吗?谢谢你。

4

1 回答 1

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 等)。另请参阅JSF 2.0 中的通信 - 处理 GET 请求参数

于 2012-09-19T16:06:55.507 回答