jsf - 重新执行f :viewAction when ViewScoped bean is recreated following a POST request

标签 jsf jsf-2 view-scope

环境:JSF 2.2 与 Mojarra 2.2.12 和 CDI ViewScoped beans & javax.faces.STATE_SAVING_METHOD设置为client .

为了正确初始化我的bean,感谢<f:viewParam ... /> ,我想(重新)执行 <f:viewAction action="#{bean.onLoad}" />当我的ViewScoped在 POST 请求之后,bean 被重新创建( View 已从 LRU 中推出,参见 com.sun.faces.numberOfLogicalViews)。

<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>

有什么想法吗?

注释:

  • 我知道postBack="true"但它不适合 bean.onLoad()将会在每个 POST 请求上调用。
  • 我无法调用 onLoad()@PostConstruct方法,因为 viewParam 尚未设置值还没有(参见When to use f:viewAction versus PostConstruct?)。

最佳答案

I'm aware of postBack="true" but it's not suitable as bean.onLoad() would be called on every POST request.

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

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

<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>
<小时/>

I cannot call onLoad() in @PostConstruct method because values have not been set by viewParam yet.

鉴于 <o:form> 的存在在您的代码片段中,我看到您正在使用 OmniFaces 。同一个实用程序库提供了 CDI @Param 注释的目的是在 @PostConstruct 之前注入(inject)、转换和验证 HTTP 请求参数。运行。

整个<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()) {
        // ...
    }
}

关于jsf - 重新执行f :viewAction when ViewScoped bean is recreated following a POST request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33078064/

相关文章:

java - 具有从父类(super class)继承的属性的托管 Bean

css - 在 JSF 面板标题中添加刷新图标

jsf - PrimeFaces Dialog + appendToBody=true 不起作用

java - 如何在 p :dataGrid using p:graphicImage 中显示图像

css - 错误验证css时jsf形式的位移组件

jsf - 为什么这个 ViewScoped 托管 bean 不工作以及如何让它工作?

jsf - @ViewScoped 在每次回发时创建新实例

javascript - Event.observe 原型(prototype) Javascript 效率低下,替代品?

jsf - 有没有办法用 JSF EL 列出请求头名称——无需支持 bean?

java - 如何在jsf中获取当前 View id和上一个 View id