jsp PageContext对象是作为http请求响应周期的一部分创建和销毁的,还是在请求之间缓存和重用的。
PageContext的生命周期方法建议在请求之间重用。即initialize()、release()。
如果它们被重用,这可能会带来严重的并发问题:如果两个http请求到达,请求同一个jsp页面,并且每个请求都由自己的线程处理,但在共享的PageContext对象上设置了属性,那么它们将呈现彼此的内容。
感谢您的帮助。顺便说一下,我正在使用ApacheSling中嵌入的servlet容器。
PageContext只能从您的JSP页面中使用。如果您的请求首先由servlet处理,然后转发到JSP页面(使用RequestDispatcher.forward),则pageContext仅在此JSP页面上可用,但无法从servlet访问它(因为当时还没有pageContext)。
从JSP页面的角度来看,每次调用它都会得到新的pageContext。页面上下文可以在内部汇集,但不能由多个JSP页面同时共享。
initialize
和release
方法有这样的注释:"页面或标记库作者不应该使用此方法。"忘记它们吧。
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
实例(从池或实例创建)是容器的实现细节。