jsp PageContext对象的生命周期是什么?它是线程安全的吗



jsp PageContext对象是作为http请求响应周期的一部分创建和销毁的,还是在请求之间缓存和重用的。

PageContext的生命周期方法建议在请求之间重用。即initialize()、release()。

如果它们被重用,这可能会带来严重的并发问题:如果两个http请求到达,请求同一个jsp页面,并且每个请求都由自己的线程处理,但在共享的PageContext对象上设置了属性,那么它们将呈现彼此的内容。

感谢您的帮助。顺便说一下,我正在使用ApacheSling中嵌入的servlet容器。

PageContext只能从您的JSP页面中使用。如果您的请求首先由servlet处理,然后转发到JSP页面(使用RequestDispatcher.forward),则pageContext仅在此JSP页面上可用,但无法从servlet访问它(因为当时还没有pageContext)。

从JSP页面的角度来看,每次调用它都会得到新的pageContext。页面上下文可以在内部汇集,但不能由多个JSP页面同时共享。

initializerelease方法有这样的注释:"页面或标记库作者不应该使用此方法。"忘记它们吧。

Peter是正确的。CCD_ 3被提供用于处理页面的范围。使用者不应该在这个范围之外保留对这些实例的引用,这意味着实例不应该在当前线程之外访问。

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实例(从池或实例创建)是容器的实现细节。

最新更新