gpt4 book ai didi

java - 验证错误后,后续的 ajax 请求从 UI 组件而不是 Bean 获取值

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:29 24 4
gpt4 key购买 nike

在我基于 JSF 2 的应用程序中,我有一个包含(在其他 UI 组件中)一些复选框的表单。

在复选框上,我注册了 ajax 请求,当它们被选中时会触发。 ajax 请求实际上只会更新辅助 bean 中另一个复选框的值。因此,其他复选框也将被选中(当它被重新呈现时 - 因为它将在呈现响应阶段从支持 bean 获取更新的值)。

在提交整个表单并发生验证错误之前,这一切正常。然后 ajax 请求仍然有效并更改支持 bean 上的值,但是在重新呈现更新的复选框的阶段,它的值不是从支持 bean 中获取的,而是从 ComponentStateHelper 中获取的缓存值中获取的 类。

据我了解,这用于 JSF 2 的新功能,仅存储对组件树的部分更改。

我不明白的是:这与验证阶段有什么关系?当验证发现错误时,为什么我的复选框的 StateHelper 类中有一个缓存值?

最佳答案

这是一个已知问题,并在 this answer 中进行了深入解释。 .简而言之,问题是由 <f:ajax render> 渲染的无效组件引起的。但未被 <f:ajax execute> 执行与原始提交值一起保持无效状态。当 JSF 渲染输入组件时,JSF 会首先检查提交的值是否不是 null然后显示它,否则它会显示模型值。您基本上需要重置要呈现但未被 ajax 执行的输入组件的提交值。

为此,您可以使用 ActionListener 基本上做以下事情:

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 issue 1060并在 OmniFaces 中实现了一个完整且可重用的解决方案库为 ResetInputAjaxActionListener (源代码 here 和展示演示 here)。

关于java - 验证错误后,后续的 ajax 请求从 UI 组件而不是 Bean 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10723133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com