1. 程式人生 > >通過案例比較四大域物件的作用域

通過案例比較四大域物件的作用域

pageContext的作用域只在當前頁面:
重點:
pageContext可以操作其他三大域物件

pageContext.setAttribute("p","request",PageContext.REQUEST_SCOPE);
等同於req.setAttribute("p","request"); 
其他session application 類似

pageContext.jsp

<body>
    <%
            pageContext.setAttribute("p","pp");
            request.getRequestDispatcher("/pageContext1.jsp"
).forward(request,response); //pageContext可以操作其他三大域物件 //pageContext.setAttribute("p","request",PageContext.REQUEST_SCOPE); //等同於 req.setAttribute 其他session application 類似 %>
</body>

pageContext1.jsp

<body>
    <%=pageContext.getAttribute("p")%>
</body>

pageContext.jsp轉發到pageContext.jsp的結果為:
null

1.看看轉發過後,四個作用域是否能取到值:

pageContext.jsp

<%
            pageContext.setAttribute("p","pp");
            request.setAttribute("p","request");
            session.setAttribute("p","session");
            application.setAttribute("p","application"
); request.getRequestDispatcher("/pageContext1.jsp").forward(request,response); //pageContext可以操作其他三大域物件 //pageContext.setAttribute("p","request",PageContext.REQUEST_SCOPE); //等同於 req.setAttribute 其他session application 類似 %>

pageContext1.jsp

<body>
        <%=pageContext.getAttribute("p")%>
        <%=request.getAttribute("p")%>
        <%=session.getAttribute("p")%>
        <%=application.getAttribute("p")%>
</body>

結果如下所示:
轉發jsp後四個作用域的分別取值情況

2.重定向後看看四個作用域的取值情況

這裡寫圖片描述

3.不轉發也不重定向,先訪問pageContext.jsp,再訪問pageContext1.jsp

這裡寫圖片描述
session能取到值的原因:
當瀏覽器去訪問第一個jsp時,伺服器端已經建立了一個session,並將sessionId回了瀏覽器端的cookie,當瀏覽器訪問此應用下的第二個頁面時,瀏覽器端帶著sessionId,那麼伺服器端就知道是同一個session了。

4.pageContext的重要方法

findAttribute(String name);
自動從page request session application依次查詢,找到了就取值,結束查詢。

四大域物件:實際開發

PageContext : pageConext 存放的資料在當前頁面有效。開發時使用較少。
ServletRequest: request 存放的資料在一次請求(轉發)內有效。使用非常多。
HttpSession: session 存放的資料在一次會話中有效。使用的比較多。如:存放使用者的登入資訊,購物車功能。
ServletContext: application 存放的資料在整個應用範圍內都有效。因為範圍太大,應儘量少用。