并且您在浏览器的 JavaScript 控制台中也没有看到任何可搜索到的错误和/或警告(在 Chrome/Firefox23+/IE9+ 中按 F12 打开 Web 开发人员工具集,然后打开Console选项卡),然后解决以下可能原因列表。
-
UICommand
and UIInput
组件必须放置在一个UIForm
组件,例如<h:form>
(因此不是纯 HTML<form>
),否则无法向服务器发送任何内容。UICommand
组件也不得有type="button"
属性,否则它将是一个死按钮,仅对 JavaScript 有用onclick
。也可以看看如何发送表单输入值并调用 JSF bean 中的方法 https://stackoverflow.com/questions/3681123/how-to-get-hinputtext-values-from-gui-xhtml-into-java-class-jsf-bean and 不启动回发 https://stackoverflow.com/questions/12958208/hcommandbutton-does-not-initiate-a-postback.
-
不能嵌套多个UIForm
彼此之间的组成部分。这在 HTML 中是非法的。浏览器行为未指定。小心包含文件!您可以使用UIForm
组件并行,但它们在提交期间不会相互处理。您还应该注意“God Form”反模式;确保您不会无意中以相同的形式处理/验证所有其他(不可见)输入(例如,有一个隐藏的对话框,其中包含相同形式的所需输入)。也可以看看如何在JSF页面中使用?单一形式?多种形式?嵌套表格? https://stackoverflow.com/questions/7371903/using-multiple-hform-in-a-jsf-page.
-
No UIInput
应该发生值验证/转换错误。您可以使用<h:messages>
显示任何特定输入未显示的任何消息<h:message>
成分。不要忘记包括id
of <h:messages>
in the <f:ajax render>
,如果有的话,这样它也会根据 ajax 请求进行更新。也可以看看按下 p:commandButton 时 h:messages 不显示消息 https://stackoverflow.com/questions/16175178/hmessages-does-not-display-messages-when-pcommandbutton-is-pressed.
-
If UICommand
or UIInput
组件放置在迭代组件内,例如<h:dataTable>
, <ui:repeat>
等等,那么你需要确保完全相同value
迭代组件的值在表单提交请求的应用请求值阶段被保留。 JSF 将重复它以查找单击的链接/按钮和提交的输入值。将 bean 放入视图范围和/或确保将数据模型加载到@PostConstruct
bean 的(因此不在 getter 方法中!)应该修复它。也可以看看我应该如何以及何时从 JSF dataTable 的数据库加载模型 https://stackoverflow.com/questions/5765853/when-should-i-load-the-collection-from-database-for-hdatatable.
-
If UICommand
or UIInput
组件包含在动态源中,例如<ui:include src="#{bean.include}">
,那么你需要保证完全相同#{bean.include}
在表单提交请求的视图构建期间保留值。 JSF 将在构建组件树期间重新执行它。将 bean 放入视图范围和/或确保将数据模型加载到@PostConstruct
bean 的(因此不在 getter 方法中!)应该修复它。也可以看看如何通过导航菜单ajax刷新动态包含内容? (JSF SPA) https://stackoverflow.com/questions/7108668/how-to-ajax-refresh-dynamic-include-content-by-navigation-menu-jsf-spa.
-
The rendered
组件及其所有父组件的属性以及test
任何父母的属性<c:if>
/<c:when>
不应评估为false
在表单提交请求的应用请求值阶段。 JSF 将重新检查它,作为防止请求被篡改/黑客攻击的一部分。将负责条件的变量存储在@ViewScoped
bean 或确保您正确地预初始化了条件@PostConstruct
of a @RequestScoped
bean 应该修复它。这同样适用于disabled
and readonly
组件的属性,不应评估为true
在应用请求值阶段。也可以看看未调用 JSF CommandButton 操作 https://stackoverflow.com/questions/13326404/jsf-commandbutton-action-not-invoked, 不处理条件渲染组件中的表单提交 https://stackoverflow.com/questions/18782503/form-submit-in-conditionally-rendered-component-is-not-processed, 一旦我将 h:commandButton 包装在 中,它就无法工作 https://stackoverflow.com/questions/23742141/hcommandbutton-is-not-working-once-i-wrap-it-in-a-hpanelgroup-rendered and 无论如何强制 JSF 处理、验证和更新只读/禁用的输入组件 https://stackoverflow.com/questions/32390081/force-jsf-to-process-validate-and-update-readonly-disabled-input-components-any
-
The onclick
的属性UICommand
组件和onsubmit
的属性UIForm
组件不应返回false
或导致 JavaScript 错误。应该存在以下情况<h:commandLink>
or <f:ajax>
在浏览器的 JS 控制台中也看不到 JS 错误。通常谷歌搜索确切的错误消息已经给你答案了。也可以看看使用 PrimeFaces 手动添加/加载 jQuery 会导致未捕获的类型错误 https://stackoverflow.com/questions/16166039/adding-jquery-to-primefaces-results-in-uncaught-typeerror-over-all-place.
-
如果您通过 JSF 2.x 使用 Ajax<f:ajax>
或例如PrimeFaces<p:commandXxx>
,确保您有一个<h:head>
在主模板中而不是<head>
。否则,JSF 将无法自动包含包含 Ajax 函数的必要 JavaScript 文件。这将导致浏览器的 JS 控制台中出现 JavaScript 错误,例如“mojarra 未定义”或“PrimeFaces 未定义”。也可以看看与 f:ajax 和 ui:repeat 一起使用时,不会调用 h:commandLink actionlistener https://stackoverflow.com/questions/9933777/hcommandlink-actionlistener-is-not-invoked-when-used-with-fajax-and-uirepeat.
-
如果您使用 Ajax,并且提交的值最终为null
,然后确保UIInput
and UICommand
感兴趣的组成部分涵盖在<f:ajax execute>
或例如<p:commandXxx process>
,否则它们将不会被执行/处理。也可以看看将 添加到 时,提交的表单值未在模型中更新 https://stackoverflow.com/questions/17960929/submitted-form-values-not-updated-in-model-when-adding-fajax-to-hcommandbut and 了解 PrimeFaces 进程/更新和 JSF f:ajax 执行/渲染属性 https://stackoverflow.com/questions/25339056/understanding-process-and-update-attributes-of-primefaces.
-
如果提交的值最终仍然是null
,并且您正在使用 CDI 来管理 bean,然后确保从正确的包导入作用域注释,否则 CDI 将默认为@Dependent
它在 EL 表达式的每次计算中有效地重新创建 bean。也可以看看@SessionScoped bean 失去作用域并一直被重新创建,字段变为 null https://stackoverflow.com/questions/9470440/sessionscoped-bean-looses-scope-and-gets-recreated-all-the-time-fields-become and JSF 2 应用程序中默认的托管 Bean 范围是什么? https://stackoverflow.com/questions/19322364/what-is-the-default-managed-bean-scope-in-a-jsf-2-application
-
如果父母的<h:form>
与UICommand
按钮预先由来自同一页面中另一个表单的 ajax 请求呈现/更新,那么第一个操作在 JSF 2.2 或更早版本中将始终失败。第二个及后续操作将起作用。这是由视图状态处理中的错误引起的,报告为JSF 规范问题 790 https://github.com/jakartaee/faces/issues/790目前已在 JSF 2.3 中修复。对于较旧的 JSF 版本,您需要显式指定<h:form>
in the render
of the <f:ajax>
。也可以看看h:commandButton/h:commandLink 在第一次单击时不起作用,仅在第二次单击时起作用 https://stackoverflow.com/questions/11408130/hcommandbutton-hcommandlink-does-not-work-on-first-click-works-only-on-second.
-
If the <h:form>
has enctype="multipart/form-data"
设置以支持文件上传,那么您需要确保您使用的至少是 JSF 2.2,或者负责解析 multipart/form-data 请求的 servlet 过滤器已正确配置,否则FacesServlet
最终将根本得不到请求参数,因此无法应用请求值。如何配置这样的过滤器取决于所使用的文件上传组件。对于战斧<t:inputFileUpload>
, check 这个答案 https://stackoverflow.com/questions/5418292/jsf-2-0-file-upload/5424229#5424229对于 PrimeFaces<p:fileUpload>
, check 这个答案 https://stackoverflow.com/questions/8875818/how-to-use-primefaces-pfileupload-listener-method-is-never-invoked/8880083#8880083。或者,如果您实际上根本没有上传文件,则完全删除该属性。
-
确保ActionEvent
的论证actionListener
is an jakarta.faces.event.ActionEvent
因此不java.awt.event.ActionEvent
,这是大多数 IDE 建议的第一个自动完成选项。如果您使用,没有参数也是错误的actionListener="#{bean.method}"
。如果您不想在方法中使用参数,请使用actionListener="#{bean.method()}"
。或者也许你真的想使用action
代替actionListener
。也可以看看动作和动作监听器之间的区别 https://stackoverflow.com/questions/3909267/differences-between-action-and-actionlistener.
-
确保没有PhaseListener
or any EventListener
请求-响应链中的 JSF 生命周期已更改为跳过调用操作阶段,例如通过调用FacesContext#renderResponse()
or FacesContext#responseComplete()
.
-
确保没有Filter
or Servlet
在同一个请求-响应链中已经阻塞了FacesServlet
不知何故。例如,登录/安全过滤器,例如 Spring Security。特别是在 ajax 请求中,默认情况下根本不会有任何 UI 反馈。也可以看看Spring Security 4 和 PrimeFaces 5 AJAX 请求处理 https://stackoverflow.com/questions/30133329/spring-security-4-and-primefaces-5-ajax-request-handling.
-
如果您使用的是 PrimeFaces<p:dialog>
or a <p:overlayPanel>
,然后确保他们有自己的<h:form>
。因为,这些组件默认由 JavaScript 重新定位到 HTML 末尾<body>
。所以,如果他们最初坐在一个<form>
,那么他们现在就不再坐在<form>
。也可以看看p:commandbutton 操作在 p:dialog 中不起作用 https://stackoverflow.com/questions/18958729/pcommandbutton-action-doesnt-work-inside-pdialog