[英]Page scope in jsp
我知道頁面范圍是 jsp 中的默認范圍(與請求/會話/應用程序范圍相比特權最低),並且對象只能在同一個 jsp 頁面中訪問。
我想知道訪問同一個jsp頁面的兩個用戶是否有可能共享在頁面范圍內設置的對象值? 我高度認為答案是否定的,但仍想確認一次。
換句話說,PageContext 是否在兩個用戶之間共享? 如果我使用 pageContext.setAttribute(....) 將一個對象設置為頁面范圍,這個對象會在兩個不同的用戶之間共享嗎?
通過查看 JSP 頁面實現類如何使用表示所述范圍的PageContext
對象,您可以更好地了解頁面范圍的工作原理。
在包javax.servlet.jsp的 javadoc 中有一個如何完成的示例。 有趣的部分是:
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()
通過調用 releasePageContext _jspService()
確保PageContext
對象已“清除”任何狀態(請參閱 javadoc 示例中的finally
塊)。 這反過來在PageContext
上調用release() ,具有“釋放所有內部引用,並准備 PageContext 以供潛在重用”的效果。 因此,當使用池化實例時,每個線程總是得到一個“干凈”的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.