本篇來講訴JSP中九大隱式對象中最后一個,也是最重要的一個對象——pageContext對象。
pageContext對象代表了該JSP頁面的運行環境,它的作用有:
① 這個對象封裝了對其它八大隱式對象的引用
② pageContext自身還是一個域對象,可以用來保存數據,同時可以通過pageContext這個域對象操作另外三個域(Request域,Session域,ServletContext域)
③ pageContext封裝了WEB開發中經常涉及到的一些常用操作,例如包含和跳轉到其他資源,檢索其他域對象中保存的值等等。
比如我們去看看JSP的API,可以看到,在pageContext中有很多獲取其他隱式對象的方法:
如果是寫JSP,其實在JSP頁面中是不能有Java代碼的,所有的Java代碼都需要使用自定義標簽來封裝,因此,其實這些方法都是在自定義標簽中使用,而在自定義標簽中,我們就無法使用另外八大隱式對象了,只能使用pageContext,因此在自定義標簽中必須利用pageContext來獲取其他隱式對象。
pageContext能作為一個域對象來存儲數據,通常稱為page域,而這個page域的范圍只是在當前JSP頁面中。例如我們可以使用pageContext.setAttribute方法和pageContext.getAttribute方法(這兩個方法都從pageContext的父類JSPContext類繼承而來)來在page域中設置和獲取某個屬性值,即存儲的數據:
同時,pageContext還能指定存儲的數據應該保存在哪個域中,並不止在page域上,當然還是剛才那兩個方法,只不過重載了:
其中,“scope”參數代表各個域的常亮,有如下幾個常亮:
pageContext中最重要的方法:findAttribute方法,使用pageContext.findAttribute方法能從四個域(page, request, session, context)中尋找存儲的數據,查找的順序也是從小到大(page--->request--->session--->context),只要在某個域中能查到相對應的鍵值對,就返回,如果四個域都沒有則返回null。這個方式對於EL表達式是最重要的,例如JSP頁面中有一個EL表達式: ${data} 最終在Servlet中就會被翻譯成 pageContext.findAttribute(“data”)。
pageContext還提供了include包含和forward跳轉這兩種方法,這兩種方法是request.getRequestDispatch.include方法和request.getRequestDispatch.forward方法的簡化,其實pageContext.include和pageContext.forward在Servlet中內部依然還是使用request的方式,只是提供了簡化。