本篇来讲诉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的方式,只是提供了简化。