我知道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()) {
// ...
}
}