<h:commandbutton>无法启动操作 - 没有IDEA?</h:commandbutton>

时间:2011-05-25 08:55:51

标签: java jsf richfaces

我正在尝试使用 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时,它就可以工作。

3 个答案:

答案 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