h:commandButton 在 h:dataTable 中不起作用
Posted
技术标签:
【中文标题】h:commandButton 在 h:dataTable 中不起作用【英文标题】:h:commandButton not working inside h:dataTable 【发布时间】:2011-12-23 11:33:11 【问题描述】:我正在尝试在dataTable
中执行action
到commandButton
,但是当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:commandbutton,如何重定向到外部站点?(JSF 2)[重复]
h:commandbutton 与 ajax 调用错误的操作方法
h:commandButton 不能与 JSF bean 一起工作,而页面正在加载