postback中に復元されたビューが返されたときに、ビューを手動で作成および構築できます。カスタムでこれを行うことができます。キックオフの例を次に示します。null
ViewHandler
public class RestorableViewHandler extends ViewHandlerWrapper {
private ViewHandler wrapped;
public RestorableViewHandler(ViewHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public UIViewRoot restoreView(FacesContext context, String viewId) {
UIViewRoot restoredView = wrapped.restoreView(context, viewId);
if (!(restoredView == null && context.isPostback())) {
return restoredView;
}
UIViewRoot createdView = createView(context, viewId);
context.setViewRoot(createdView);
try {
getViewDeclarationLanguage(context, viewId).buildView(context, createdView);
} catch (IOException e) {
throw new FacesException(e);
}
return createdView;
}
@Override
public ViewHandler getWrapped() {
return wrapped;
}
}
がログイン ページを表しているif
場合は、チェックを追加してチェックを拡張することもできます。viewId
実行するには、次のように に登録しますfaces-config.xml
。
<application>
<view-handler>com.example.RestorableViewHandler</view-handler>
</application>
ただし、技術的な制限があります。再作成されたビューは最初のリクエスト時とまったく同じです。そのため、タグハンドラによって、または一部のビューまたはセッション スコープ変数に基づいて条件付きでレンダリングされたコンポーネントによって、その後行われた JSF コンポーネント ツリーへの変更、完全に失われます。目的のビューを正確に再作成するには、これらの変更が、ビューまたはセッション スコープの変数ではなく、リクエスト スコープの変数 (つまり、リクエスト パラメーター) に基づいて行われていることを確認する必要があります。
つまり、ビューの状態は、ビューまたはセッション スコープのマネージド Bean に依存するのではなく、純粋にリクエスト スコープのマネージド Bean に依存する必要があります。
更新: OmniFaces<o:enableRestorableView>
JSF ユーティリティ ライブラリには、現在の 1.3 スナップショットに、組み込み可能なフレーバーの再利用可能なソリューションがあり<f:metadata>
ます。デモについては、<o:enableRestorableView>
スナップショット サイトのショーケース ページも参照してください。