gpt4 book ai didi

jsf - 未使用 URL 参数时在 POST 上重新创建 View 范围的 bean

转载 作者:行者123 更新时间:2023-12-04 18:11:06 25 4
gpt4 key购买 nike

我有一个 View 范围 支持 的 JSF 管理的 bean xhtml 查看我使用 从 URL 中读取一个参数的位置f:viewParam .
View 向用户呈现一个表单。但是,当用户通过按 提交表单时p:命令按钮 似乎重新创建了 View 范围的 bean(我添加了 @PostConstruct 注释来验证这一点),因此不记得从 读取的实例变量f:viewParam (下面代码中的invId)。
我最初使用包含 URL 参数的 GET 导航到 View ,但是当用户按下 时发送的 POST 消息p:命令按钮 不包括 URL 参数。所以我在想,当 JSF 运行时在 POST 上看不到 URL 参数时,它认为这是一个不同的 View ,并且正在重新创建 JSF 管理的 bean。当我将 View 范围更改为 session 范围 代码有效。
这是代码:
看法

<f:metadata>
<f:viewParam name="invId" value="#{registerBean.invId}"/>
</f:metadata>
<h:form id="registrationForm">
....
<p:commandButton value="register" action="#{registerBean.register}"
icon="ui-icon ui-icon-newwin" ajax="false"/>
</h:form>
后备 bean
@ManagedBean                                      
@ViewScoped
public class RegisterBean implements Serializable {
@ManagedProperty(value="#{invId}")
private String invId;
...
更新
事实证明,这根本与 URL 参数无关。按照下面的 BalusC 建议,我删除了 c:当我的 View 使用的标签(依赖 呈现的 属性而不是相同的效果),现在不再重新创建 View 范围的 bean 并且 无效 字段被正确保留。

最佳答案

该问题在到目前为止发布的代码中不可见,但对于 JSF 2.0/2.1 而言,这是一个已知问题,即当 View 范围 bean 的一个属性绑定(bind)到像 JSTL <c:if> 之类的标记处理程序的属性时,将重新创建 View 范围 bean。或 Facelets <ui:include>或JSF组件的 View 构建时间属性,如idbinding ,同时启用部分状态保存(默认情况下)。
背景解释是这些属性中的任何 EL 表达式都是在构建和恢复 View 期间执行的。由于 View 范围 bean 存储在 View 中,因此只有在恢复 View 后才可用,因此这样的 EL 表达式评估将导致创建一个全新且单独的 View 范围 bean。这基本上是一个鸡蛋问题。它在即将到来的 JSF 2.2 中得到修复。
基本上有3种解决方案:

  • 相应地更改 View ,以便仅在 View 渲染期间评估这些 EL 表达式。例如。替换 <c:if>/<c:choose>通过 rendered .
  • 或者将这些属性绑定(bind)到请求范围 bean(设计注意事项:您可以将 View 范围 bean 作为请求范围 bean 的托管属性注入(inject))。
  • 如果需要,仅对特定 View 关闭部分状态保存。

  • 也可以看看:
  • JSTL in JSF2 Facelets... makes sense?
  • @ViewScoped fails in taghandlers
  • 关于jsf - 未使用 URL 参数时在 POST 上重新创建 View 范围的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215098/

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