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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、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://my.oschina.net/u/204616/blog/548940

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

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

相关文章

C#网络编程(异步传输字符串) - Part.3[转自JimmyZhang博客]

源码下载&#xff1a;http://www.tracefact.net/SourceCode/Network-Part3.rar C#网络编程(异步传输字符串) - Part.3 这篇文章我们将前进一大步&#xff0c;使用异步的方式来对服务端编程&#xff0c;以使它成为一个真正意义上的服务器&#xff1a;可以为多个客户端的多次请求…

chrome黑暗模式_黑暗模式:如何克服黑暗面

chrome黑暗模式This article has been written by Redmadrobot Design Lab. Translated and reposted with permission by Alconost Inc., professional translation and localization company.本文由 Redmadrobot设计实验室 撰写 。 经过 专业翻译和本地化公司 Alconost Inc.的…

Deco 智能代码体验版正式上线啦,快来体验设计稿一键生成代码~

Deco 是什么&#xff1f;—Deco 智能代码项目是我们团队在「前端智能化」方向上的探索&#xff0c;其聚焦设计稿一键生成多端代码这一切入点&#xff0c;实现将 Sketch/Photoshop 等设计稿进行解析并直接生成多端代码&#xff08;Taro/React/Vue&#xff09;的能力。Deco 可以使…

jQuery 五角星评分

五角星打分 我用的是搜狗输入法上带的特殊符号打出来的 空五角星&#xff1a;☆ 实五角星&#xff1a;★ 1.html 1 <ul class"comment"> 2 <li>☆</li> 3 <li>☆</li> 4 <li>☆</li> 5 …

平面设计和网页设计的规则_从平面设计到用户界面:这是您应该知道的最重要的规则

平面设计和网页设计的规则Maybe you’re here because you think UI Design is the future of Graphic Design. Maybe what motivates you is the money. Or maybe you just woke up one day and someone at work told you “So, you are a designer, right? Well, we need an…

即将到来的 ECMAScript 2022 新特性

大家好&#xff0c;我是若川。持续组织了5个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。ECMAScript 规范每…

代码备忘录

1.用指针&#xff0c;函数调用实现交换两个变量值 #include<stdio.h> int exchange(int *a,int *b){ int temp; temp*a; *a*b; *btemp;return 0;} int main(){ int i9,j2; int *p1,*p2; p1&i; p2&j; exchange(p1,p2); printf("p1%d,p2%d\n",*p1,*p2);…

mysql实战38 | 都说InnoDB好,那还要不要使用Memory引擎?

我在上一篇文章末尾留给你的问题是&#xff1a;两个 group by 语句都用了 order by null&#xff0c;为什么使用内存临时表得到的语句结果里&#xff0c;0 这个值在最后一行&#xff1b;而使用磁盘临时表得到的结果里&#xff0c;0 这个值在第一行&#xff1f;今天我们就来看看…

设计类的五个原则_内容设计的5个原则

设计类的五个原则重点 (Top highlight)There are many heuristics and principles for creating good content. Some are created from a UX perspective, others from a content marketing point of view. They range from very long to very concise ones. I reviewed a larg…

Umi 4 RC 发布

大家好&#xff0c;我是若川。感谢大家一年以来的支持和陪伴。这一年疫情反复&#xff0c;年底应该有由于疫情不能回家的小伙伴。在这里先祝福大家&#xff0c;新年快乐。本打算今天不发文&#xff0c;但看到这篇觉得不错&#xff0c;就发一下。大家好&#xff0c;Umi 4 经过几…

让你沉迷的五种设计

让你沉迷的五种设计 好游戏总是能令人沉迷其中无法自拔&#xff0c;外媒cracked经过分析&#xff0c;发现有五种设计方法必不可少&#xff1b; 1.斯金纳箱原理&#xff1a;这是行为心理学派在实验室内研究动物学习能力的箱形实验装置&#xff0c;游戏开发也得益于此&#xff0c…

Java学习路线详解

有很多的[Java请添加链接描述](http://www.hfxms.com.cn/java/)程序员&#xff0c;在初期学习时&#xff0c;通常会对如何学习而感到迷茫。[合肥学码思请添加链接描述](http://www.hfxms.com.cn/)小编就为大家分析如何学好Java编程&#xff0c;相信能帮助那些正在处于迷茫状态的…

figma下载_在Figma中将约束与布局网格一起使用

figma下载While doing research for the book “Designing in Figma”, I discovered a powerful way to lay out objects using a combination of Layout Grid and Constraints. The interface of Figma does not indicate a connection between the two, so it can be discov…

换一种方式表达

http://player.youku.com/player.php/sid/XMjY2MTE5NDU2/v.swf 转载于:https://www.cnblogs.com/JCSU/archive/2012/03/17/2403324.html

新的一年,碎片化学习前端,我推荐这几个公众号~

大家好&#xff0c;我是若川。假期余额不足&#xff0c;无法充值。快乐的时光总是短暂的。马上又开始一年的学习和“奋斗”。前端技术日新月异&#xff0c;发展迅速&#xff0c;作为一个与时俱进的前端工程师&#xff0c;需要不断的学习。这里强烈推荐几个前端开发工程师必备的…

Java单元测试之JUnit4详解

2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同&#xff0c;JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有&#xff1a; BeforeClass 全局只会执行一次&#xff0c;而且是第一个运行Before 在测试方法运行之前运行…

我在黑暗中看到你眼中的月光_你好黑暗,我的老朋友

我在黑暗中看到你眼中的月光(Originally published on https://web.dev/prefers-color-scheme/.)(最初发布于https://web.dev/prefers-color-scheme/ 。) 介绍 (Introduction) &#x1f4da; I have done a lot of background research on the history and theory of dark mod…

ant 实现批量打包android应用

很多的应用中需要加上应用推广的统计&#xff0c;如果一个一个的去生成不同渠道包的应用&#xff0c;效率低不说&#xff0c;还有可能不小心弄错了分发渠道&#xff0c;使用ant可以批量生成应用。一、添加渠道包信息为了统计渠道信息&#xff0c;就不得不在程序的某个地方加入渠…

Element Plus 正式版发布啦!

大家好&#xff0c;我是若川。祝大家新年快乐&#xff0c;开工大吉。公众号回复「红包」可以领取源码共读红包封面。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…