4

jsp PageContext オブジェクトは、http 要求と応答のサイクルの一部として作成および破棄されるか、または要求間でキャッシュされて再利用されます。

PageContext には、リクエスト間の再利用を提案するライフサイクル メソッドがあります。つまり、initialize()、release() です。

それらが再利用されると、重大な並行性の問題が発生する可能性があります。2 つの http 要求が到着し、同じ jsp ページを要求し、各要求が独自のスレッドによって処理され、共有 PageContext オブジェクトに属性が設定されている場合、それらは互いのコンテンツをレンダリングします。

どんな助けでも感謝します。ちなみにApache Slingに埋め込まれたサーブレットコンテナを使っています。

4

2 に答える 2

4

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

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

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

于 2012-03-06T09:56:44.280 に答える
3

ピーターは正しいです。PageContext、ページの処理範囲に対してプロビジョニングされています。コンシューマーは、このスコープ外でこれらのインスタンスへの参照を保持しないでください。これは、現在のスレッドの外部でインスタンスにアクセスできないことを暗黙的に意味します。

JSP 2.2仕様のJSP処理コードの例:

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);
  }
}

PageContextインスタンスが(プールまたはインスタンスの作成から)プロビジョニングされる方法は、コンテナーの実装の詳細です。

于 2012-03-06T10:35:25.723 に答える