[解決済み] <f:metadata>、<f:viewParam>、<f: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
. -
必要に応じて変換し、検証する(
required
,validator
とconverter
属性のネストと<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の入力コンポーネントでは無効であることに注意してください(それはすでに"隠蔽"を行っています)。
こちらもご覧ください。
関連
-
[解決済み] javax.faces.application.ViewExpiredException: ビューを復元できませんでした
-
[解決済み] JSF 2.2でターゲットが到達できない、識別子がヌルに解決される [重複] 。
-
[解決済み] java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config [duplicate].
-
[解決済み] javax.validation.ConstraintViolationException
-
[解決済み] p:dashboardが終了してもソート順を維持する。
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
-
[解決済み】JSFリソースライブラリは何のためにあり、どのように使用すべきですか?
-
[解決済み】PrimeFacesのprocess/updateとJSFのf:ajax execute/renderの属性を理解する。
-
[解決済み] JSF2 FaceletsでJSTL...意味があるのか?
-
[解決済み] divタグをレンダリングできるjsfコンポーネントは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] javax.faces.application.ViewExpiredException: ビューを復元できませんでした
-
[解決済み] JSF 2.2でターゲットが到達できない、識別子がヌルに解決される [重複] 。
-
[解決済み] java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
-
[解決済み] p:dashboardが終了してもソート順を維持する。
-
[解決済み] actionとactionListenerの違い
-
[解決済み] ビーンスコープを正しく選ぶには?
-
[解決済み】JSF 2.0 Faceletsを使用してXHTMLに別のXHTMLを含めるにはどうすればよいですか?
-
[解決済み] JSF2 FaceletsでJSTL...意味があるのか?
-
[解決済み] divタグをレンダリングできるjsfコンポーネントは何ですか?
-
[解決済み] h:commandLinkの代わりにh:outputLinkを使うべきですか?