2012-03-06 10 views
4

jsp PageContextオブジェクトは、http要求 - 応答サイクルの一部として作成されたり破棄されたり、リクエスト間でキャッシュされ再利用されます。jsp PageContextオブジェクトのライフサイクルは何ですか?スレッドセーフですか?

PageContextには、要求間の再利用を提案するライフサイクルメソッドがあります。すなわち、initialize()、release()です。

2つのhttp要求が到着し、同じjspページを要求し、各要求が独自のスレッドによって処理され、共有PageContextオブジェクトに属性を設定すると、他のコンテンツ。

助けてください。ところで、私はApache Slingに組み込まれたサーブレットコンテナを使用しています。

答えて

4

PageContextは、JSPページからのみ使用できます。要求がサーブレットによって最初に処理され、JSPページに(RequestDispatcher.forwardを使用して)転送された場合、pageContextはこのJSPページでのみ使用できますが、サーブレットからアクセスする方法はありません(pageContextがまだないため当時)。

JSPページの観点からは、呼び出されるたびに新しいpageContextが取得されています。ページコンテキストは内部的にプールされていても、同時に複数のJSPページで共有されることはありません。

initializeおよびreleaseメソッドには、「このメソッドをページまたはタグライブラリの作成者が使用しないでください」というコメントがあります。ただ彼らを忘れる。

+0

知っておきたいことですが、なぜPageContextにライフサイクルメソッドがあるのですか?それがリサイクルされていないのはなぜですか? – murungu

+0

@murungu:コンテナは、ページコンテキストオブジェクトのプールを使用することがあります。これらのメソッドは、ページコンテキストの使用の開始と終了を示すためにコンテナによって呼び出されます。ページコンテキストは、必要な初期化またはクリーンアップを行う必要があります。これらのメソッドは、JSPページの作成者によって呼び出されることはありません。 –

3

Peter is correct.PageContextは、ページの処理範囲にプロビジョニングされています。コンシューマは、現在のスレッドの外側でインスタンスにアクセスできないように暗黙のうちに指定していることを意味する、このスコープ外のインスタンスへの参照を保持すべきではありません。

JSP 2.2 specificationから例JSP処理コード:PageContextインスタンスが(プールまたはインスタンス作成から)プロビジョニングされている方法

public class foo implements Servlet { 
// ... 
public void _jspService(HttpServletRequest request, HttpServletResponse response) 
       throws IOException, ServletException { 
    JspFactory factory = JspFactory.getDefaultFactory(); 
    PageContext pageContext = factory.getPageContext(
     this, 
     request, 
     response, 
     null, // errorPageURL 
     false, // needsSession 
     JspWriter.DEFAULT_BUFFER, 
     true // autoFlush 
    ); 
    // initialize implicit variables for scripting env ... 
    HttpSession session = pageContext.getSession(); 
    JspWriter out = pageContext.getOut(); 
    Object page = this; 
    try { 
    // body of translated JSP here ... 
    } catch (Exception e) { 
    out.clear(); 
    pageContext.handlePageException(e); 
    } finally { 
    out.close(); 
    factory.releasePageContext(pageContext); 
    } 
} 

コンテナの実装の詳細です。

関連する問題