簡體   English   中英

jsp中的頁面范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM