在我基于 JSF 2 的应用程序中,我有一个表单,其中包括(以及其他 UI 组件)一些复选框。
在复选框上,我注册了 ajax 请求,在选中它们时会触发这些请求。 ajax 请求实际上只会更新支持 bean 中另一个复选框的值。
因此,另一个复选框也将被选中(当它被重新渲染时 - 因为它将在渲染响应阶段从支持 bean 获取更新的值)。
在提交整个表单并发生验证错误之前,这种方法可以正常工作。
然后,ajax 请求仍然有效并更改支持 bean 上的值,但在重新呈现更新后的复选框的阶段,它的值不是从支持 bean 中获取,而是从从 a 获取的缓存值中获取。ComponentStateHelper
class.
据我了解,这是用于 JSF 2 的新功能,仅存储对组件树的部分更改。
我不明白的是:这与验证阶段有何关系?为什么里面有一个缓存值StateHelper
当验证发现错误时我的复选框的类?
这是一个已知问题,并在这个答案 https://stackoverflow.com/questions/6642242/how-can-i-populate-a-text-field-using-primefaces-ajax-after-validation-errors-oc/6845800#6845800。简而言之,问题是由于要渲染的组件无效而引起的<f:ajax render>
但没有被执行<f:ajax execute>
与原始提交的值一起保持无效状态。当JSF渲染输入组件时,JSF会首先检查提交的值是否不存在null
然后显示它,否则显示型号值。您基本上需要重置要渲染但不是由ajax执行的输入组件的提交值。
为了实现这一点,您可以使用ActionListener http://docs.oracle.com/javaee/6/api/javax/faces/event/ActionListener.html which 基本上执行以下操作:
UIViewRoot viewRoot = context.getViewRoot();
PartialViewContext partialViewContext = facesContext.getPartialViewContext();
Set<EditableValueHolder> inputs = new HashSet<EditableValueHolder>();
// First find all to be rendered inputs and add them to the set.
findAndAddEditableValueHolders(partialViewContext.getRenderIds(), inputs);
// Then find all executed inputs and remove them from the set.
findAndRemoveEditableValueHolders(partialViewContext.getExecuteIds(), inputs);
// The set now contains inputs which are to be rendered, but which are not been executed. Reset them.
for (EditableValueHolder input : inputs) {
input.resetValue();
}
这已被报道为JSF 问题 1060 http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1060并且已经实施了完整且可重用的解决方案OmniFaces http://omnifaces.org图书馆作为ResetInputAjaxActionListener http://omnifaces.org/docs/javadoc/current/org/omnifaces/eventlistener/ResetInputAjaxActionListener.html(源代码here https://github.com/omnifaces/omnifaces/blob/master/src/main/java/org/omnifaces/eventlistener/ResetInputAjaxActionListener.java并展示演示here http://showcase.omnifaces.org/eventlisteners/ResetInputAjaxActionListener).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)