JavaWeb(十七)——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.内置对象类型
1pageContextjavax.servlet.jsp.PageContext
2requestjavax.servlet.http.HttpServletRequest
3responsejavax.servlet.http.HttpServletResponse
4sessionjavax.servlet.http.HttpSession
5applicationjavax.servlet.ServletContext
6configjavax.servlet.ServletConfig
7outjavax.servlet.jsp.JspWriter
8pagejava.lang.Object
9exceptionjava.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/zy-jiayou/p/7365299.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Eclipse上创建JSF / CDI Maven项目

当我在研究JSF和CDI示例时&#xff0c;我认为提及创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下&#xff0c;M2E插件随附的Eclipse Luna。 因此&#xff0c;无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->新建->其他。…

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定&#xff2e;个点以及每个点的权值&#xff0c;要你处理接下来的&#xff2d;个操作。操作有&#xff14;种。操作从&#xff10;到&#xff13;编号。点从&#xff11;到&#xff2e;编号。 &#xff10;&#xff1a;后接两个整数&#xff08;&a…

java api操作hbase_通过JavaAPI使用HBase

1.准备工作(1) 启动zookeeper服务&#xff0c;我的是在本地启动zookeeper/usr/local/zookeeper/bin$ sudo zkServer.sh start(2) 启动HBase和HBase shell启动HBase:/usr/local/hbase/bin下启动start-hbase.sh启动HBase shell/usr/local/hbase/bin下终端输入hbase shell(3) 工程…

duilib入门简明教程 -- 部分bug (11) (转)

原文转自&#xff1a;http://www.cnblogs.com/Alberl/p/3344886.html 一、WindowImplBase的bug在第8个教程【2013 duilib入门简明教程 -- 完整的自绘标题栏(8)】中&#xff0c;可以发现窗口最大化之后有两个问题&#xff0c;1、最大化按钮的样式还是没变&#xff0c;正确的样式…

在考生文件夹存有JAVA3_注意:下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为J_网考网(Netkao.com)...

【分析解答题】注意&#xff1a;下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为Java_2.java文件&#xff0c;本题功能是完成点定义&#xff0c;并输出点坐标。请完善Java_2.java文件&#xff0e;并进行调试&#xff0c;使程序结果如下&#xff1a;x5 y5点的坐标…

jasperreports_JasperReports JSF插件用例系列

jasperreports这是文章系列的切入点&#xff0c;在该系列文章中&#xff0c;我将尝试介绍JasperReport JSF插件的一些用例&#xff0c;该工具的创建是为了轻松地将为JasperReports设计的业务报告集成到JSF应用程序中。 该系列中描述的所有示例都可以从JasperReports JSF插件网站…

RN 47 中的 JS 线程及 RunLoop

RCBridge 初始化时声明了一个 CADisplayLink _jsDisplayLink [CADisplayLink displayLinkWithTarget:self selector:selector(_jsThreadUpdate:)];在 _jsThreadUpdate 函数中&#xff0c;处理界面更新。这个 CADisplayLink 随后被加到 JS 线程对应的 RunLoop 中。 - (void)ad…

java nginx https_docker nginx 配置ssl,实现https

docker nginx 配置ssl&#xff0c;实现https2019-09-05 16:06:35.0nginx配置https总览在nginx配置ssl实现https&#xff0c;简单来说分为三个步骤&#xff1a;1 上传ssl证书等文件将 1_www.domain.com_bundle.crt 和 2_www.domain.com.key 上传到nginx配置文件的目录旁边。这两…

JavaScript入门几个概念

JavaScript入门几个概念 刚刚入门JavaScript的时候&#xff0c;搞懂DOM、BOM以及它们的对象document和window很有必要。 DOM是为了操作文档出现的API&#xff0c;document是它的一个对象。BOM是为了操作浏览器出现的API&#xff0c;window是它的一个对象。DOM When a web page …

微服务有麻烦吗? Lagom在这里为您提供帮助。 尝试一下!

蛋糕支持。 我们很自豪地宣布&#xff0c;新的Apache许可的微服务框架Lagom可在GitHub上使用 &#xff01; 当其他框架专注于打包和实例启动时&#xff0c;Lagom重新定义了Java开发人员构建基于微服务的应用程序的方式。 服务是异步的。 服务内通信由您管理。 流是开箱即用的。…

海思芯片硬件java加速_海思芯片直播延迟测试结果(小于100毫秒)

背景最近接触了许多客户&#xff0c;许多是做安全方面产品的客户&#xff0c;有些还涉及到jun队后勤的等等&#xff0c;他们普遍对采集延迟&#xff0c;编码延迟&#xff0c;传输延迟等都有很大关注。例如有个客户是做反狙击探测的&#xff0c;那可是与生命相关的&#xff0c;容…

java jsp登录的验证码_Java Web实现登录验证码(Servlet+jsp)

1.生成验证码图片(Servlet)importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.ser…

shrinkwrap_Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

shrinkwrap在Java EE 6测试的第一部分中&#xff0c;我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API&#xff0c;以演示如何启动该容器&#xff0c;如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它…

java中三个基本框架_对于Java基础者应该如何理解Java中的三大框架!

三大框架&#xff1a;StrutsHibernateSpringJava三大框架主要用来做WEN应用。Struts主要负责表示层的显示Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作)Hibernate主要是数据持久化到数据库再用jsp的servlet做网页开发的时候有个 web.xml的映射文件&#xff0c;里面…

Apache Camel的性能调整思路

时不时地&#xff0c;我会以Camel速度较慢的说法来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂&#xff0c;路由引擎全都在内存中&#xff0c;并且不需要任何持久状态。 因此&#xff0c;在99&#xff05;的情况下&#xff0c;性能问题是由于其他系统的瓶…

java虚拟机源码怎么看_java虚拟机JVM第4讲:从源代码到机器码,发生了什么?

在上篇文章我们聊到&#xff0c;无论什么语言写的代码&#xff0c;其到最后都是通过机器码运行的&#xff0c;无一例外。那么对于 Java 语言来说&#xff0c;其从源代码到机器码&#xff0c;这中间到底发生了什么呢&#xff1f;这就是今天我们要聊的。如下图所示&#xff0c;编…

java构建内存池队列_池化技术(线程池、连接池、内存池等)

一、池化技术 -简单点来说&#xff0c;就是提前保存大量的资源&#xff0c;以备不时之需。对于线程&#xff0c;内存&#xff0c;oracle的连接对象等等&#xff0c;这些都是资源&#xff0c;程序中当你创建一个线程或者在堆上申请一块内存时&#xff0c;都涉及到很多系统调用&a…

java 堆大小_适当的Java堆大小的5个技巧

java 堆大小确定生产系统合适的Java堆大小不是一件容易的事。 在我的Java EE企业经验中&#xff0c;由于Java堆容量和调整不足&#xff0c;我遇到了多个性能问题案例。 本文将为您提供5个技巧&#xff0c;这些技巧可以帮助您确定当前或新生产环境的最佳Java堆大小。 这些技巧中…

jcmd:一个可以全部统治的JDK命令行工具

我在过去的几篇文章中都引用了方便的JDK工具jcmd &#xff0c;但是像我以前对jps所做的那样&#xff0c;仅专注于其实用性 。 jcmd工具是随Oracle Java 7引入的&#xff0c;在通过使用Java标识Java进程的ID &#xff08;与jps相似&#xff09;&#xff0c;获取堆转储 &#xff…

ansible-playbook实操之一键搭建lnmp+wordpress

目录 1、架构和准备&#xff1a; 2、配置nginx角色&#xff1a; 3、配置mariadb角色&#xff1a; 4、配置php角色&#xff1a; 5、配置完之后&#xff0c;写脚本调用roles 6、配置完之后浏览器搭建wordpress&#xff1a; 1、架构和准备&#xff1a; 操控节点&#xff1a;…