JSP中的页面范围



我知道页面范围是JSP中的默认范围(与请求/会话/应用程序范围相比,最低特权的范围),并且只能在同一JSP页面中访问对象。p>我想知道是否有可能有两个访问相同JSP页面的用户共享在页面范围上设置的对象值?我高度觉得答案是否定的,但仍然想确认一次。

在其他术语中,PageContext是否在两个用户之间共享?如果我使用pagecontext.setAttribute(....)设置一个对象以在页面范围内,将在两个不同的用户之间共享此对象?

您可以通过查看JSP页面实现类别使用表示范围的PageContext对象来更好地了解页面范围的工作方式。

在javadoc的包装javax.servlet.jsp中有一个示例说明了如何完成此操作。有趣的部分是:

public void _jspService(HttpServletRequest request,
                        HttpServletResponse response)
                        throws IOException, ServletException {
    JspFactory  factory     = JspFactory.getDefaultFactory();
    PageContext pageContext = factory.getPageContext( ... )
    ...
}

您可以看到,当您的servlet将其请求和响应对象转发到JSP时,调用了其页面实现类的_jspService方法,将其作为参数。此后,该方法获得了PageContext对象,并将其存储为方法的本地变量

本地变量是线程内存(未共享),因此,没有任何其他线程为另一个用户(甚至是来自同一用户的)提供请求的任何其他线程可以访问该变量。一旦_jspService返回,该变量就会停止存在。如果另一个线程同时调用_jspService(),则工厂给了它一个不同的PageContext实例。

这导致了一个问题,即从工厂获得的PageContext对象是否始终是一个新实例还是被重复使用的实例。如该问题的答案所述,这是实现依赖性的。在后一种情况下,容器应确保它永远不会将同一实例交给两个不同的线程同时(否则会出现并发问题)。

请注意,在返回之前,_jspService()通过调用earsePageContext()(请参阅Javadoc示例中的finally块)确保PageContext对象是"清洁"任何状态的。这又在PageContext上调用Release(),其效果是"释放所有内部参考,并准备PageContext以进行潜在的重复使用"。因此,当使用汇总实例时,每个线程总是会获得一个"清洁"。

相关内容

  • 没有找到相关文章

最新更新