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

Posted

技术标签:

【中文标题】jsp PageContext 对象的生命周期是啥——它是线程安全的吗?【英文标题】:What is the lifecycle of a jsp PageContext object - is it threadsafe?jsp PageContext 对象的生命周期是什么——它是线程安全的吗? 【发布时间】:2012-03-23 18:51:06 【问题描述】:

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

PageContext 具有建议在请求之间重用的生命周期方法。即初始化(),释放()。

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

任何帮助表示赞赏。顺便说一句,我使用的是嵌入在 Apache Sling 中的 servlet 容器。

【问题讨论】:

【参考方案1】:

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

从 JSP 页面的角度来看,每次调用它都会获取新的 pageContext。页面上下文可以在内部进行池化,但不能同时由多个 JSP 页面共享。

initializerelease 方法有这样的注释:“页面或标签库作者不应使用此方法。”忘记他们吧。

【讨论】:

这很高兴知道,但是如果没有回收它们,为什么 PageContext 有生命周期方法呢???? @murungu:容器可能使用页面上下文对象池。容器调用这些方法来指示页面上下文使用的开始和结束。页面上下文应该进行必要的初始化或清理。这些方法并不是由 JSP 页面作者调用的。【参考方案2】:

Peter is correct. PageContext 用于处理页面的范围。消费者不应在此范围之外保留对这些实例的引用,这隐含意味着实例不应在当前线程之外访问。

来自JSP 2.2 specification的示例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 实例的配置方式(从池或实例创建)是容器的实现细节。

【讨论】:

以上是关于jsp PageContext 对象的生命周期是啥——它是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章

j2ee四大作用域pagecontext,request,session,ServletContext(转)

pageContextrequestsession和application区别

JSP自定义标签

jsp作业:内置对象的4个作用范围是啥?啥情况下session会关闭?

jsp内置对象的作用范围

如何开发自定义标签