Jsf commandButton/commandLink/ajax操作/侦听器方法未调用或输入值未设置/更新
有时,在使用Jsf commandButton/commandLink/ajax操作/侦听器方法未调用或输入值未设置/更新,jsf,jsf-2,action,commandbutton,commandlink,Jsf,Jsf 2,Action,Commandbutton,Commandlink,有时,在使用、或时,与标记关联的操作、操作监听器或监听器方法不会被调用。或者,bean属性不会用提交的UIInput值更新 可能的原因和解决方案是什么?引言 每当UICommand组件(,等)未能调用关联的操作方法,或UIInput组件(,等)未能处理提交的值和/或更新模型值时,而且,在服务器日志中没有看到任何Google异常和/或警告,也不是在按照配置ajax异常处理程序时,也不是在web.xml中设置以下上下文参数时 <context-param> <param-n
、
或
时,与标记关联的操作
、操作监听器
或监听器
方法不会被调用。或者,bean属性不会用提交的UIInput
值更新
可能的原因和解决方案是什么?引言
每当UICommand
组件(
,
等)未能调用关联的操作方法,或UIInput
组件(
,
等)未能处理提交的值和/或更新模型值时,而且,在服务器日志中没有看到任何Google异常和/或警告,也不是在按照配置ajax异常处理程序时,也不是在web.xml
中设置以下上下文参数时
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
javax.faces.PROJECT_阶段
发展
在浏览器的JavaScript控制台中,您也没有看到任何Googleable错误和/或警告(在Chrome/Firefox23+/IE9+中按F12打开web developer工具集,然后打开console选项卡),然后处理下面列出的可能原因
可能原因
UICommand
和UIInput
组件必须放在UIForm
组件中,例如
(因此不是普通的HTML
),否则无法向服务器发送任何内容UICommand
组件也不能具有type=“button”
属性,否则它将是一个死按钮,仅对JavaScriptonclick
有用。另见和
UIForm
组件嵌套在一起。这在HTML中是非法的。未指定浏览器行为。小心包含文件!您可以并行使用UIForm
组件,但它们在提交期间不会相互处理。你也应该注意“上帝形态”反模式;确保您不会无意中处理/验证同一格式的所有其他(不可见)输入(例如,有一个隐藏对话框,其中包含同一格式的所需输入)。另见
UIInput
值验证/转换错误。您可以使用
显示任何特定于输入的
组件未显示的任何消息。不要忘记在
中包含
的id
,如果有的话,这样它也会在ajax请求中更新。另见
UICommand
或UIInput
组件放置在迭代组件(如
、
等)中,则需要确保在表单提交请求的应用请求值阶段保留与迭代组件完全相同的值。JSF将在上面重复查找单击的链接/按钮和提交的输入值。将bean放入视图范围和/或确保在bean的@PostConstruct
中加载数据模型(因此不是在getter方法中!)应该可以解决这个问题。另见
)包含UICommand
或UIInput
组件,则需要确保在表单提交请求的视图生成期间保留完全相同的{bean.include}
值。JSF将在构建组件树期间重新执行它。将bean放入视图范围和/或确保在bean的@PostConstruct
中加载数据模型(因此不是在getter方法中!)应该可以解决这个问题。另见
呈现的属性和任何父级的测试属性不应评估为假。JSF将重新检查它,作为防止篡改/黑客请求的一部分。将负责该条件的变量存储在@ViewScoped
bean中,或者确保在@RequestScoped
bean的@PostConstruct
中正确地预初始化该条件,应该可以解决该问题。这同样适用于组件的disabled
和readonly
属性,在应用请求值阶段,这些属性不应计算为true
。另见,和
UICommand
组件的onclick
属性和UIForm
组件的onsubmit
属性不应返回false
或导致JavaScript错误。在出现
或
的情况下,浏览器的JS控制台中也应该没有可见的JS错误。通常,谷歌搜索准确的错误信息会给你答案。另见
或例如PrimeFaces
使用Ajax,请确保主模板中有一个
,而不是
。否则JSF将无法自动包含包含Ajax函数的必要JavaScript文件。这将导致在浏览器的JS控制台中出现JavaScript错误,如“mojarra未定义”或“PrimeFaces未定义”。另见
null
,那么请确保UIInput
和UICommand
感兴趣的组件包含在
中,或者例如
,否则它们将不会被执行/处理。另见和
null
,并且您正在使用CDI管理bean,那么请确保您从正确的包导入范围注释,否则CDI将默认为@Dependent
,从而有效地重新创建
<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
<h:form>
<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>
<ui:composition>
<h:form id="form1">
<p:dialog id="dialog1">
<p:commandButton value="Save" action="#{bean.method1}" /> <!--Working-->
</p:dialog>
</h:form>
<h:form id="form2">
<p:dialog id="dialog2">
<p:commandButton value="Save" action="#{bean.method2}" /> <!--Not Working-->
</p:dialog>
</h:form>
</ui:composition>
<ui:composition>
<h:form id="form1">
<p:dialog id="dialog1">
<p:commandButton value="Save" action="#{bean.method1}" /> <!-- Working -->
</p:dialog>
<p:dialog id="dialog2">
<p:commandButton value="Save" action="#{bean.method2}" /> <!--Working -->
</p:dialog>
</h:form>
<h:form id="form2">
<!-- .......... -->
</h:form>
</ui:composition>
<p:commandButton id="b1" value="Save" process="userGroupSetupForm"
actionListener="#{userGroupSetupController.saveData()}"
update="growl userGroupList userGroupSetupForm" />