Java Web学习总结(16)——JSP的九个内置对象
一、JSP运行原理
每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
二、认识九个内置对象
NO. | 内置对象 | 类型 |
1 | pageContext | javax.servlet.jsp.PageContext |
2 | request | javax.servlet.http.HttpServletRequest |
3 | response | javax.servlet.http.HttpServletResponse |
4 | session | javax.servlet.http.HttpSession |
5 | application | javax.servlet.ServletContext |
6 | config | javax.servlet.ServletConfig |
7 | out | javax.servlet.jsp.JspWriter |
8 | page | java.lang.Object |
9 | exception | java.lang.Throwable |
request,response,session,application,config这些对象在前面都已经作了详细的介绍,这里重点介绍一下剩下的pageContext对象,out对象,page对象。
三、内置对象使用说明
3.1、page对象
page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可
3.2、out对象
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页面结束
out对象的工作原理图
3.3、pageContext对象
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。
3.4、通过pageContext获得其他对象
- getException方法返回exception隐式对象
- getPage方法返回page隐式对象
- getRequest方法返回request隐式对象
- getResponse方法返回response隐式对象
- getServletConfig方法返回config隐式对象
- getServletContext方法返回application隐式对象
- getSession方法返回session隐式对象
- getOut方法返回out隐式对象
3.5、pageContext封装其它8大内置对象的意义
如果在编程过程中,把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大隐式对象(request,response,config,application,exception,Session,page,out)了,pageContext对象在jsp自定义标签开发中特别重要。
3.6、pageContext作为域对象
pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。
pageContext对象的常用方法
- 1 public void setAttribute(java.lang.String name,java.lang.Object value)
- 2 public java.lang.Object getAttribute(java.lang.String name)
- 3 public void removeAttribute(java.lang.String name)
- 4 public java.lang.Object findAttribute(java.lang.String name)
重点介绍一下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。
范例:使用pageContext的findAttribute方法查找属性值

- 1 <%@page contentType="text/html;charset=UTF-8"%>
- 2 <%@page import="java.util.*"%>
- 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- 4 <head>
- 5 <title>pageContext的findAttribute方法查找属性值</title>
- 6 </head>
- 7 <%
- 8 pageContext.setAttribute("name1", "孤傲苍狼");
- 9 request.setAttribute("name2", "白虎神皇");
- 10 session.setAttribute("name3", "玄天邪帝");
- 11 application.setAttribute("name4", "灭世魔尊");
- 12 %>
- 13 <%
- 14 //使用pageContext的findAttribute方法查找属性,由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
- 15 //查找name1属性,按照顺序"page→request→session→application"在这四个对象中去查找
- 16 String refName1 = (String)pageContext.findAttribute("name1");
- 17 String refName2 = (String)pageContext.findAttribute("name2");
- 18 String refName3 = (String)pageContext.findAttribute("name3");
- 19 String refName4 = (String)pageContext.findAttribute("name4");
- 20 String refName5 = (String)pageContext.findAttribute("name5");//查找一个不存在的属性
- 21 %>
- 22 <h1>pageContext.findAttribute方法查找到的属性值:</h1>
- 23 <h3>pageContext对象的name1属性:<%=refName1%></h3>
- 24 <h3>request对象的name2属性:<%=refName2%></h3>
- 25 <h3>session对象的name3属性:<%=refName3%></h3>
- 26 <h3>application对象的name4属性:<%=refName4%></h3>
- 27 <h3>查找不存在的name5属性:<%=refName5%></h3>
- 28 <hr/>
- 29 <h1>使用EL表达式进行输出:</h1>
- 30 <h3>pageContext对象的name1属性:${name1}</h3>
- 31 <h3>request对象的name2属性:${name2}</h3>
- 32 <h3>session对象的name3属性:${name3}</h3>
- 33 <h3>application对象的name4属性:${name4}</h3>
- 34 <h3>不存在的name5属性:${name5}</h3>

运行结果:
EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
pageContext对象中封装了访问其它域的方法
- 1 public java.lang.Object getAttribute(java.lang.String name,int scope)
- 2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
- 3 public void removeAttribute(java.lang.String name,int scope)
代表各个域的常量
- 1 PageContext.APPLICATION_SCOPE
- 2 PageContext.SESSION_SCOPE
- 3 PageContext.REQUEST_SCOPE
- 4 PageContext.PAGE_SCOPE
范例:pageContext访问其它域

- 1 <%@page contentType="text/html;charset=UTF-8"%>
- 2 <%@page import="java.util.*"%>
- 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- 4 <head>
- 5 <title>pageContext访问其它域</title>
- 6 </head>
- 7 <%
- 8 //此时相当于往session对象中存放了一个name属性,等价于 session.setAttribute("name","孤傲苍狼");
- 9 pageContext.setAttribute("name","孤傲苍狼",PageContext.SESSION_SCOPE);
- 10 %>
- 11 <%
- 12 //取得session对象的属性,使用pageContext对象获取
- 13 String refName1 = (String)pageContext.getAttribute("name",PageContext.SESSION_SCOPE);
- 14 //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
- 15 String refName2 = (String)session.getAttribute("name");
- 16 %>
- 17 <h1>取出存放在session对象中的属性值:</h1>
- 18 <p>第一种做法:使用pageContext.getAttribute("attributeName",PageContext.SESSION_SCOPE);去取出session对象中值</p>
- 19 <h3>姓名:<%=refName1%></h3>
- 20 <p>第二种做法:使用session.getAttribute("attributeName");去取出session对象中值</p>
- 21 <h3>姓名:<%=refName2%></h3>

3.7、PageContext引入和跳转到其他资源
PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。
方法接收的资源如果以“/”开头, “/”代表当前web应用。
范例:使用pageContext的forward方法跳转到其他页面

- 1 <%@page contentType="text/html;charset=UTF-8"%>
- 2 <%@page import="java.util.*"%>
- 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- 4 <head>
- 5 <title>使用pageContext的forward方法跳转页面</title>
- 6 </head>
- 7 <%
- 8 //使用pageContext的forward方法跳转到pageContextDemo05.jsp页面,/代表了当前的web应用
- 9 pageContext.forward("/pageContextDemo05.jsp");
- 10 //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
- 11 //使用RequestDispatcher的forward方法实现的跳转方式
- 12 //pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);
- 13 %>

运行结果如下:
- 1 pageContext.forward("/pageContextDemo05.jsp");
这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);这种写法的。在实际开发中,使用pageContext.forward(relativeUrlPath)方法跳转页面用得不多,主要是因为要在Jsp页面中嵌套java代码,所以这种做法简单了解一下即可,在开发中,要想从一个Jsp页面采用服务器端跳转的方式跳转到另一个Jsp页面,那么一般会使用<jsp:forward>标签,<jsp:forward>标签用于把请求转发给另外一个资源。
范例:使用pageContext的include方法引入资源

- 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- 3 <head>
- 4 <title>使用pageContext的include方法引入资源</title>
- 5 </head>
- 6 <%
- 7 pageContext.include("/jspfragments/head.jsp");
- 8 %>
- 9 使用pageContext的include方法引入资源
- 10 <%
- 11 pageContext.include("/jspfragments/foot.jsp");
- 12 %>
- 13 <hr/>
- 14 <%--
- 15 <jsp:include page="/jspfragments/head.jsp"/>
- 16 使用jsp:include标签引入资源
- 17 <jsp:include page="/jspfragments/foot.jsp"/>
- 18 --%>

运行结果:
在实际开发中,使用pageContext的include方法引入页面这种做法也很少用,一般都使用jsp:include标签引入资源,因此这种做法了解一下即可。
Java Web学习总结(16)——JSP的九个内置对象的更多相关文章
- Jsp的九个内置对象
一.什么是内置对象?在jsp开发中,会频繁使用到一些对象.例如HttSession,ServletContext,HttpServletRequest.如果我们每次要使用这些对象都去创建这些对象,就会 ...
- java web学习总结(二十五) -------------------JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- Java Web学习笔记之---JSP
Java Web学习笔记之---JSP (一)JSP常用语法 (1)HTML注释 <!--所要注释的内容 --> 在客户端显示一个注释. (2)隐藏注释 <%--所要注释的内容--% ...
- JavaWeb学习总结(十七)——JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb学习 (十六)————JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JSP学习 三大指令、九个内置对象、JavaBean、EL表达式
1.page-->最复杂:<%@page language="java" info="xxx"...%> * pageEncoding和con ...
- JavaWeb学习总结(十七)——JSP中的九个内置对象(转)
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- javaWeb学习总结(8)- JSP中的九个内置对象(4)
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JSP学习(三)JSP中的九个内置对象
JSP中的九个内置对象 NO. 内置对象 类型 1 pageContext javax.servlet.jsp.PageContext 2 request javax.servlet.http.Htt ...
随机推荐
- RAID信息存放位置!
今天偶然的机会,客户打电话说有一台DELL T110的服务器换了主板电池RAID信息没了进不去系统了,问我怎么处理,T110的RAID是主板集成的S100的RAID卡(算是软RAID,通过BIOS配置 ...
- Js中的数据类型--String
昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 上一期咱们大概了解了下什么是JavaScript,想必大家也都知道 今天主要说下Js中的数据类型 在Js中一共分为六种数据类型 其中基本数据 ...
- 安装php-ldap模块
php-ldap模块作用就是实现ldap认证,因此需要安装 1.安装软件包解决依赖 yum install openldapyum install openldap-devel 2.拷贝库文件 cp ...
- Django_高级扩展
- 【Uva 10285】Longest Run on a Snowboard
[Link]: [Description] 在一个r*c的格子上; 求最长的下降路径; [Solution] 记忆化搜索; f[x][y]表示从(x,y)这个格子往下还能走多远; 因为是严格递增,所以 ...
- CCF模拟题 最优配餐
最优配餐 时间限制: 1.0s 内存限制: 256.0MB 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在 ...
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
- 1、Bracket使用
转自:https://www.jianshu.com/p/393833400782 Adobe的PhotoShop.Dreamweaver等大批优秀软件,印(nue)象(杀)了一代一代的优秀的计算机高 ...
- Spark Tachyon编译部署(含单机和集群模式安装)
Tachyon编译部署 编译Tachyon 单机部署Tachyon 集群模式部署Tachyon 1.Tachyon编译部署 Tachyon目前的最新发布版为0.7.1,其官方网址为http://tac ...
- OpenCV —— 摄像机模型与标定
这种理论看的已经够多了,感觉应用价值不大(矫正畸变图像还凑合,用摄像机测距神马的...) 有始有终吧,简单把内容梳理一下 针孔 摄像机模型 —— 过于理想(不能为快速曝光收集足够的光线) 透镜可以聚 ...