1. ホーム
  2. jsf

[解決済み] <f:metadata>、<f:viewParam>、<f:viewAction>は何に使えるのでしょうか?

2022-04-27 04:21:14

質問事項

このスニペットを一般的に、または実際の例でどのように使用できるのか、どなたか教えてください。

<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 .
  • 必要に応じて変換し、検証する( required , validatorconverter 属性のネストと <f:converter><f:validator> と同じように、その中に <h:inputText> )
  • 変換と検証が成功したら、次のように表されるビーンプロパティとして設定します。 #{bean.id} の値、または value 属性がない場合は、リクエスト属性として名前 id で利用できるようにします。 #{id} をビューで表示します。

というようにページを開くと foo.xhtml?id=10 の場合、パラメータ値 10 は、ビューがレンダリングされる直前に、この方法でビーンに設定されます。

バリデーションに関しては、次の例では、パラメータに 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> は、JSF2.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 があります。 また a <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 ビーンです。

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の入力コンポーネントでは無効であることに注意してください(それはすでに"隠蔽"を行っています)。


こちらもご覧ください。