【问题标题】:<h:commandButton> doesn't start the action - NO IDEA?<h:commandButton> 不启动操作 - 没有想法?
【发布时间】:2011-05-25 08:55:50
【问题描述】:

我正在尝试使用 dataModel 而不是绑定 dataTable 并遇到此问题。在最后一列有一个命令按钮,应该用于从数据库中删除项目。但是当我按下它时,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&lt;Item&gt; model;... 当我简单地将相同的 commandButton 移动到构面时,它就可以工作了。

【问题讨论】:

  • 您使用的是什么 JEE 服务器?在某些环境下System.out.println 不起作用。用它来打印消息在其他地方有用吗?
  • 我用的是tomcat7,但是当我把commandButton放到脸上时,它工作正常...
  • 我不确定我理解你的意思是什么作品?还是按钮有效?
  • 我已经更新了我的帖子。刻面的 CommandButton 通常调用 test() 方法并将“TEST”写入控制台

标签: java jsf richfaces


【解决方案1】:

如果 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 而不是 @987654326 来将 bean 放入视图范围@。这仅在您使用 JSF 2.0 时才有效。

@ManagedBean
@ViewScoped
public class MyBean {}

或者,由于您使用的是 RichFaces,因此您也可以为此使用 &lt;a4j:keepAlive&gt;。将其放在与表单相同的页面中:

<a4j:keepAlive beanName="#{myBean}" />

这实际上与 JSF 2.0 中的 @ViewScoped 相同。

【讨论】:

  • 谢谢你,BalusC,我试试看,你能解释一下吗? list = itemService.list();
  • 这只是一个填写列表的示例。您可以使用任何方式来填写列表。但它应该就在那里发生。
  • BalusC,你没有一些工作的例子吗?也许我有点慢,但第一个问题是“ 标签库支持命名空间:richfaces.org/a4j,但没有为名称定义标签:keepAlive”和第二个“java.io.NotSerializableException: javax.faces .model.ListDataModel".........这对我来说不是必需的,但奇怪的是它不起作用:)
  • 哦,该标签已在 RF 4.0 中删除,以支持视图范围。对于数据模型,将其标记为transient 并在getter 中懒惰地实例化它。一些容器/webapp 配置将会话存储在磁盘而不是内存上,那么视图/会话范围的对象需要实现Serializable
  • 啊哈,我之前尝试过瞬态,但没有惰性吸气剂实例化。现在它正在工作,虽然我必须说,不明白为什么:)谢谢!
【解决方案2】:

应该在&lt;h:form&gt;

【讨论】:

    【解决方案3】:

    您的delete() 方法应该返回一个对象。如果签名不正确,它将不会被调用。 “签名必须匹配 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 属性及其相应的方法。如果您想在执行 actionListener 之后重新渲染某些内容,还可以考虑使用 &lt;a4j:commandButton&gt;

    【讨论】:

    • 谢谢,但字符串输出没有帮助。我在没有重定向的情况下使用它,并且在方面按钮正常工作......
    • 你能在哪里展示代码吗?按钮在哪个方面,bean 方法看起来如何?如果签名不正确,它不应该工作......
    • 嗯,您是否尝试更改签名但没有帮助?
    • 重命名方法?是的,什么都没发生 :(
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2011-04-17
    • 2013-07-18
    相关资源
    最近更新 更多