<f:metadata>、<f:viewParam>、<f:viewAction>は何に使用できますか?


149

誰でも、一般的に、または実際の例では、このスニペットをどのように使用できるかを明確にできますか?

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

回答:


288

GETパラメータの処理

<f:viewParam>GETパラメータの設定、変換、および検証を管理します。これはに似て<h:inputText>いますが、GETパラメータの場合です。

次の例

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

基本的には次のことを行います。

  • 名前でリクエストパラメータ値を取得しますid
  • 変換し、必要に応じて検証する(あなたが使用することができrequiredvalidatorおよびconverter属性とネストA <f:converter>および<f:validator>その中のようにのように<h:inputText>
  • 変換と検証が成功した#{bean.id}場合は、値で表されるBeanプロパティとして設定するか、value属性が存在しない場合は、名前でリクエスト属性として設定して、ビューでid使用できるよう#{id}にします。

したがって、ページを開くと、ビューがレンダリングされる直前に、foo.xhtml?id=10パラメーター値10がこのようにBeanに設定されます。

検証については、次の例ではparamをに設定し、10〜20のrequired="true"値のみを許可しています。検証に失敗すると、メッセージが表示されます。

<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で導入された理由です。


ビューパラメータを次のビューに渡す

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入力コンポーネントに対しては無効であることに注意してください(これは、すでに「内部」で実行されています)。


以下も参照してください。


@BalusC faces-redirect = trueと組み合わせて使用​​した場合、「bean」のスコープはどうなりますか?スコープが「@RequestScoped」に設定されている場合、期待どおりに動作しますか?
オタク

@Geek:リダイレクトは新しいGETリクエストを作成します。ソースBeanとターゲットBeanのBeanスコープは無関係です。ただし、リクエストおよびビュースコープBeanについては、新しいGETリクエストの考えられる影響を考慮に入れる必要があります。stackoverflow.com/questions/7031885/…
BalusC

@BalusC「正確には、「しかし、リクエストおよびビュースコープBeanについては、新しいGETリクエストの潜在的な影響を考慮に入れるべきです。」
オタク

@Geek:スコープが終了して開始されるため、ゴミ箱に移動して再作成されます。
BalusC

@BalusC。包括的な答え。「すべてのリクエストで呼び出されないビュースコープBeanに '@' PostConstructのような機能を使用する必要がある場合は、リクエストがポストバックでないかどうかを確認してください。」すべてのリクエストで呼び出されない場合、リクエストがポストバックであるかどうかを確認する理由は何ですか?
Uluk Biy 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.