gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:45:36 25 4
gpt4 key购买 nike

环境: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/

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