Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf commandButton/commandLink/ajax操作/侦听器方法未调用或输入值未设置/更新_Jsf_Jsf 2_Action_Commandbutton_Commandlink - Fatal编程技术网

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

Jsf commandButton/commandLink/ajax操作/侦听器方法未调用或输入值未设置/更新,jsf,jsf-2,action,commandbutton,commandlink,Jsf,Jsf 2,Action,Commandbutton,Commandlink,有时,在使用或时,与标记关联的action、actionListener或listener方法没有被调用。或者,bean属性不会用提交的UIInput值更新 可能的原因和解决方案是什么?引言 每当UICommand组件etc未能调用关联的操作方法,或UIInput组件etc未能处理提交的值和/或更新模型值,并且您在服务器日志中没有看到任何Google异常和/或警告时,也不是根据配置ajax异常处理程序时,当您在web.xml中设置以下上下文参数时 在浏览器的JavaScript控制台中,您也没有

有时,在使用或时,与标记关联的action、actionListener或listener方法没有被调用。或者,bean属性不会用提交的UIInput值更新

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

引言 每当UICommand组件etc未能调用关联的操作方法,或UIInput组件etc未能处理提交的值和/或更新模型值,并且您在服务器日志中没有看到任何Google异常和/或警告时,也不是根据配置ajax异常处理程序时,当您在web.xml中设置以下上下文参数时

在浏览器的JavaScript控制台中,您也没有看到任何Googleable错误和/或警告。在Chrome/Firefox23+/IE9+中按F12打开web developer工具集,然后打开console选项卡,然后处理下面列出的可能原因

可能原因 UICommand和UIInput组件必须放在UIForm组件中,例如,因此不能放在普通HTML中,否则无法向服务器发送任何内容。UICommand组件也不能有type=button属性,否则它将是一个死按钮,只对JavaScript onclick有用。另见和

不能将多个UIForm组件相互嵌套。这在HTML中是非法的。未指定浏览器行为。小心包含文件!您可以并行使用UIForm组件,但它们在提交期间不会相互处理。你也应该和上帝一起警惕反模式;确保您不会无意中以相同的形式处理/验证所有其他不可见的输入,例如,使用隐藏对话框以相同的形式处理所需的输入。另见

不应发生UIInput值验证/转换错误。您可以使用显示任何输入特定组件未显示的任何消息。不要忘记在中包含的id(如果有的话),这样它也会在ajax请求中更新。另见

如果UICommand或UIInput组件放置在迭代组件(如等)中,则需要确保在表单提交请求的应用请求值阶段保留完全相同的迭代组件值。JSF将在上面重复查找单击的链接/按钮和提交的输入值。将bean放入视图范围和/或确保将数据模型加载到bean的@PostConstruct中,从而不加载到getter方法中!你应该把它修好。另见

如果UICommand或UIInput组件由动态源(如)包含,则需要确保在表单提交请求的视图生成期间保留完全相同的{bean.include}值。JSF将在构建组件树期间重新执行它。将bean放入视图范围和/或确保将数据模型加载到bean的@PostConstruct中,从而不加载到getter方法中!你应该把它修好。另见

在表单提交请求的应用请求值阶段,组件及其所有父级的呈现属性和任何父级/的测试属性不应计算为false。JSF将重新检查它,作为防止篡改/黑客请求的一部分。将负责该条件的变量存储在@ViewScoped bean中,或者确保在@RequestScoped bean的@PostConstruct中正确预初始化该条件,应该可以解决这个问题。这同样适用于组件的禁用和只读属性,在应用请求值阶段,这些属性的计算结果不应为true。另见,和

UICommand组件的onclick属性和UIForm组件的onsubmit属性不应返回false或导致JavaScript错误。在浏览器的JS控制台中,如果出现JS错误,也应该没有可见的JS错误。通常,谷歌搜索准确的错误信息会给你答案。另见

如果您通过JSF2.x或PrimeFaces使用Ajax,请确保主模板中有a而不是。否则JSF将无法自动包含包含Ajax函数的必要JavaScript文件。这将导致一个JavaScript错误,如Mojara未定义或PrimeFaces未在浏览器的JS控制台中定义。另见

如果您使用的是Ajax,并且提交的值最终为null,那么请确保感兴趣的UIInput和UICommand组件包含在or中,例如,否则它们将不会被执行/处理。另见和

如果提交的值仍然为null,并且您正在使用CDI管理bean,那么请确保从正确的包导入范围注释,否则CDI将默认为@Dependent,这将在EL表达式的每次计算中有效地重新创建bean。另见和

如果是父母 如果同一页面中的另一个表单的ajax请求预先呈现/更新了带有UICommand按钮的表单,那么在JSF2.2或更早版本中,第一个操作将始终失败。第二步和后续行动将起作用。这是由视图状态处理中的一个bug引起的,该bug在JSF2.3中报告为并已修复。对于较旧的JSF版本,需要在的呈现中显式指定的ID。另见

如果为了支持文件上传而设置了enctype=multipart/form数据集,那么您需要确保至少使用了JSF 2.2,或者正确配置了负责解析multipart/form数据请求的servlet过滤器,否则FacesServlet最终将无法获得任何请求参数,因此无法应用请求值。如何配置这样的过滤器取决于所使用的文件上载组件。对于Tomahawk,请检查;对于PrimeFaces,请检查。或者,如果您实际上根本没有上传文件,那么就完全删除该属性

确保actionListener的ActionEvent参数是javax.faces.event.ActionEvent,因此不是java.awt.event.ActionEvent,这是大多数IDE建议的第一个自动完成选项。如果使用actionListener={bean.method},则没有参数也是错误的。如果您不想在方法中使用参数,请使用actionListener={bean.method}。或者,您实际上想使用action而不是actionListener。另见

确保请求-响应链中没有PhaseListener或任何EventListener更改JSF生命周期以跳过调用操作阶段,例如调用FacesContextrenderResponse或FacesContextresponseComplete

确保同一请求-响应链中没有筛选器或Servlet以某种方式阻止FacesServlet的请求。例如,登录/安全过滤器,如Spring security。特别是在ajax请求中,默认情况下,这些请求将完全没有UI反馈。另见

如果您使用的是PrimeFaces或,请确保它们有自己的。因为,默认情况下,JavaScript会将这些组件重新定位到HTML的末尾。所以,如果他们最初坐在a里面,那么他们现在就不会再坐在a里面了。另见

框架中的Bug。例如,RichFaces在使用带有defaultLabel属性的rich:calendar UI元素时,或者在某些情况下,使用rich:placeholder子元素时,会出现一个错误。当没有为日历日期设置任何值时,此错误阻止调用bean方法。跟踪框架bug可以通过从一个简单的工作示例开始并构建页面备份直到发现bug来完成

调试提示 如果你仍然结巴,是时候调试了。在客户端,在webbrowser中按F12以打开web developer工具集。单击Console选项卡,查看JavaScript conosle。它应该没有任何JavaScript错误。下面的屏幕截图是来自Chrome的一个示例,它演示了提交一个已启用按钮的情况,而没有按照上面第7点所述进行声明

单击网络选项卡以查看HTTP流量监视器。提交表单并调查请求标题、表单数据和响应正文是否符合预期。下面的屏幕截图是来自Chrome的一个示例,它演示了一个简单表单的成功ajax提交,其中包含一个和一个

警告:当您从生产环境发布上述HTTP请求头的屏幕截图时,请确保对屏幕截图中的任何会话cookie进行加扰/模糊处理,以避免会话劫持攻击

在服务器端,确保服务器以调试模式启动。在感兴趣的JSF组件的方法中放置调试断点,您希望在处理表单提交期间调用该组件。例如,如果是UICommand组件,则为;如果是UIInput组件,则为。只需逐步执行代码,并检查流程和变量是否符合预期。下面的屏幕截图是Eclipse调试器的一个示例

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

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


因此,如果底层数据源是请求范围的,则h:commandLink不起作用

虽然我的答案不是100%适用,但大多数搜索引擎都认为这是第一个成功的答案,但我决定将其发布为非恶意:

如果您使用的是PrimeFaces或类似的API p:commandButton或p:commandLink,那么很可能您忘记了将process=@this显式添加到命令组件中

正如PrimeFaces用户指南在第3.18节中所述,process和update的默认值都是@form,这与普通JSF f:ajax或Ri的默认值几乎相反 chface,分别是execute=@this和render=@none


我花了很长时间才发现。。。我认为使用不同于JSF的默认值是相当不明确的

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

我想再提一件与Primefaces的p:commandButton有关的事情

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

为此,您可以分配type属性默认值为submit,也可以显式使用type=submit


希望这能帮助别人

我最近遇到了一个问题,使用IBM Extended Faces组件的JSF 1.2应用程序中没有调用UICommand

我在扩展版本的datatable的一行上有一个命令按钮,因此UICommand不会从表中的某些行触发。不会触发的行是大于默认行显示大小的行

我有一个下拉组件,用于选择要显示的行数。支持此字段的值在RequestScope中。支持表本身的数据实际上是在某种ViewScope中,暂时在SessionScope中

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

将此属性与表数据本身放在同一范围内修复了该问题


我认为上面的BalusC 4中提到了这一点,但表值不仅需要在视图或会话范围内,而且还需要控制该表上显示的行数的属性。

我也遇到了这个问题,在打开浏览器的web控制台后才真正开始研究根本原因。在此之前,我无法获得任何错误消息,即使使用。web控制台显示了从服务器返回的HTTP 405状态代码

在我的例子中,我混合了一些普通的HttpServlet,它们通过Auth0和JSF facelets提供OAuth身份验证,并使用bean执行我的应用程序视图和业务逻辑

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

总之,问题是中间人servlet使用的是RequestDispatcher.forward。。。从HttpServlet环境重定向到JSF环境,而在此之前调用的servlet使用HttpServletResponse.sendRedirect进行重定向

基本上,使用sendRedirect允许JSF容器控制,而RequestDispatcher.forward显然不允许


我不知道的是,为什么facelet能够访问bean属性,但不能设置它们,这显然是对废除Servlet和JSF的混合的强烈要求,但我希望这能帮助人们避免长时间的对桌碰撞。

我在调试richfaces datatable中a的动作拒绝触发的问题时玩得很开心。这张桌子曾经在某个地方工作过,但没有明显的原因就停止了。我想尽一切办法,结果发现我的rich:datatable使用了错误的rowKeyConverter,它返回了richfaces乐意用作行键的空值。这就阻止了我的操作被调用。

还有一种可能性:如果症状是第一次调用有效,但后续调用无效,那么您可能正在将PrimeFaces 3.x与JSF 2.2一起使用,如下所述:。

我修复了放置:

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

解决

<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>
这就是解决方案,对我来说是有效的


这里,process=userGroupSetupForm属性对于Ajax调用是必需的。actionListener正在从@ViewScope Bean调用一个方法。还更新了咆哮消息、Datatable:userGroupList和Form:userGroupSetupForm。

你的第二点让我思考了很久。我刚刚发现我的主文件中的f:view标记是我大部分问题的原因。可能是因为它呈现了一个表单,对吧?@pauloguedes我找不到任何声明f:view呈现表单的东西。我的理解是,它只是一个容器。根据我的经验,f:view不会呈现任何元素。@balusc对第4点有一点澄清,如果commandLink本身不在dataTable中,这是否仍然重要?谢谢,关键是:将bean放入视图范围和/或确保在bean的postconstructor中加载数据模型,而不是在getter方法中!库克杰:这会引发一个EL异常,这个异常已经在回答的第1段中讨论过了,但我并不完全清楚。无论如何,我希望我的回答是有帮助的,因为在我的情况下,至少我没有明确地处理问题

使用UICommand/UIData输入y。解决方案是将一个支持bean从请求范围提升到会话范围…我第二个Jens注释…将我的请求范围bean设置为SessionScope使我的dataTable有所不同-感谢PrimeFaces进程的默认值是@form。因此,如果操作不是以这种方式调用的,而是在使用@this时调用的,那么我的答案中的第3点很可能适用。这不可能。我有一个p:commandButton,在添加process=@this之前,它没有调用actionListener方法。此外,《PrimeFaces用户指南》明确列出了我在第3.18节和第3.19节中提到的默认设置。在这里:。。。可能是默认值被更改了?这可能是文档中的错误。Remove process=@this并添加或只是读取排队但未显示消息的服务器日志,您将看到实际上发生了转换/验证错误。为什么删除此问题?我认为它现在可能没有太大价值。。。我取消了它的删除。它应该会导致一个相当自我解释的PropertyNotWritableException。如果您没有看到它,可能您在没有适当的ajax异常处理程序的情况下启动了ajax请求,但您应该在服务器日志中看到它。直到我将p:commandButton的ajax=false设置为p:commandButton时,它才显示该异常。谢天谢地,您救了我的命这是我在其中一个页面中遇到的主要问题,接受答案中的任何一点都没有让我们更接近,你在哪里找到这些信息的?好吧,我有过很多次这个问题,我做过研究,发现p:commandButton有几个类型属性值,button是一个与客户端有关的属性。在Primefaces文档中很难找到这一点,但这里有一个链接:您的提交提示解决了我几天来一直面临的问题。非常感谢你的帖子!谢谢,这是我的荣幸。我故意提出这个答案,因为我们很多人都有这样的问题。我也失去了几天的时间,直到我意识到这是怎么回事。这是投票数超过600的答案中的1。没有必要把它作为一个单独的答案来写。对不起,但我个人认为这完全不是真的。您有效地声明了两个对话框需要以各自的形式工作。你有99%的把握解决了一个不同的问题,你现在认为这就是解决方案…这是包含在页面中的。也许这会引起问题。你应该在投票前测试。不,你应该在发帖前创建一个测试,只有这样我才能测试。。。是的,include可能会导致对话框和表单出现问题,但问题仍然不是您在这里想要解决的。第一个例子非常好,第二个是100%确定的,无论如何,它不是一个不存在的问题的解决方案。我的应用程序运行良好。我认为对话框在表单中的位置并不重要。我必须创建第二个表单来解决另一个问题。您的应用程序可能正在工作,但从原始问题和您的解决方案中看不清楚/可见。此外,你说,我认为对话框在表单中的位置并不重要_但在你的回答中,他们在哪里似乎很重要。支持我陈述的矛盾。对不起,但你的答案显然是错的。。。已经有另一个反对票了
<h:form>
     <h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>
<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>
<p:commandButton id="b1" value="Save" process="userGroupSetupForm"
                    actionListener="#{userGroupSetupController.saveData()}" 
                    update="growl userGroupList userGroupSetupForm" />