gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:42:31 25 4
gpt4 key购买 nike

有时,当使用<h:commandLink><h:commandButton><f:ajax>时,根本不会调用与该标记关联的actionactionListenerlistener方法。或者,不使用提交的UIInput值更新Bean属性。

有哪些可能的原因和解决方案?

最佳答案

介绍

每当UICommand组件(<h:commandXxx><p:commandXxx>等)无法调用关联的操作方法,或者UIInput组件(<h:inputXxx><p:inputXxxx>等)无法处理提交的值和/或更新模型值,并且在服务器日志中看不到任何可谷歌搜索的异常和/或警告,也不会在您按照Exception handling in JSF ajax requests配置ajax异常处理程序时,或者在web.xml中的上下文参数下方设置时,

<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>


并且您也没有在浏览器的JavaScript控制台中看到任何可谷歌搜索的错误和/或警告(在Chrome / Firefox23 + / IE9 +中按F12键打开Web开发人员工具集,然后打开“控制台”标签),然后在可能的原因列表下进行工作。

可能的原因


UICommandUIInput组件必须放置在 UIForm组件内部,例如 <h:form>(因此不是纯HTML <form>),否则无法将任何内容发送到服务器。 UICommand组件也必须不具有 type="button"属性,否则它将是一个无效按钮,仅对JavaScript onclick有用。另请参见 How to send form input values and invoke a method in JSF bean<h:commandButton> does not initiate a postback
您不能相互嵌套多个 UIForm组件。这在HTML中是非法的。浏览器行为未指定。当心包含文件!您可以并行使用 UIForm组件,但是它们在提交期间不会相互处理。您还应该提防“上帝形态”反模式;确保您不会无意间以相同的形式处理/验证所有其他(不可见的)输入(例如,具有相同格式的必填输入的隐藏对话框)。另请参见 How to use <h:form> in JSF page? Single form? Multiple forms? Nested forms?
不应发生 UIInput值验证/转换错误。您可以使用 <h:messages>显示任何输入特定的 <h:message>组件未显示的消息。不要忘记将 id<h:messages>包含在 <f:ajax render>中(如果有的话),这样它也将根据ajax请求进行更新。另请参见 h:messages does not display messages when p:commandButton is pressed
如果将 UICommandUIInput组件放置在诸如 <h:dataTable><ui:repeat>等的迭代组件内,则需要确保在应用请求值期间保留与迭代组件完全相同的 value表单提交请求的阶段。 JSF将在其上重申以找到单击的链接/按钮和提交的输入值。将bean放在视图范围内和/或确保将数据模型加载到bean的 @PostConstruct中(因此不在getter方法中!)应该可以修复它。另请参见 How and when should I load the model from database for h:dataTable
如果动态源(如 UICommand)包含 UIInput<ui:include src="#{bean.include}">组件,则需要确保在表单提交请求的视图构建期间保留完全相同的 #{bean.include}值。 JSF将在构建组件树期间重新执行它。将bean放在视图范围内和/或确保将数据模型加载到bean的 @PostConstruct中(因此不在getter方法中!)应该可以修复它。另请参见 How to ajax-refresh dynamic include content by navigation menu? (JSF SPA)
在表单提交请求的应用请求值阶段,组件及其所有父级的 rendered属性以及任何父级 test / <c:if><c:when>属性不应求值为 false。 JSF将对其进行重新检查,以作为防范被篡改/被黑客入侵的保护措施的一部分。将负责该条件的变量存储在 @ViewScoped Bean中,或者确保已正确地在 @PostConstruct Bean的 @RequestScoped中预先初始化了该条件,可以对其进行修复。组件的 disabled属性也是如此,在应用请求值阶段,该属性不应评估为 true。另请参见 JSF CommandButton action not invokedForm submit in conditionally rendered component is not processed
onclick组件的 UICommand属性和 onsubmit组件的 UIForm属性不应返回 false或引起JavaScript错误。如果 <h:commandLink><f:ajax>在浏览器的JS控制台中也没有可见的JS错误。通常,使用Google搜索确切的错误消息已经可以给您答案。另请参见 Adding jQuery to PrimeFaces results in Uncaught TypeErrors
如果您通过JSF 2.x <f:ajax>或例如使用Ajax PrimeFaces <p:commandXxx>,请确保您在主模板中有一个 <h:head>,而不是 <head>。否则,JSF将无法自动包含包含Ajax函数的必要JavaScript文件。这将在浏览器的JS控制台中导致JavaScript错误,例如“未定义mojarra”或“未定义PrimeFaces”。另请参见 h:commandLink actionlistener is not invoked when used with f:ajax and ui:repeat
如果您使用的是Ajax,并且提交的值最终为 null,则请确保感兴趣的 UIInputUICommand组件被 <f:ajax execute>覆盖,例如 <p:commandXxx process>,否则将不会执行/处理它们。另请参见 Submitted form values not updated in model when adding <f:ajax> to <h:commandButton>Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes
如果提交的值最终仍然是 null,并且您正在使用CDI管理Bean,则请确保从正确的包中导入范围注释,否则CDI将默认为 @Dependent,这样可以在以下位置有效地重新创建Bean EL表达式的每个评估。另请参见 @SessionScoped bean looses scope and gets recreated all the time, fields become nullWhat is the default Managed Bean Scope in a JSF 2 application?
如果具有 <h:form>按钮的 UICommand的父级是事先通过来自同一页面中另一表单的ajax请求呈现/更新的,则第一个操作在JSF 2.2或更早版本中将始终失败。第二步和后续操作将起作用。这是由视图状态处理中的一个错误引起的,该错误报告为 JSF spec issue 790,目前已在JSF 2.3中修复。对于较旧的JSF版本,您需要在 <h:form>render中显式指定 <f:ajax>的ID。另请参见 h:commandButton/h:commandLink does not work on first click, works only on second click
如果 <h:form>设置了 enctype="multipart/form-data"以支持文件上传,那么您需要确保至少使用JSF 2.2,或者要确保负责解析多部分/表单数据请求的servlet过滤器是正确配置,否则 FacesServlet最终将根本没有任何请求参数,因此无法应用请求值。如何配置此类过滤器取决于所使用的文件上传组件。对于“战斧” <t:inputFileUpload>,请检查 this answer,对于PrimeFaces <p:fileUpload>,请检查 this answer。或者,如果您实际上根本没有上传文件,请完全删除该属性。
确保 ActionEventactionListener参数是 javax.faces.event.ActionEvent而不是 java.awt.event.ActionEvent,这是大多数IDE建议的第一种自动完成选项。如果使用 actionListener="#{bean.method}",则没有参数也是错误的。如果您不想在方法中使用参数,请使用 actionListener="#{bean.method()}"。或者,也许您实际上想使用 action而不是 actionListener。另请参见 Differences between action and actionListener
确保请求-响应链中没有任何 PhaseListener或任何 EventListener更改了JSF生命周期以通过例如调用 FacesContext#renderResponse()FacesContext#responseComplete()来跳过调用动作阶段。
确保同一请求-响应链中没有任何 FilterServlet以某种方式阻止了 FacesServlet的请求。
如果您使用的是PrimeFaces <p:dialog><p:overlayPanel>,请确保它们具有自己的 <h:form>。因为,默认情况下,JavaScript将这些组件重定位到HTML <body>的末尾。因此,如果他们最初坐在 <form>内,那么现在他们将不再坐在 <form>中。另见 p:commandbutton action doesn't work inside p:dialog
框架中的错误。例如,当使用具有 rich:calendar属性(或在某些情况下为 defaultLabel子元素)的 rich:placeholder UI元素时,RichFaces具有“ conversion error”。当没有为日历日期设置任何值时,此错误阻止Bean方法被调用。跟踪框架的错误可以通过从一个简单的工作示例开始并备份页面直到发现该错误来完成。


调试提示

万一您仍然卡住,该进行调试了。在客户端,按Web浏览器中的F12打开Web开发人员工具集。单击控制台选项卡,以便查看JavaScript。它应该没有任何JavaScript错误。下面的屏幕快照是来自Chrome的示例,演示了在未声明 <f:ajax>的情况下提交启用 <h:head>按钮的情况(如以上第7点所述)。

js console

单击网络选项卡以查看HTTP流量监视器。提交表单并调查请求标题和表单数据以及响应正文是否符合预期。下面的屏幕快照是一个来自Chrome的示例,该示例演示了一个简单表单的成功Ajax提交,该表单带有一个 <h:inputText>和一个 <h:commandButton>带有 <f:ajax execute="@form" render="@form">

network monitor

(警告:在生产环境中从上述HTTP请求标头发布屏幕截图时,请确保对屏幕截图中的所有会话cookie进行加扰/混淆),以避免会话劫持攻击!)

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

debug server

关于jsf - 未调用commandButton/commandLink/ajax操作/监听器方法或未设置/更新输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com