h:commandButton 在 h:dataTable 中不起作用

Posted

技术标签:

【中文标题】h:commandButton 在 h:dataTable 中不起作用【英文标题】:h:commandButton not working inside h:dataTable 【发布时间】:2011-12-23 11:33:11 【问题描述】:

我正在尝试在dataTable 中执行actioncommandButton,但是当commandButton 被放置在数据表中时,不会调用action,如下所示

<h:form>
    <h:dataTable value="#bean.list" var="item">
        <h:column>
            <h:commandButton value="submit" action="#bean.submit" />
        </h:column>
    </h:dataTable>
</h:form>

当我将commandButton 移出dataTable 时,action 已成功执行。 commandButton 在数据表中时有什么问题? commandLink 也有同样的问题。

【问题讨论】:

【参考方案1】:

#bean.list后面的列表在处理表单提交的HTTP请求期间与显示表单的请求期间完全相同时,可能会发生此问题。 JSF 将重新遍历列表以定位按下的按钮并调用其操作。

如果 bean 是请求范围的,并且在 bean 的(后)构造期间没有重新填充列表,或者列表的填充取决于在表单提交期间丢失的请求范围的变量,那么 JSF 将检索一个空的或完全不同的处理表单提交时列出,因此无法找到按下的按钮,也不会调用任何操作。

最好的解决方法是将 bean 放在视图范围内,并确保以正确的方式加载数据模型。

@ManagedBean
@ViewScoped
public class Bean implements Serializable 

    private List<Item> list;

    @EJB
    private ItemService service;

    @PostConstruct
    public void init() 
        list = service.list();
    

    // ...

另见:

commandButton/commandLink/ajax action/listener method not invoked or input value not updated - 第 4 点 Benefits and pitfalls of @ViewScoped

【讨论】:

我正在使用 Spring Web Flow 并将视图渲染上的“列表”设置为 [code]flashScope.myList[/code] 感谢此评论,我想将其更改为 [code]viewScope .myList[/code] 效果很好。谢谢!

以上是关于h:commandButton 在 h:dataTable 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

h:button和h:commandButton之间的区别

h:commandbutton,如何重定向到外部站点?(JSF 2)[重复]

h:commandbutton 与 ajax 调用错误的操作方法

h:commandButton 不能与 JSF bean 一起工作,而页面正在加载

JSF - 我如何实现 JavaScript “你确定吗?”提示输入 <h:commandButton>

两个不同的 h:commandButton 动作的条件渲染