有时,当使用<h:commandLink>, <h:commandButton>或<f:ajax>时,与标记相关的action, actionListener或listener方法根本没有被调用。或者,bean属性没有更新提交的UIInput值。
可能的原因和解决方法是什么?
有时,当使用<h:commandLink>, <h:commandButton>或<f:ajax>时,与标记相关的action, actionListener或listener方法根本没有被调用。或者,bean属性没有更新提交的UIInput值。
可能的原因和解决方法是什么?
当前回答
我最近遇到了一个问题,在使用IBM Extended Faces Components的JSF 1.2应用程序中没有调用uiccommand。
我在数据表的一行上有一个命令按钮(扩展版本,所以<hx:datatable>), UICommand不会从表中的某些行中触发(不会触发的行是大于默认行显示大小的行)。
我有一个下拉组件,用于选择要显示的行数。支持该字段的值在RequestScope中。支持表本身的数据在某种ViewScope中(实际上,暂时在SessionScope中)。
如果通过绑定到数据表的rows属性的控件来增加行显示,那么在单击此更改后显示的任何行都不能触发UICommand。
将此属性置于与表数据本身相同的作用域中可以解决这个问题。
我认为这在上面的balusc# 4中有所暗示,但不仅表值需要为View或Session范围,而且还需要控制表上显示的行数的属性。
其他回答
还有一种可能性:如果症状是第一次调用有效,但随后的调用无效,那么您可能使用的是PrimeFaces 3。在JSF 2.2中,没有ViewState被发送。
我想再提一点关于Primefaces的p:commandButton!
当你使用p:commandButton来执行需要在服务器上执行的操作时,你不能使用type="button",因为这是用于Push按钮的,用于执行自定义javascript,而不会向服务器发出ajax/非ajax请求。
为此,您可以免除type属性(默认值是"submit"),也可以显式地使用type="submit"。
希望这能帮助到一些人!
这就是解决方法,对我来说很管用。
<p:commandButton id="b1" value="Save" process="userGroupSetupForm"
actionListener="#{userGroupSetupController.saveData()}"
update="growl userGroupList userGroupSetupForm" />
这里,process="userGroupSetupForm"属性是Ajax调用的强制属性。actionListener从@ViewScope Bean调用一个方法。也更新咆哮消息,数据表:userGroupList和表单:userGroupSetupForm。
虽然我的答案不是100%适用,但大多数搜索引擎都会把它作为第一个搜索结果,但我还是决定把它贴出来:
如果您正在使用PrimeFaces(或一些类似的API) p:commandButton或p:commandLink,那么您可能忘记显式地将process="@this"添加到命令组件中。
正如PrimeFaces用户指南在3.18节中所述,process和update的默认值都是@form,这与普通JSF f:ajax或RichFaces的默认值截然相反,后者分别是execute="@this"和render="@none"。
只是我花了很长时间才发现。(…而且我认为使用与JSF不同的默认值是相当不聪明的!)
如果你的h:commandLink在h:dataTable中,还有另一个原因,为什么h:commandLink可能不起作用:
绑定到h:dataTable的底层数据源也必须在单击链接时触发的第二个JSF-Lifecycle中可用。
因此,如果底层数据源是请求作用域,h:commandLink将不起作用!