<f:元数据>、<f:viewParam>和<f:viewAction>可以用于什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (24)

有人能澄清我们一般如何使用,或者在现实世界中如何使用这个片段吗?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>
提问于
用户回答回答于

工艺参数

<f:viewParam>管理GET参数的设置、转换和验证。就像<h:inputText>,然后得到参数。

下面的示例

<f:metadata>
    <f:viewParam name="id" value="#{bean.id}" />
</f:metadata>

基本上是这样做的:

  • 按名称获取请求参数值id
  • 必要时转换并验证它(可以使用requiredvalidatorconverter属性和嵌套a<f:converter><f:validator>就像<h:inputText>)
  • 如果转换和验证成功,则将其设置为由#{bean.id}值,或者如果value属性不存在,然后将其设置为名称上的请求attribtue。id这样它就可以在#{id}在视野中。

所以当你打开页面时foo.xhtml?id=10然后参数值10在呈现视图之前,以这种方式在bean中设置。

关于验证,下面的示例将Param设置为required="true"并且只允许10到20之间的值。任何验证失败都将导致显示消息。

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
</f:metadata>
<h:message for="id" />

对GET参数执行业务操作

可以使用<f:viewParam>为了这个。

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />
public void onload() {
    // ...
}

<f:viewAction>不过,它是新的,因为JSF2.2(<f:viewParam>自JSF2.0以来就已经存在了。如果你不能升级,那么你最好的选择是<f:event>相反。

<f:event type="preRenderView" listener="#{bean.onload}" />

然而,这是在每一个请求。需要显式地检查请求是否不是回发:

public void onload() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

当也想跳过“转换/验证失败”的案例时,请执行以下操作:

public void onload() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
        // ...
    }
}

使用<f:event>这种方式本质上是一种变通方法/黑客,这就是为什么<f:viewAction>在JSF2.2中引入。

将视图参数传递到下一个视图

可以通过设置导航链接中的视图参数来“传递”视图参数。includeViewParams属性为true或通过添加includeViewParams=true请求参数

<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">

与上述内容一起生成的<f:metadata>示例基本如下链接

<a href="next.xhtml?id=10">

具有原始参数值。

这种方法只适用于要求next.xhtml<f:viewParam>在相同的参数上,否则将不会传递。

在JSF中使用GET表单

<f:viewParam>也可以与“普通HTML”GET表单结合使用。

<f:metadata>
    <f:viewParam id="query" name="query" value="#{bean.query}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
    <label for="query">Query</label>
    <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
    <input type="submit" value="Search" />
    <h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
     ...
</h:dataTable>

基本上这个@RequestScoped豆子:

private String query;
private List<Result> results;

public void search() {
    results = service.search(query);
}

注意,<h:message>是为了<f:viewParam>,而不是普通的HTML<input type="text">!还请注意,输入值将显示#{param.query}何时#{bean.query}是空的,因为否则当存在验证或转换错误时,提交的值将根本不会出现。请注意,这个构造对于JSF输入组件是无效的(它已经在执行“在幕后”了)。

扫码关注云+社区