一、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标签引入资源,因此这种做法了解一下即可。

转载于:https://www.cnblogs.com/zyn1990/p/3979291.html

JavaWeb学习总结(二)——JSP中的九个内置对象相关推荐

  1. JavaWeb学习总结(十七)——JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  2. JavaWeb学习总结(十七):JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  3. JavaWeb(十七)——JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  4. JSP中的九个内置对象

    2019独角兽企业重金招聘Python工程师标准>>> 一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引 ...

  5. Java Web学习总结(16)——JSP的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  6. JSP学习 三大指令、九个内置对象、JavaBean、EL表达式

    1.page-->最复杂:<%@page language="java" info="xxx"...%>* pageEncoding和cont ...

  7. jsp是在html中添加什么作用域,JSP九个内置对象 四大作用域 动作指令

    九个内置对象: 1.application:javax.servlet.ServletContext的实例,代表JSP所属的web应用本身,常用的方法有getAttribute(). 2.config ...

  8. JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

       前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...

  9. 【融职培训】Web前端学习 第3章 JavaScript基础教程9 内置对象

    一.内置对象概述 javascript为我们提供了很多内置对象,这些内置对象为我们提供了很多语言的基本功能.我们之前学过的数组就是JavaScript的内置对象,除了数组我们还应该了解的内置对象有:M ...

最新文章

  1. 【 MATLAB 】协方差 cov以及协方差矩阵基础知识
  2. Sprint Three 回顾与总结发表评论团队贡献分
  3. SQL语言基础:SQL授权相关知识笔记​
  4. ORA-01858: 在要求输入数字处找到非数字字符 13行
  5. 如何设置电脑自动锁屏_办公族如何设置自动关闭显示器,让显示屏锁屏,防止偷看你电脑。...
  6. 在几何画板中如何制作圆柱的侧面展开动画_几何画板制作圆柱体的形成动画演示方法...
  7. svn的安装包和中文语言包下载
  8. JAVA 两个队列实现栈
  9. mysql查询不到的数据补0
  10. 手披云雾开鸿蒙,赞美泰山的诗句
  11. 【educoder 机器学习】决策树
  12. 联想lenovo进bios
  13. 今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日
  14. php twig if,php – twig:如果有多个条件
  15. Unity制作2D游戏FlappyBird
  16. 如何做一个统计网页访问量的功能
  17. android实现猜扑克牌小游戏(改进:每次只可以选择一张)
  18. 解决微信小程序新版本覆盖 更新慢的问题
  19. oracle dbsat数据库安全评估工具的使用
  20. 期末作业代码网页设计代码——优分期大学生购物商城(7页) 大学生大学生购物商城作业模板下载 静态HTML购物商城网页制作下载_网页设计代码

热门文章

  1. RISC-V评估系列
  2. C#解析json文件的方法
  3. C++ 线程同步之临界区CRITICAL_SECTION
  4. win32汇编基础概念
  5. c++callback回调实例
  6. C#中使用WeiFenLuo.WinFormsUI.Docking.dll实现窗口停靠效果
  7. ios15使用纯代码计算cell的高度
  8. IOS之自动创建项目各个文件夹
  9. PHP无用图片清理,php – 如何在img / p /上删除Prestashop无用的图像
  10. php编码和c语言,急求windows下用c语言开发PHP扩展时,在C语言里把字符串转成utf-8编码再打印的方法。...