2

私のjsfアプリケーションには、静的FacesContext関連のユーティリティメソッドがたくさんあります。そしていつも私は同じ質問をしますか?

メソッドに引数を介してコンテキストを渡す必要がありますか? または使用FacesContext.getCurrentInstance()

例えば:

public static <T> T getInstance(final Class<T> type, final FacesContext context, final String elExpression)
{
    return context.getApplication().evaluateExpressionGet(context, elExpression, type);
}

バリデーターとコンバーターのインターフェースはコンテキストを引数として使用するため、さらに混乱が生じます。

複数の FacesContext を使用できますか?

4

2 に答える 2

4

呼び出しFacesContext.getCurrentInstance()と渡しは、パフォーマンスと機能に影響を与えます。

お気づきかもしれませんが、JSF API 自体の大部分は引き渡しを使用しています。これは、スレッド ローカル変数にアクセスするよりも渡す方がはるかに高速であるためです。その上、引き渡しにより、呼び出しチェーンの下流にあるメソッドは、FacesContext をより簡単かつ制御された方法でラップできます。

したがって、通常FacesContext.getCurrentInstance()はブートストラップに使用され、その後に渡すことを使用します。

数回の呼び出しのみに関係し、冗長性が得られる場合は、ぜひ使用FacesContext.getCurrentInstance()してください。多数の呼び出しに関係する場合は、(小さな) パフォーマンスへの影響が生じる可能性があることに注意してください。

于 2012-11-24T10:17:36.680 に答える
2

前の質問で、BalusCはこれに答えました:

つまり、FacesServletは、FacesContextを作成し、それを現在のHTTPリクエストにThreadLocalとして配置するものです。

ユーティリティがHTTPリクエストを処理するスレッド以外のスレッドで使用される場合は、nullを回避するためにFacesContextを渡す必要があります。それ以外は、FacesContext.getCurrentInstance()すべてのメソッドで冗長な呼び出しを回避するのに役立つと思います。

または、両方を組み合わせて使用​​することもできます。

public static <T> T getInstance(final Class<T> type, final String elExpression){
    return JsfUtils.getInstance(type, FacesContext.getCurrentInstance(), elExpression);
}


public static <T> T getInstance(final Class<T> type, final FacesContext context, final String elExpression){
    return context.getApplication().evaluateExpressionGet(context, elExpression, type);
}

これは、パフォーマンスのトレードオフ(スレッドローカルへのアクセスについて)に役立ち、必要に応じて冗長性にも役立ちますが、コンテキストでのスレッドセーフについて覚えておく必要があります。

于 2012-11-24T01:07:33.170 に答える