このスニペットを一般的に、または実際の例でどのように使用できるかを明確にできる人はいますか?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
このスニペットを一般的に、または実際の例でどのように使用できるかを明確にできる人はいますか?
<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}
か、value
属性が存在しない場合は、名前のリクエスト属性として設定して、ビューでid
使用できるよう#{id}
にします。したがって、ページを開くと、ビューがレンダリングされる直前に、foo.xhtml?id=10
パラメーター値がこのように Bean に設定されます。10
検証に関しては、次の例では 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 以降で新しく追加されました ( は<f:viewParam>
JSF 2.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
<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);
}
はプレーンな HTML ではなく、<h:message>
用であることに注意してください。また、 が空の場合は入力値が表示されることにも注意してください。これは、検証または変換エラーが発生した場合に送信された値がまったく表示されないためです。この構造は、JSF 入力コンポーネントに対しては無効であることに注意してください (すでに「隠れて」実行されています)。<f:viewParam>
<input type="text">
#{param.query}
#{bean.query}