回答:
<f:viewParam>
GETパラメータの設定、変換、および検証を管理します。これはに似て<h:inputText>
いますが、GETパラメータの場合です。
次の例
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
基本的には次のことを行います。
id
。required
、validator
および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" />
このために使用できます<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>
、非常に同じパラメータで、それ以外の場合は、通過されることはありません。
<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>
のためである<f:viewParam>
、ないプレーンなHTML <input type="text">
!また、入力値は空の場合に表示さ#{param.query}
れることに注意して#{bean.query}
ください。これは、検証エラーまたは変換エラーが発生した場合、送信された値が表示されないためです。このコンストラクトはJSF入力コンポーネントに対しては無効であることに注意してください(これは、すでに「内部」で実行されています)。