156

任何人都可以澄清我们如何在一般情况下使用这个片段,或者在现实世界的例子中使用这个片段吗?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>
4

2 回答 2

296

处理 GET 参数

管理 GET 参数的<f:viewParam>设置、转换和验证。就像<h:inputText>, 但是对于 GET 参数。

下面的例子

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

基本上执行以下操作:

  • 通过 name 获取请求参数值id
  • 如有必要,对其进行转换和验证(您可以使用required,validator和属性并将 a和converter嵌套在其中,就像 with 一样)<f:converter><f:validator><h:inputText>
  • 如果转换和验证成功,则将其设置为由#{bean.id}value 表示的 bean 属性,或者如果该value属性不存在,则将其设置为 name 上的请求属性,id以便#{id}在视图中可用。

因此,当您打开页面时foo.xhtml?id=10,参数值10会以这种方式在 bean 中设置,就在呈现视图之前。

至于验证,以下示例将参数设置为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:viewAction>这个。

<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>然而,自 JSF 2.2 以来它是新的(自<f:viewParam>JSF 2.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>这种方式本质上是一种解决方法/hack,这正是<f:viewAction>在 JSF 2.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>

基本上这个@RequestScopedbean:

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 输入组件无效(它已经在“幕后”这样做了)。


也可以看看:

于 2011-06-16T20:08:14.103 回答
1
于 2020-09-12T15:41:05.687 回答