gpt4 book ai didi

jsf - commandButton/commandLink/ajax action/listener 方法未调用或输入值未设置/更新

转载 作者:行者123 更新时间:2023-12-01 23:30:26 25 4
gpt4 key购买 nike

有时,在使用 <h:commandLink> 时, <h:commandButton><f:ajax> , action , actionListenerlistener与标签关联的方法根本没有被调用。或者,bean 属性未通过提交的 UIInput 更新值。

造成这种情况的可能原因和解决方法是什么?

最佳答案

介绍
每当 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组件并行,但它们在提交期间不会相互处理。你还应该注意“God Form”反模式;确保您不会无意中以完全相同的形式处理/验证所有其他(不可见的)输入(例如,以完全相同的形式具有包含所需输入的隐藏对话框)。另见 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 放入 View 范围和/或确保在 @PostConstruct 中加载数据模型的 bean(因此不在 getter 方法中!)应该修复它。另见 How and when should I load the model from database for h:dataTable .
  • UICommandUIInput组件包含在动态源中,例如 <ui:include src="#{bean.include}"> ,那么你需要确保完全一样#{bean.include}在表单提交请求的 View 构建期间保留值。 JSF 将在构建组件树期间重新执行它。将 bean 放入 View 范围和/或确保在 @PostConstruct 中加载数据模型的 bean(因此不在 getter 方法中!)应该修复它。另见 How to ajax-refresh dynamic include content by navigation menu? (JSF SPA) .
  • rendered组件及其所有父级的属性以及 test任何父级的属性 <c:if>/<c:when>不应评估为 false在表单提交请求的应用请求值阶段。 JSF 将重新检查它,作为防止篡改/黑客请求的保护措施的一部分。将负责条件的变量存储在 @ViewScoped 中bean 或确保您正确地预初始化了 @PostConstruct 中的条件的 @RequestScoped bean 应该修复它。这同样适用于 disabledreadonly组件的属性,不应计算为 true在应用请求值阶段。另见 JSF CommandButton action not invoked , Form submit in conditionally rendered component is not processed , h:commandButton is not working once I wrap it in a <h:panelGroup rendered>Force JSF to process, validate and update readonly/disabled input components anyway
  • onclick UICommand 的属性组件和 onsubmit UIForm 的属性组件不应返回 false或导致 JavaScript 错误。在 <h:commandLink> 的情况下应该有或 <f:ajax>在浏览器的 JS 控制台中也没有可见的 JS 错误。通常谷歌搜索确切的错误信息已经会给你答案。另见 Manually adding / loading jQuery with PrimeFaces results in Uncaught TypeErrors .
  • 如果您通过 JSF 2.x 使用 Ajax <f:ajax>或例如PrimeFaces <p:commandXxx> ,请确保您拥有 <h:head>在主模板中而不是 <head> .否则 JSF 将无法自动包含包含 Ajax 函数的必要 JavaScript 文件。这将导致在浏览器的 JS 控制台中出现类似“mojarra 未定义”或“PrimeFaces 未定义”之类的 JavaScript 错误。另见 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它在每次对 EL 表达式的评估时有效地重新创建 bean。另见 @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 或更早版本中,第一个操作将始终失败。第二个和随后的操作将起作用。这是由 View 状态处理中的错误引起的,报告为 JSF spec issue 790目前已在 JSF 2.3 中修复。对于较旧的 JSF 版本,您需要明确指定 <h:form> 的 ID。在 render<f:ajax> .另见 h:commandButton/h:commandLink does not work on first click, works only on second click .
  • 如果<h:form>enctype="multipart/form-data"设置以支持文件上传,那么您需要确保您使用的至少是 JSF 2.2,或者负责解析 multipart/form-data 请求的 servlet 过滤器已正确配置,否则 FacesServlet最终将完全没有请求参数,因此无法应用请求值。如何配置这样的过滤器取决于所使用的文件上传组件。战斧用<t:inputFileUpload> , 检查 this answer和 PrimeFaces <p:fileUpload> , 检查 this answer .或者,如果您实际上根本没有上传文件,则完全删除该属性。
  • 确保 ActionEvent actionListener 的论据是 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 的请求不知何故。例如,登录/安全过滤器,如 Spring Security。特别是在默认情况下根本没有 UI 反馈的 ajax 请求中。另见 Spring Security 4 and PrimeFaces 5 AJAX request handling .
  • 如果您使用的是 PrimeFaces <p:dialog><p:overlayPanel> ,然后确保他们有自己的 <h:form> .因为,这些组件默认由 JavaScript 重新定位到 HTML 的末尾 <body> .所以,如果他们原本坐在 <form> 里面,那么他们现在就不会再坐在 <form> .另见 p:commandbutton action doesn't work inside p:dialog
  • 框架中的错误。例如,当使用 rich:calendar 时,RichFaces 有一个“conversion error”带有 defaultLabel 的 UI 元素属性(或者,在某些情况下,是 rich:placeholder 子元素)。当没有为日历日期设置值时,此错误会阻止调用 bean 方法。可以通过从一个简单的工作示例开始并备份页面直到发现错误来完成跟踪框架错误。

  • 调试提示
    如果你仍然卡住,是时候调试了。在客户端,在 webbrowser 中按 F12 打开 web 开发人员工具集。单击控制台选项卡,查看 JavaScript 控制台。它应该没有任何 JavaScript 错误。下面的截图是 Chrome 的一个例子,它演示了提交 <f:ajax> 的情况。启用按钮而没有 <h:head>已声明(如上文第 7 点所述)。
    js console
    单击网络选项卡以查看 HTTP 流量监视器。提交表单并调查请求 header 和表单数据以及响应正文是否符合预期。下面的截图是 Chrome 的一个例子,它演示了一个简单的表单的成功 ajax 提交,只有一个 <h:inputText>和一个 <h:commandButton><f:ajax execute="@form" render="@form"> .
    network monitor
    (警告:当您在生产环境中发布来自上述 HTTP 请求 header 的屏幕截图时,请确保您对屏幕截图中的任何 session cookie 进行了加扰/混淆处理以避免 session 劫持攻击!)
    在服务器端,确保服务器以 Debug模式启动。在您希望在处理表单提交期间调用的感兴趣的 JSF 组件的方法中放置一个调试断点。例如。在 UICommand 的情况下组件,即 UICommand#queueEvent() 如果是 UIInput组件,即 UIInput#validate() .只需逐步执行代码并检查流程和变量是否符合预期。下面的屏幕截图是来自 Eclipse 调试器的示例。
    debug server

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

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