web-dev-qa-db-ja.com

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

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

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

GETパラメーターの処理

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

次の例

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

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

  • idという名前で要求パラメーター値を取得します。
  • 必要に応じて変換および検証します(requiredvalidatorおよびconverter属性を使用し、<f:converter>のように<f:validator>および<h:inputText>をネストできます)
  • 変換と検証が成功した場合、それを#{bean.id}値で表されるBeanプロパティとして設定するか、value属性が存在しない場合、名前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: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から新しく追加されました(JSF 2.0から<f:viewParam>はすでに存在します)。アップグレードできない場合は、代わりに <f:event> を使用するのが最善の策です。

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

ただし、これはeveryリクエストで呼び出されます。リクエストがポストバックではないかどうかを明示的に確認する必要があります。

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

「変換/検証に失敗しました」のケースもスキップしたい場合は、次のようにします。

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

このように<f:event>を使用することは本質的に回避策/ハックであり、それがまさに__SF_2.2で<f:viewAction>が導入された理由です。


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

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">

元のパラメーター値で。

このアプローチのみrequiresnext.xhtmlalsoと同じパラメーターで<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>は、プレーンHTMLの<f:viewParam>ではなく、<input type="text">のためのものです!また、#{param.query}が空の場合、入力値は#{bean.query}を表示します。これは、検証エラーまたは変換エラーが発生した場合に送信された値がまったく表示されないためです。このコンストラクトはJSF入力コンポーネントに対して無効であることに注意してください(すでに「隠れている」ことを行っています)。


こちらもご覧ください:

281
BalusC