156

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

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

2 に答える 2

296

GET パラメータの処理

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

次の例

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

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

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

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

検証に関しては、次の例では 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: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()) {
        // ...
    }
}

「Conversion/Validation failed」のケースもスキップしたい場合は、次のようにします。

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);
}

はプレーンな HTML ではなく、<h:message>用であることに注意してください。また、 が空の場合は入力値が表示されることにも注意してください。これは、検証または変換エラーが発生した場合に送信された値がまったく表示されないためです。この構造は、JSF 入力コンポーネントに対しては無効であることに注意してください (すでに「隠れて」実行されています)。<f:viewParam><input type="text">#{param.query}#{bean.query}


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

于 2011-06-16T20:08:14.103 に答える