在 POST 请求后重新创建 ViewScoped bean 时重新执行 f:viewAction

2024-02-08

环境:JSF 2.2 与 Mojarra 2.2.12 & CDI ViewScoped beans &javax.faces.STATE_SAVING_METHOD set to client.

为了正确初始化我的bean,感谢<f:viewParam ... />,我想(重新)执行<f:viewAction action="#{bean.onLoad}" />当我的ViewScoped豆是重新创造了(视图被从 LRU 中推出,参见com.sun.faces.numberOfLogicalViews https://stackoverflow.com/questions/4105439/com-sun-faces-numberofviewsinsession-vs-com-sun-faces-numberoflogicalviews) 在 POST 请求之后。

<f:metadata>
    <f:viewParam maxlength="100" name="name" value="#{bean.file}" />
    <f:viewAction action="#{bean.onLoad}"  />
</f:metadata>

<o:form includeRequestParams="true">
     <!-- action can only work if onLoad has been called -->
     <p:commandButton action="#{bean.action}" />
</o:form>

有任何想法吗?

Notes:

  • 我知道postBack="true"但它不适合作为bean.onLoad()将会被召唤every发布请求。
  • 我不能打电话onLoad() in @PostConstruct方法,因为值尚未设置viewParam然而(参见何时使用 f:viewAction 与 PostConstruct? https://stackoverflow.com/questions/9844526/when-to-use-fviewaction-prerenderview-versus-postconstruct).

我知道postBack="true"但它不适合,因为每个 POST 请求都会调用 bean.onLoad() 。

你可以只使用 ELonPostback属性,您可以在其中检查模型值和/或请求参数是否存在。

如果需要模型值,则只需检查它是否存在:

<f:metadata>
    <f:viewParam maxlength="100" name="name" value="#{bean.file}" required="true" />
    <f:viewAction action="#{bean.onLoad}" onPostback="#{empty bean.file}" />
</f:metadata>

如果不需要模型值,则还要检查请求参数:

<f:metadata>
    <f:viewParam maxlength="100" name="name" value="#{bean.file}" />
    <f:viewAction action="#{bean.onLoad}" onPostback="#{empty bean.file and not empty param.name}" />
</f:metadata>

我不能打电话onLoad() in @PostConstruct方法,因为 viewParam 尚未设置值。

鉴于存在<o:form> http://showcase.omnifaces.org/components/form在你的代码片段中,我看到你正在使用OmniFaces http://omnifaces.org。同一个实用程序库提供了 CDI@Param http://showcase.omnifaces.org/cdi/Param注解的目的是在 HTTP 请求之前注入、转换和验证 HTTP 请求参数@PostConstruct runs.

整个<f:viewParam><f:viewAction>因此可以替换如下:

@Inject @Param(name="name", validators="javax.faces.Length", validatorAttributes=@Attribute(name="maximum", value="100"))
private String file;

@PostConstruct
public void onLoad() {
    if (!Faces.isValidationFailed()) {
        // ...
    }
}

或者,如果您手头有 Bean Validation(又名 JSR303):

@Inject @Param(name="name") @Size(max=100)
private String file;

@PostConstruct
public void onLoad() {
    if (!Faces.isValidationFailed()) {
        // ...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 POST 请求后重新创建 ViewScoped bean 时重新执行 f:viewAction 的相关文章

  • 是 ValidationFailed 默认值

    会用什么方法facesContext isValidationFailed 当验证失败时 在渲染响应阶段后返回 它返回false对于我来说 它只会返回true when FacesContext validationFailed http
  • 使用 ui:repeat 和 b:carousel?

    环境 我正在使用 JSF2 2 Bootsfaces 0 9 1 Primefaces 6 0 JEE7 和 Hibernate 5 2 以及 MySQL 5 7 DB 我拥有的 我有一个包含一组图像的模型 该集合包含我的自定义 Image
  • 在 Java EE 中手动启动新线程安全吗?

    对于在会话范围内的 JSF 托管 bean 中生成线程是否安全 我找不到明确的答案 线程需要调用无状态 EJB 实例 依赖注入到托管 bean 上的方法 背景是我们有一份需要很长时间才能生成的报告 由于我们无法更改服务器设置 这导致 HTT
  • JSF 2.1 中的 HTML 4 <按钮>

    我想使用以下命令 The JSF
  • 处理“EJB 不存在”或“无法从 BACKUPSTORE FOR Key 加载”

    所以问题很简单 我们使用 JSF 2 0 与 Primefaces 和 EJB 来处理我们的应用程序 但遇到了问题 我们有一个单 SessionScoped我们存储所有的bean Stateful Session Beans 在一种情况下
  • 在应用程序服务器上存储 PDF 一段有限的时间并可供下载

    您好 我正在使用 PrimeFaces 5 JSF 2 和 tomcat 有人可以向我展示或给我一个关于如何在应用程序服务器上在有限时间内存储 pdf 的想法吗 我正在使用 tomcat 然后下载它 如果这是用户请求的 此功能与发票相关 因
  • 添加@Named时@SessionScoped不起作用

    考虑以下支持 bean import javax faces bean ManagedBean import javax faces bean SessionScoped ManagedBean SessionScoped public c
  • 使用普通 HTML 按钮在 JavaScript 中调用托管 bean 方法

    我需要在单击普通 HTML 按钮时调用 JavaScript 中的托管 bean 方法 如果我使用 JSF2 x 和 Primefaces 是否可以做到这一点 对的 这是可能的 Primefaces 提供了一个有用的钩子来用它的组件来做到这
  • 需要 Spring 3 JSF 2 集成示例

    我想将 Spring 3 Web Flow 2 JSF 2 集成在一起 我需要您向我推荐一个好的教程或示例 提前致谢 UPDATE 我使用了以下示例 它对我来说运行良好 没有任何问题 http www mkyong com jsf2 jsf
  • 上的 EL 语法错误

    我正在尝试为链接创建一个条件 其中如果长度不 0 则显示描述 但我收到语法错误 代码是
  • 无法让 PrimeFaces RequestContext.getCurrentInstance().openDialog() 工作

    无法获取 PrimeFacesRequestContext getCurrentInstance openDialog 上班 我直接从 primefaces 展示中提取了示例代码 但我从未打开过对话框 我正在使用在 Wildfly 8 2
  • 如何指定消息是否应显示在 p:growl 或 p:messages 中?

    在我的 Facelets 页面中 我有这个
  • 如何在 h:outputText 中写入单引号和双引号

    如何在 value 属性中写入单引号和双引号h outputText 这应该适用于标准语法 JSP 和 XML 视图技术
  • 使用 Netbeans 7.0.1、Maven 在 JSF2 中打包复合组件

    我在 Internet 上阅读了很多有关将 JSF2 复合组件打包到 JAR 文件中的内容 有人知道我在哪里可以找到 JAR 的结构 规格 官 方文档等 有没有办法使用 Netbeans IDE 来做到这一点 或者 Maven 是否存在原型
  • 如何在 JSF 中禁用页面/表单

    对于我的应用程序 我希望拥有具有不同权限的用户 一种权限允许用户查看我的数据库中的数据 而另一种权限允许他们编辑数据 登录时 我会检查他们的权限以确定他们是否可以编辑数据 如果用户具有只读权限 我正在寻找某种方法来禁用整个页面 有没有一种简
  • 验证错误值无效[重复]

    这个问题在这里已经有答案了 我知道这是一个常见的错误 并且有很多关于它的问题 但我必须创建一个新的问题 这是我的 jsf 页面
  • 在 JSF 中动态创建表列

    我正在开发仪表板应用程序 我必须检索一组记录并显示在动态表框中 页框长度是固定的 现在可以初始化列和行 它应该看起来像这个示例 目前我正在使用数据表来显示 但它将所有数据打印在一列中 我如何将我的代码更改为上述模式
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • 会话销毁后如何使 viewscoped beans/viewmap 生存(使用客户端保存)?

    我在用着Myfaces 2 2 具有客户端状态保存功能 我看到 ViewScoped beans 和存储在 viewmap 中的数据在用户会话销毁后丢失 我开始知道 不确定这是否正确 这是预期的行为 但是在会话销毁后避免查看过期异常的方法是
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用

随机推荐