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 页面共享。
initialize
和 release
方法有这样的注释:“页面或标签库作者不应使用此方法。”忘记他们吧。
【讨论】:
这很高兴知道,但是如果没有回收它们,为什么 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区别