问题描述
|
我正在尝试使用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和test()),它可以工作。一切正常,直到我尝试使用dataModelprivate DataModel<Item> model;
...
当我简单地将相同的commandButton移动到构面时,它就可以工作。
解决方法
如果bean是请求范围的,那么您需要确保在bean的表单提交请求的(后)构造过程中创建的模型与显示初始表单时创建的模型完全相同。
private List<Item> list;
private DataModel<Item> model;
@PostConstruct
public void init() {
list = itemService.list();
model = new ListDataModel<Item>(list);
}
JSF将在应用请求值阶段期间迭代模型,以确定按下的按钮,以便可以在调用应用程序阶段将其调用。
如果由于某些业务限制(例如,缺少参数等)而在后续请求中保留模型并不简单,那么您需要通过将Bean标记为“ 4”而不是“ 5”来将其放入视图范围。仅当您使用JSF 2.0时,此方法才有效。
@ManagedBean
@ViewScoped
public class MyBean {}
另外,由于您使用的是RichFaces,因此也可以使用<a4j:keepAlive>
。将其放在与表单相同的页面中的某个位置:
<a4j:keepAlive beanName=\"#{myBean}\" />
这实际上与JSF 2.0中的“ 4”相同。
,应该在ѭ10以下
,您的delete()
方法应返回一个对象。如果签名不正确,将不会调用它。 \“签名必须匹配java.lang.Object action()\”。看这里。
据我记得,如果您想停留在页面上,可以只返回null
。
public String delete()
{
System.out.println(\"TEST\");
try
{
DaoCrud.delete(model.getRowData(),\'P\');
}
catch (Exception e) {.....}
return null;
}
如果不想使用方法结果进行导航,则可能要使用actionListener
属性及其对应的方法。如果要在执行actionListener
之后重新渲染某些内容,也可以考虑使用<a4j:commandButton>
。