カスタムViewDeclarationLanguage
あなたがcreateView()
を測定することにより、buildView()
、renderView()
および必要に応じrestoreView()
方法であればであることを行うことができます。
ここでキックオフの例です:
public class VdlLogger extends ViewDeclarationLanguageWrapper {
private static final Logger logger = Logger.getLogger(VdlLoggerFactory.class.getName());
private ViewDeclarationLanguage wrapped;
public VdlLogger(ViewDeclarationLanguage wrapped) {
this.wrapped = wrapped;
}
@Override
public UIViewRoot createView(FacesContext context, String viewId) {
long start = System.nanoTime();
UIViewRoot view = super.createView(context, viewId);
long end = System.nanoTime();
logger.info(String.format("create %s: %.6fms", viewId, (end - start)/1e6));
return view;
}
@Override
public void buildView(FacesContext context, UIViewRoot view) throws IOException {
long start = System.nanoTime();
super.buildView(context, view);
long end = System.nanoTime();
logger.info(String.format("build %s: %.6fms", view.getViewId(), (end - start)/1e6));
}
@Override
public void renderView(FacesContext context, UIViewRoot view) throws IOException {
long start = System.nanoTime();
super.renderView(context, view);
long end = System.nanoTime();
logger.info(String.format("render %s: %.6fms", view.getViewId(), (end - start)/1e6));
}
@Override
public ViewDeclarationLanguage getWrapped() {
return wrapped;
}
}
それは、実行以下の工場作成するために取得するには:
public class VdlLoggerFactory extends ViewDeclarationLanguageFactory {
private ViewDeclarationLanguageFactory wrapped;
public VdlLoggerFactory(ViewDeclarationLanguageFactory wrapped) {
this.wrapped = wrapped;
}
@Override
public ViewDeclarationLanguage getViewDeclarationLanguage(String viewId) {
return new VdlLogger(wrapped.getViewDeclarationLanguage(viewId));
}
@Override
public ViewDeclarationLanguageFactory getWrapped() {
return wrapped;
}
}
をそしてfaces-config.xml
で以下のように登録:
<factory>
<view-declaration-language-factory>com.example.VdlLoggerFactory</view-declaration-language-factory>
</factory>
createView()
は、コンクリートを作成するステップですUIViewRoot
インスタンスbaビューファイルに<f:view>
と<f:metadata>
があります。 Facelets(XHTML)をビューとして使用する場合、このステップではすべての関連するXHTMLファイルがSAXパーサーによって解析され、javax.faces.FACELETS_REFRESH_PERIOD
で定義されている時間キャッシュされます。だから、それは比較的ゆっくりとした1つの時間であり、他の時間は急速に激しくなることがあります。
buildView()
は、ビュー(XHTML)の構成に基づいてJSFコンポーネントツリー(getChildren()
:UIViewRoot
)を入力するステップです。このステップの間、全てのtaghandlers(JSTLや友人は)(詳細は、またJSTL in JSF2 Facelets... makes sense?を参照)が実行されており、それらのtaghandlersとコンポーネントのid
とbinding
属性のすべてのEL式が評価されます。したがって、ビューの作成時に初めてバッキングBeanを構築し、@PostConstruct
の間にビジネスロジックを呼び出すと、時間がかかることがあります。
renderView()
はUIViewRoot#encodeAll()
始まる、JSFコンポーネント・ツリーとモデルに基づいてHTML出力を生成するステップです。したがって、レンダリング時間中に初めてバッキングBeanを構築し、@PostConstruct
の間にビジネスロジックを呼び出すと、時間がかかることがあります。またはその他の1回発生のライフサイクル・イベント・リスナーではなく、バッター・ビーンがゲッター・メソッドでビジネス・ロジックを誤って実行している場合、これはさらに時間がかかることがあります。 Why JSF calls getters multiple timesも参照してください。
これはちょうど...素晴らしいです。ありがとうございました! – user2271933
よろしくお願いいたします。 – BalusC
[ViewDeclarationLanguageWrapper](http://docs.oracle.com/javaee/7/api/javax/faces/view/ViewDeclarationLanguageWrapper.html)が2.2に追加されました。あなたはこれを2.1で動作するように変更するのは簡単でしょうか、それを実装する別の方法を探す方が良いでしょうか? –