运行原理:每个jsp页面在第一次被访问时,web容器都会把请求交给jsp引擎(即一个java程序)去处理,jsp引擎先将jsp翻译成一个_jspServlet(实质上是一个servlet),然后按servlet的调用方式进行调用。jsp第一次访问会翻译成servlet,所以第一次访问比较慢,但第二次访问时,jsp引擎如果发现jsp没有变化,就不再翻译,而是直接调用,所以程序执行效率不会受影响。
jsp引擎在调用jsp对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。开发人员在jsp页面通过这些变量可以获得这9大对象的引用。
九大隐式对象:
request
response
session
application
config
page
out
exception
pageContext
out隐式对象:向客户端发送文本数据。out对象通过调用pageContext对象的getOut方法返回,作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象相似。jsp页面中out隐式对象类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置jsp页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象写入了内容,且满足如下任何一个条件,out对象才去调用ServletResponse.getWriter方法,通过该方法返回的PrintWriter对象将out对象的缓冲区中内容真正写到Servlet引擎提供的缓冲区中:
- 设置page指令的buffer属性关闭了out对象的缓存功能
- out对象的缓冲区已满
- 整个jsp页面结束
pageContext对象:代表jsp页面的运行环境
- 这个对象封装了对其他8大隐式对象的引用
- 它自身是一个域对象,可用来保存数据
- 这个对象还封装了web开发中经常涉及的一些操作,例如引入和跳转其他资源,检索其他域对象中的属性等。
通过pagecontext获取其他对象:(用在自定义标签开发技术里面)
getException:返回exception隐式对象
getPage:返回page隐式对象
getRequest:返回request隐式对象
getResponse:返回response隐式对象
getServletConfig:返回config隐式对象
getServletContext:返回application隐式对象
getSession:返回session隐式对象
getOut:返回out隐式对象
pageContext的生命周期:整个页面
pageContext作为域对象的一个重要方法:findAttribute:查找各个域中的属性(依次查找page域、request域、session域、application域)
pageContext引入和跳转到其他资源:pageContext类中定义了一个forward方法和两个include方法分别简化和替代RequestDispatcher.forward方法和include方法。
引申:web开发4大域对象:
pageContext:page域
request:request域
session:session域
servletContext:application域