有时,当使用 <h:commandLink> , <h:commandButton> 或 <f:ajax> 这个 action , actionListener 或 listener 与标记关联的方法不会被调用。或者,bean属性不使用submitted更新 UIInput 价值观可能的原因和解决方案是什么?
<h:commandLink>
<h:commandButton>
<f:ajax>
action
actionListener
listener
UIInput
piah890a1#
每当 UICommand 组成部分( <h:commandXxx> , <p:commandXxx> 等)无法调用关联的操作方法,或 UIInput 组成部分( <h:inputXxx> , <p:inputX> ,等等)无法处理提交的值和/或更新模型值,并且在服务器日志中没有看到任何Google异常和/或警告,也不是在根据jsf ajax请求中的异常处理配置ajax异常处理程序时,也不是在中设置以下上下文参数时 web.xml ,
UICommand
<h:commandXxx>
<p:commandXxx>
<h:inputXxx>
<p:inputX>
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选项卡),然后处理下面列出的可能原因。
UIForm
<h:form>
<form>
type="button"
onclick
不能嵌套多个 UIForm 组件之间相互关联。这在html中是非法的。未指定浏览器行为。小心包含文件!你可以用 UIForm 组件是并行的,但它们在提交期间不会相互处理。你也应该注意“上帝形态”反模式;确保您不会无意中处理/验证同一格式的所有其他(不可见)输入(例如,有一个隐藏对话框,其中包含同一格式的所需输入)。另请参见如何在jsf页面中使用<h:form>?单一形式?多种形式?嵌套形式?。不 UIInput 应已发生值验证/转换错误。你可以用 <h:messages> 显示任何特定输入未显示的任何消息 <h:message> 组件。别忘了包括 id 属于 <h:messages> 在 <f:ajax render> ,以便在ajax请求时也对其进行更新。另请参见按下p:commandbutton时h:messages不显示消息。如果 UICommand 或 UIInput 组件放置在迭代组件中,如 <h:dataTable> , <ui:repeat> ,等等,然后您需要确保完全相同 value 在表单提交请求的apply request values阶段,将保留迭代组件的属性。jsf将在上面重复查找单击的链接/按钮和提交的输入值。将bean放入视图范围和/或确保加载数据模型 @PostConstruct bean(因此不是在getter方法中!)你应该把它修好。另请参见如何以及何时从数据库中加载h:datatable的模型。如果 UICommand 或 UIInput 组件包含在动态源中,例如 <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 比恩应该把它修好。这同样适用于 disabled 及 readonly 组件的属性,不应计算为 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 ,然后确保 UIInput 及 UICommand 感兴趣的部分包含在 <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() .确保没有 Filter 或 Servlet 在同一请求响应链中,已阻止 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来完成。
<h:messages>
<h:message>
id
<f:ajax render>
<h:dataTable>
<ui:repeat>
value
@PostConstruct
<ui:include src="#{bean.include}">
#{bean.include}
rendered
test
<c:if>
<c:when>
false
@ViewScoped
@RequestScoped
disabled
readonly
true
onsubmit
<h:head>
<head>
null
<f:ajax execute>
<p:commandXxx process>
@Dependent
render
enctype="multipart/form-data"
FacesServlet
<t:inputFileUpload>
<p:fileUpload>
ActionEvent
javax.faces.event.ActionEvent
java.awt.event.ActionEvent
actionListener="#{bean.method}"
actionListener="#{bean.method()}"
PhaseListener
EventListener
FacesContext#renderResponse()
FacesContext#responseComplete()
Filter
Servlet
<p:dialog>
<p:overlayPanel>
<body>
rich:calendar
defaultLabel
rich:placeholder
如果你仍然结巴,是时候调试了。在客户端,在webbrowser中按f12以打开web developer工具集。单击console选项卡,查看javascript conosle。它应该没有任何javascript错误。下面的屏幕截图是chrome的一个示例,演示了提交 <f:ajax> 已启用按钮,但没有 <h:head> 声明(如上文第7点所述)。单击网络选项卡以查看http流量监视器。提交表单并调查请求标题、表单数据和响应正文是否符合预期。下面的屏幕截图是来自chrome的一个示例,它演示了一个成功的ajax提交
1条答案
按热度按时间piah890a1#
导言
每当
UICommand
组成部分(<h:commandXxx>
,<p:commandXxx>
等)无法调用关联的操作方法,或UIInput
组成部分(<h:inputXxx>
,<p:inputX>
,等等)无法处理提交的值和/或更新模型值,并且在服务器日志中没有看到任何Google异常和/或警告,也不是在根据jsf ajax请求中的异常处理配置ajax异常处理程序时,也不是在中设置以下上下文参数时web.xml
,在浏览器的javascript控制台中,您也没有看到任何Googleable错误和/或警告(在chrome/firefox23+/ie9+中按f12打开web developer工具集,然后打开console选项卡),然后处理下面列出的可能原因。
可能原因
UICommand
及UIInput
组件必须放置在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不显示消息。如果
UICommand
或UIInput
组件放置在迭代组件中,如<h:dataTable>
,<ui:repeat>
,等等,然后您需要确保完全相同value
在表单提交请求的apply request values阶段,将保留迭代组件的属性。jsf将在上面重复查找单击的链接/按钮和提交的输入值。将bean放入视图范围和/或确保加载数据模型@PostConstruct
bean(因此不是在getter方法中!)你应该把它修好。另请参见如何以及何时从数据库中加载h:datatable的模型。如果
UICommand
或UIInput
组件包含在动态源中,例如<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
比恩应该把它修好。这同样适用于disabled
及readonly
组件的属性,不应计算为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
,然后确保UIInput
及UICommand
感兴趣的部分包含在<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()
.确保没有
Filter
或Servlet
在同一请求响应链中,已阻止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提交