我正在尝试使用 dataModel 而不是绑定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&amp; test()),它可以正常工作。一切正常,直到我尝试使用dataModel private DataModel<Item> model;
...
当我只是将相同的commandButton移动到facet时,它就可以工作。
答案 0 :(得分:2)
如果bean是请求作用域,那么您需要确保在表单提交请求的bean(post)构造期间创建完全相同的模型,就像在显示初始表单时一样。
private List<Item> list;
private DataModel<Item> model;
@PostConstruct
public void init() {
list = itemService.list();
model = new ListDataModel<Item>(list);
}
JSF将在应用请求值阶段迭代模型,以确定按下的按钮,以便在调用应用程序阶段调用它。
如果由于某些业务限制(例如缺少参数等)而在后续请求中保留模型并非完全无关紧要,那么您需要将bean标记为@ViewScoped
而不是将其放在视图范围内@RequestScoped
。这仅在您使用JSF 2.0时有效。
@ManagedBean
@ViewScoped
public class MyBean {}
或者,由于您使用的是RichFaces,因此您也可以使用<a4j:keepAlive>
。把它放在与表格相同的页面中:
<a4j:keepAlive beanName="#{myBean}" />
这与JSF 2.0中的@ViewScoped
实际上相同。
答案 1 :(得分:1)
应该在<h:form>
答案 2 :(得分:1)
您的delete()
方法应该返回一个Object。如果签名不正确,则不会调用它。 “签名必须与java.lang.Object action()匹配”。请参阅here。
据我记得,如果你想留在页面,你可以返回null
。
public String delete()
{
System.out.println("TEST");
try
{
DaoCrud.delete(model.getRowData(), 'P');
}
catch (Exception e) {.....}
return null;
}
如果您不想使用方法结果进行导航,则可能需要将actionListener
属性与其对应的方法一起使用。如果您想在<a4j:commandButton>
执行后想要reRender,还可以考虑使用actionListener
。