commandButton / commandLink / ajax动作/侦听器方法未调用或输入值未设置/更新

时间:2010-01-22 16:18:47

标签: jsf jsf-2 action commandbutton commandlink

有时,在使用<h:commandLink><h:commandButton><f:ajax>时,与该标记关联的actionactionListenerlistener方法只是没有被调用。或者,bean属性不会使用提交的UIInput值进行更新。

可能的原因和解决方案是什么?

12 个答案:

答案 0 :(得分:654)

答案 1 :(得分:52)

如果您的h:commandLink位于h:dataTable内,则h:commandLink可能无效的另一个原因是:

绑定到h:dataTable的基础数据源也必须在单击链接时触发的第二个JSF生命周期中可用。

因此,如果基础数据源是请求作用域,则h:commandLink不起作用!

答案 2 :(得分:26)

虽然我的答案不是100%适用,但大多数搜索引擎都认为这是第一次点击,但我决定发布它:

如果您使用 PrimeFaces (或某些类似的API)p:commandButtonp:commandLink,您可能忘记明确将process="@this"添加到您的命令组件。

正如PrimeFaces用户指南在第3.18节中所述,processupdate的默认值都是@form,这几乎与您对普通JSF {{1}的默认值相反。或者RichFaces,分别是f:ajaxexecute="@this"

我花了很长时间才找到答案。 (...而且我认为使用与JSF不同的默认值是相当不清楚的!)

答案 3 :(得分:9)

我想提一下有关Primefaces p:commandButton的一些事情!

当您使用p:commandButton进行需要在服务器上执行的操作时,您无法使用type="button",因为这是用于按钮的执行自定义javascript而不会向服务器发出ajax / non-ajax请求。

为此,您可以分配type属性(默认值为"submit"),也可以明确使用type="submit"

希望这会对某人有所帮助!

答案 4 :(得分:3)

我自己也遇到了这个问题,并找到了解决这个问题的另一个原因。 如果你的支持bean中没有用于* .xhtml中使用的属性的setter方法,那么就不会调用该操作。

答案 5 :(得分:3)

我最近遇到的问题是UICommand没有使用IBM Extended Faces Components在JSF 1.2应用程序中调用。

我在数据表的一行(扩展版本,<hx:datatable>)上有一个命令按钮,并且UICommand不会从表中的某些行触发(不会触发的行是大于行的行)默认行显示大小)。

我有一个下拉组件,用于选择要显示的行数。支持此字段的值位于RequestScope。支持表格本身的数据有点ViewScope(实际上,暂时位于SessionScope)。

如果通过控件增加行显示,该值也绑定到数据表的rows属性,则由于此更改而显示的任何行都不会在单击时触发UICommand。

将此属性放在与表数据本身相同的范围内可以解决问题。

我认为在上面的BalusC#4中提到了这一点,但不仅表值必须是View或Session作用域,还包括控制该表上显示的行数的属性。

答案 6 :(得分:2)

我也遇到了这个问题,并且在打开浏览器的Web控制台后才真正开始磨练根本原因。在此之前,我无法收到任何错误消息(即使使用<p:messages>)。 Web控制台显示从<h:commandButton type="submit" action="#{myBean.submit}">返回的HTTP 405状态代码。

就我而言,我有一个混合的vanilla HttpServlet通过Auth0提供OAuth身份验证,以及执行我的应用程序视图和业务逻辑的JSF facelets和bean。

一旦我重构了我的web.xml,并删除了一个中间人servlet,它就“神奇地”工作了。

最重要的是,问题是中间人servlet正在使用RequestDispatcher.forward(...)从HttpServlet环境重定向到JSF环境,而在它之前调用的servlet是使用HttpServletResponse.sendRedirect重定向的(......)。

基本上,使用sendRedirect()允许JSF“容器”获得控制权,而RequestDispatcher.forward()显然不是。

我不知道为什么facelet能够访问bean属性但无法设置它们,这显然是为了消除servlet和JSF的混合而尖叫,但我希望这可以帮助别人避免很多时间从头到桌的敲打。

答案 7 :(得分:0)

调试<h:commandLink> richfaces中的datatable操作拒绝触发的问题,我有很多乐趣。该表曾经在某个时刻工作,但没有明显原因停止。我不遗余力,只是发现我的rich:datatable使用的是错误的rowKeyConverter,它返回了富有乐趣用作行键的空值。这阻止了我的<h:commandLink>操作被调用。

答案 8 :(得分:0)

还有一种可能性:如果症状是第一次调用有效,但后续调用无效,则可能正在使用PrimeFaces 3.x和JSF 2.2,详见此处:No ViewState is sent

答案 9 :(得分:-1)

我解决了放置以下问题:

<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>

在:

<h:form>
     <h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>

答案 10 :(得分:-1)

这是为我工作的解决方案。

<p:commandButton id="b1" value="Save" process="userGroupSetupForm"
                    actionListener="#{userGroupSetupController.saveData()}" 
                    update="growl userGroupList userGroupSetupForm" />

此处,对于Ajax调用,必须使用process =“ userGroupSetupForm”属性。 actionListener正在从@ViewScope Bean调用方法。还更新咆哮消息,数据表:userGroupList和表单:userGroupSetupForm。

答案 11 :(得分:-2)

<ui:composition>  
  <h:form id="form1">
    <p:dialog id="dialog1">
      <p:commandButton value="Save" action="#{bean.method1}" /> <!--Working-->
    </p:dialog>
  </h:form>

  <h:form id="form2">
    <p:dialog id="dialog2">
      <p:commandButton value="Save" action="#{bean.method2}" /> <!--Not Working-->
    </p:dialog>
  </h:form>
</ui:composition>

解决;

<ui:composition>  
  <h:form id="form1">
    <p:dialog id="dialog1">
      <p:commandButton value="Save" action="#{bean.method1}" />   <!-- Working  -->
    </p:dialog>

    <p:dialog id="dialog2">
      <p:commandButton value="Save" action="#{bean.method2}" />   <!--Working  -->
    </p:dialog>
  </h:form>
  <h:form id="form2">
    <!-- ..........  -->
  </h:form>
</ui:composition>