每一个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,而后按照servlet的调用方式进行调用。 java
因为JSP第一次访问时会翻译成servlet,因此第一次访问一般会比较慢,但第二次访问,JSP引擎若是发现JSP没有变化,就再也不翻译,而是直接调用,因此程序的执行效率不会受到影响。 web
JSP引擎在调用JSP对应的_jspServlet时,会传递或建立9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时得到这些web对象的引用,特地定义了9个相应的变量,开发人员在JSP页面中经过这些变量就能够快速得到这9大对象的引用。编程
page对象表示当前一个JSP页面,能够理解为一个对象自己,即:把一个JSP看成一个对象来看待。page对象在开发中几乎不用,了解一下便可。浏览器
out对象用于向客户端发送文本数据。 缓存
out对象是经过调用pageContext对象的getOut方法返回的,其做用和用法与ServletResponse.getWriter方法返回的PrintWriter对象很是类似。 服务器
JSP页面中的out对象的类型为JspWriter,JspWriter至关于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性能够调整它的缓存大小,甚相当闭它的缓存。session
只有向out对象中写入了内容,且知足以下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并经过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:app
设置page指令的buffer属性关闭了out对象的缓存功能jsp
out对象的缓冲区已满spa
整个JSP页面结束
out对象的工做原理图:
pageContext对象是JSP技术中最重要的一个对象,它表明JSP页面的运行环境,这个对象不只封装了对其它8大隐式对象的引用,它自身仍是一个域对象(容器),能够用来保存数据。而且,这个对象还封装了web开发中常常涉及到的一些经常使用操做,例如引入和跳转其它资源、检索其它域对象中的属性等。
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
若是在编程过程当中,把pageContext对象传递给一个普通java对象,那么这个java对象将能够获取8大隐式对象,此时这个java对象就能够和浏览器交互了,此时这个java对象就成为了一个动态web资源了,这就是pageContext封装其它8大内置对象的意义,把pageContext传递给谁,谁就能成为一个动态web资源,那么什么状况下须要把pageContext传递给另一个java类呢,什么状况下须要使用这种技术呢?
在比较正规的开发中,jsp页面是不容许出现java代码的,若是jsp页面出现了java代码,那么就应该想办法把java代码移除掉,咱们能够开发一个自定义标签来移除jsp页面上的java代码,首先围绕自定义标签写一个java类,jsp引擎在执行自定义标签的时候就会调用围绕自定义标签写的那个java类,在调用java类的时候就会把pageContext对象传递给这个java类,因为pageContext对象封装了对其它8大隐式对象的引用,所以在这个java类中就可使用jsp页面中的8大隐式对象
注:pageContext对象在jsp自定义标签开发中特别重要。
findAttribute()方法,这个方法是用来查找各个域中的属性的,查看这个方法的API能够看到关于这个方法的描述:
Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.
当要查找某个属性时,findAttribute方法按照查找顺序”page→request→session→application“在这四个对象中去查找,只要找到了就返回属性值,若是四个对象都没有找到要查找的属性,则返回一个null。
注:EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
public java.lang.Object getAttribute(java.lang.String name,int scope) public void setAttribute(java.lang.String name, java.lang.Object value,int scope) public void removeAttribute(java.lang.String name,int scope)
表明各个域的常量:
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。
方法接收的资源若是以“/”开头, “/”表明当前web应用。
这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher("/*.jsp").forward(request, response);这种写法的。
在实际开发中,使用pageContext.forward(relativeUrlPath)方法跳转页面用得很少,主要是由于要在Jsp页面中嵌套java代码,因此这种作法简单了解一下便可,在开发中,要想从一个Jsp页面采用服务器端跳转的方式跳转到另外一个Jsp页面,那么通常会使用<jsp:forward>标签,<jsp:forward>标签用于把请求转发给另一个资源。