有时,在使用<h:commandLink>
,<h:commandButton>
或<f:ajax>
时,与该标记关联的action
,actionListener
或listener
方法只是没有被调用。或者,bean属性不会使用提交的UIInput
值进行更新。
可能的原因和解决方案是什么?
答案 0 :(得分:654)
答案 1 :(得分:52)
如果您的h:commandLink
位于h:dataTable
内,则h:commandLink
可能无效的另一个原因是:
绑定到h:dataTable
的基础数据源也必须在单击链接时触发的第二个JSF生命周期中可用。
因此,如果基础数据源是请求作用域,则h:commandLink
不起作用!
答案 2 :(得分:26)
虽然我的答案不是100%适用,但大多数搜索引擎都认为这是第一次点击,但我决定发布它:
如果您使用 PrimeFaces (或某些类似的API)p:commandButton
或p:commandLink
,您可能忘记明确将process="@this"
添加到您的命令组件。
正如PrimeFaces用户指南在第3.18节中所述,process
和update
的默认值都是@form
,这几乎与您对普通JSF {{1}的默认值相反。或者RichFaces,分别是f:ajax
和execute="@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>