このスニペットを一般的に、または実際の例で使用する方法を誰もが明確にできますか?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
<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}
値で表される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" />
これには <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.xhtml
がalsoと同じパラメーターで<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>
は、プレーンHTMLの<f:viewParam>
ではなく、<input type="text">
のためのものです!また、#{param.query}
が空の場合、入力値は#{bean.query}
を表示します。これは、検証エラーまたは変換エラーが発生した場合に送信された値がまったく表示されないためです。このコンストラクトはJSF入力コンポーネントに対して無効であることに注意してください(すでに「隠れている」ことを行っています)。