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

jq6vz3qz  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(526)

有时,当使用 <h:commandLink> , <h:commandButton><f:ajax> 这个 action , actionListenerlistener 与标记关联的方法不会被调用。或者,bean属性不使用submitted更新 UIInput 价值观
可能的原因和解决方案是什么?

piah890a

piah890a1#

导言

每当 UICommand 组成部分( <h:commandXxx> , <p:commandXxx> 等)无法调用关联的操作方法,或 UIInput 组成部分( <h:inputXxx> , <p:inputX> ,等等)无法处理提交的值和/或更新模型值,并且在服务器日志中没有看到任何Google异常和/或警告,也不是在根据jsf ajax请求中的异常处理配置ajax异常处理程序时,也不是在中设置以下上下文参数时 web.xml ,

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

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

可能原因 UICommandUIInput 组件必须放置在 UIForm 组件,例如。 <h:form> (因此不是简单的html <form> ),否则无法向服务器发送任何内容。 UICommand 组件也不得具有 type="button" 属性,否则它将是一个只对javascript有用的死按钮 onclick . 另请参见如何发送表单输入值和调用JSFbean中的方法,并且<h:commandbutton>不会启动回发。

不能嵌套多个 UIForm 组件之间相互关联。这在html中是非法的。未指定浏览器行为。小心包含文件!你可以用 UIForm 组件是并行的,但它们在提交期间不会相互处理。你也应该注意“上帝形态”反模式;确保您不会无意中处理/验证同一格式的所有其他(不可见)输入(例如,有一个隐藏对话框,其中包含同一格式的所需输入)。另请参见如何在jsf页面中使用<h:form>?单一形式?多种形式?嵌套形式?。
UIInput 应已发生值验证/转换错误。你可以用 <h:messages> 显示任何特定输入未显示的任何消息 <h:message> 组件。别忘了包括 id 属于 <h:messages><f:ajax render> ,以便在ajax请求时也对其进行更新。另请参见按下p:commandbutton时h:messages不显示消息。
如果 UICommandUIInput 组件放置在迭代组件中,如 <h:dataTable> , <ui:repeat> ,等等,然后您需要确保完全相同 value 在表单提交请求的apply request values阶段,将保留迭代组件的属性。jsf将在上面重复查找单击的链接/按钮和提交的输入值。将bean放入视图范围和/或确保加载数据模型 @PostConstruct bean(因此不是在getter方法中!)你应该把它修好。另请参见如何以及何时从数据库中加载h:datatable的模型。
如果 UICommandUIInput 组件包含在动态源中,例如 <ui:include src="#{bean.include}"> ,则需要确保完全相同 #{bean.include} 值在表单提交请求的视图生成期间保留。jsf将在构建组件树期间重新执行它。将bean放入视图范围和/或确保加载数据模型 @PostConstruct bean(因此不是在getter方法中!)你应该把它修好。另请参见如何通过导航菜单刷新动态包含内容(jsf spa)。
这个 rendered 组件及其所有父级的属性以及 test 任何父项的属性 <c:if> / <c:when> 不应评估为 false 在表单提交请求的应用请求值阶段。jsf将重新检查它,作为防止篡改/黑客请求的一部分。将负责条件的变量存储在 @ViewScoped bean或确保在中正确预初始化条件 @PostConstruct 属于 @RequestScoped 比恩应该把它修好。这同样适用于 disabledreadonly 组件的属性,不应计算为 true 在应用请求值阶段。另请参见未调用jsf commandbutton操作、未处理条件呈现组件中的表单提交、将h:commandbutton Package 到<h:panelgroup rendered>中并强制jsf处理、验证和更新只读/禁用的输入组件后,h:commandbutton不起作用
这个 onclick 属性 UICommand 组件和 onsubmit 属性 UIForm 组件不应返回 false 或导致javascript错误。应该有,以防 <h:commandLink><f:ajax> 在浏览器的js控制台中也不能看到js错误。通常,谷歌搜索准确的错误信息会给你答案。另请参见手动添加/加载带有primefaces的jquery会导致未捕获的类型错误。
如果您通过JSF2.x使用ajax <f:ajax> 或如素面 <p:commandXxx> ,确保你有 <h:head> 在主模板中,而不是 <head> . 否则jsf将无法自动包含包含ajax函数的必要javascript文件。这将导致在浏览器的js控制台中出现javascript错误,如“mojarra未定义”或“primefaces未定义”。另请参见h:commandlink actionlistener在与f:ajax和ui:repeat一起使用时不被调用。
如果您使用的是ajax,那么提交的值最终会 null ,然后确保 UIInputUICommand 感兴趣的部分包含在 <f:ajax execute> 或例如。 <p:commandXxx process> ,否则将不会执行/处理它们。另请参见在将<f:ajax>添加到<h:commandbutton>时未在模型中更新的提交表单值,以及了解primefaces进程/更新和jsf f:ajax执行/呈现属性。
如果提交的值仍然是 null ,并且您正在使用cdi管理bean,然后确保从正确的包导入范围注解,否则cdi将默认为 @Dependent 它可以在el表达式的每次求值中有效地重新创建bean。另请参见@sessionscoped bean不断释放作用域并重新创建,字段变为null,jsf 2应用程序中的默认托管bean作用域是什么?
如果 <h:form>UICommand 按钮被来自同一页面中另一表单的ajax请求预先呈现/更新,那么在JSF2.2或更早版本中,第一个操作总是失败。第二步和后续行动将起作用。这是由视图状态处理中的一个bug引起的,该bug被报告为jsf规范问题790,目前已在jsf 2.3中修复。对于较旧的jsf版本,需要显式指定 <h:form>render<f:ajax> . 另请参见h:commandbutton/h:commandlink在第一次单击时不起作用,仅在第二次单击时起作用。
如果 <h:form>enctype="multipart/form-data" 设置为支持文件上载,则需要确保至少使用了jsf 2.2,或者正确配置了负责解析多部分/表单数据请求的servlet过滤器,否则 FacesServlet 最终将无法获得任何请求参数,因此无法应用请求值。如何配置这样的过滤器取决于所使用的文件上载组件。战斧 <t:inputFileUpload> ,请检查此答案,并查看是否有素数 <p:fileUpload> ,检查这个答案。或者,如果您实际上根本没有上传文件,那么就完全删除该属性。
确保 ActionEvent 论据 actionListener 是一个 javax.faces.event.ActionEvent 因此并非如此 java.awt.event.ActionEvent ,这是大多数IDE建议的第一个自动完成选项。如果你使用 actionListener="#{bean.method}" . 如果您不想在方法中使用参数,请使用 actionListener="#{bean.method()}" . 或者你真的想用 action 而不是 actionListener . 另请参见action和actionlistener之间的差异。
确保没有 PhaseListener 或任何 EventListener 在请求-响应链中,jsf生命周期已经改变,例如通过调用 FacesContext#renderResponse()FacesContext#responseComplete() .
确保没有 FilterServlet 在同一请求响应链中,已阻止 FacesServlet 以某种方式例如,登录/安全过滤器,如spring security。特别是在ajax请求中,默认情况下,这些请求将完全没有ui反馈。另请参见SpringSecurity4和PrimeFaces5Ajax请求处理。
如果您使用的是primefaces <p:dialog> 或者 <p:overlayPanel> ,然后确保他们有自己的 <h:form> . 因为,默认情况下,javascript会将这些组件重新定位到html的末尾 <body> . 所以,如果他们最初坐在一个 <form> 然后他们就不会再坐在 <form> . 另请参见p:commandbutton操作在p:dialog中不起作用
框架中的bug。例如,richfaces在使用 rich:calendar 带有 defaultLabel 属性(或在某些情况下是 rich:placeholder 子元素)。当没有为日历日期设置任何值时,此错误阻止调用bean方法。跟踪框架bug可以通过从一个简单的工作示例开始并构建页面备份直到发现bug来完成。

调试提示

如果你仍然结巴,是时候调试了。在客户端,在webbrowser中按f12以打开web developer工具集。单击console选项卡,查看javascript conosle。它应该没有任何javascript错误。下面的屏幕截图是chrome的一个示例,演示了提交 <f:ajax> 已启用按钮,但没有 <h:head> 声明(如上文第7点所述)。

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

相关问题