我正在尝试使用 dataModel 而不是绑定(bind) dataTable 并遇到了这个问题。在最后一列有一个 commandButton 应该用于从数据库中删除项目。但是当我按下它时,java 方法没有启动。
部分xhtml(精简代码):
<h:form>
<rich:extendedDataTable
id="table"
var="fItem"
value="#{myFood.model}"
selectionMode="none">
<rich:column width="150px">
<f:facet name="header">Datum:</f:facet>
<h:outputText value="#{fItem.date}"/>
</rich:column>
<rich:column>
<h:commandButton id="save" action="#{myFood.delete}" value="delete"/>
</rich:column>
<f:facet name="footer">
<h:commandButton id="btnTest" action="#{myFood.test}" value="test"/>
</f:facet>
</rich:extendedDataTable>
</h:form>
MyFood.java 的一部分:
public void delete()
{
System.out.println("TEST");
try
{
DaoCrud.delete(model.getRowData(), 'P');
}
catch (Exception e) {.....}
}
public void test()
{
System.out.println("TEST");
}
但即使是“TEST”也没有写入控制台! 问题出在哪里?
更新:我已经更新了代码示例 (facet & test()),它可以工作。一切正常,直到我尝试使用 dataModel private DataModel<Item> model;
...
当我简单地将同一个 commandButton 移动到 facet 时,它就起作用了。
最佳答案
如果 bean 是请求范围的,那么您需要确保在 bean 的(后)构建表单提交请求期间创建了与显示初始表单期间相同的模型。
private List<Item> list;
private DataModel<Item> model;
@PostConstruct
public void init() {
list = itemService.list();
model = new ListDataModel<Item>(list);
}
JSF 将在应用请求值阶段迭代模型以确定按下的按钮,以便它可以在调用应用程序阶段被调用。
如果由于某些业务限制(例如缺少参数等)而在后续请求中保留模型并非微不足道,那么您需要通过将 bean 标记为 @ViewScoped
将其放入 View 范围内。而不是 @RequestScoped
.这仅在您使用 JSF 2.0 时有效。
@ManagedBean
@ViewScoped
public class MyBean {}
或者,由于您使用的是 RichFaces,您还可以使用 <a4j:keepAlive>
为了这。将其放在与表单相同的页面中的某个位置:
<a4j:keepAlive beanName="#{myBean}" />
这实际上与 @ViewScoped
相同在 JSF 2.0 中执行。
关于java - <h :commandButton> doesn't start the action - NO IDEA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6121860/