jsf - 什么可以 <f :metadata>, <f :viewParam> and <f:viewAction> be used for?

标签 jsf jsf-2 viewparams viewaction

任何人都可以澄清我们如何在一般情况下或在现实世界中使用此代码片段吗?

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

最佳答案

处理 GET 参数

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

下面的例子

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

基本上执行以下操作:

  • 按名称获取请求参数值id .
  • 根据需要进行转换和验证(您可以使用 requiredvalidatorconverter 属性,并在其中嵌套 <f:converter><f:validator> ,就像 <h:inputText> 一样)
  • 如果转换和验证成功,则将其设置为 #{bean.id} 表示的 bean 属性。值,或者如果 value属性不存在,则将其设置为名称 id 上的请求属性这样就可以通过 #{id} 获得它 View 中。

因此,当您以 foo.xhtml?id=10 打开页面时那么参数值10在渲染 View 之前,以这种方式在 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>这种方式本质上是一种解决方法/黑客,这正是<f:viewAction>的原因在 JSF 2.2 中引入。

<小时/>

将 View 参数传递给下一个 View

您可以通过设置includeViewParams来“传递”导航链接中的 View 参数属性为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 bean :

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 输入组件无效(它已经在“幕后”执行此操作)。

<小时/>

另请参阅:

关于jsf - 什么可以 <f :metadata>, <f :viewParam> and <f:viewAction> be used for?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6377798/

相关文章:

jsf - :dataTable renders rows correctly but does not show cell values while ui:repeat does

jsf - 为什么复合组件中某个方面内的 commandLink 会呈现错误?

jsf - h :commandButton action redirect to context root, 可能吗?

javascript - 如何使用jquery向用户显示弹出通知?

jsf - <f :viewParam> javax. persistence.NoResultException:找不到查询实体

list - 有没有办法让 f :viewparam handle lists of values?

java - 如何比较数据库和用户输入的字符串?

java - 将事件从数据库加载到日历 primefaces

java - 类重命名后 Netbeans 部署失败

jsf - 使用 includeViewParams=true 的ExternalContext#redirect()