JSP第二篇【内置对象的介绍、4种属性范围、应用场景】
什么是JSP内置对象
JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用
细心的朋友会发现,我们没有在JSP页面上定义过out对象,却可以直接使用!其实out对象就是JSP内置对象之一。
九个内置对象:
- pageContext
- page
- config
- request
- response
- session
- application
- exception
- out
out对象
out对象的API
- int getBufferSize()【得到缓存大小】
- int getRemaining()【得到未使用缓存的大小】
- boolean isAutoFlush()
- void println()
- void flush()
- void close()
- void clearBuffer()
void clear()
out对象用于向浏览器输出数据,与之对应的是Servlet的PrintWriter对象。然而这个out对象的类型并不是PrintWriter,是JspWriter
我们可以简单理解为:JspWriter就是带缓存的PrintWrieter。
out对象的原理如下:
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
- 设置page指令的buffer属性关闭了out对象的缓存功能
- out对象的缓冲区已满
- 整个JSP页面结束
一般我们在JSP页面输出都是用表达式(<%=%>),所以out对象用得并不是很多!
request
- 内置对象request其实就是HttpServletRequest,在Servlet讲解的时候已经详细说明了,没什么好说的
response
- 内置对象response其实就是HttpServletResponse,在Servlet讲解的时候已经详细说明了,没什么好说的
config
- 内置对象config其实就是ServletConfig,在Servlet讲解的时候已经详细说明了,没什么好说的
session
- 内置对象session其实就是HttpSession。,在Servlet讲解的时候已经详细说明了,没什么好说的
注意:在page指令配置如下信息,session将不可使用
<%@page session="false" %>
application
- 内置对象application其实就是ServletContext对象,在Servlet讲解的时候已经详细说明了,没什么好说的
page
- 内置对象page是HttpJasPage对象,其实page对象代表的就是当前JSP页面,是当前JSP编译后的Servlet类的对象。也就是说:page对象相当于普通java类的this
exception
**内置对象exception是java.lang.Exception类的对象,exception封装了JSP页面抛出的异常信息。**exception经常被用来处理错误页面
前面我们已经讲过了怎么设置错误页面了,下面我们就来简单使用一下exception对象吧
1.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title></title>
</head>
<body>
<%--模拟空指针异常的错误--%>
<%
String sss = null;
sss.length();
%>
</body>
</html>
- error.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<%
out.println("程序抛出了异常:" + exception);
%>
</body>
</html>
- 效果:
pageContext
pageContext是内置对象中最重要的一个对象,它代表着JSP页面编译后的内容(也就是JSP页面的运行环境)!
pageContext获取8个内置对象
- 既然它代表了JSP页面编译后的内容,理所当然的:它封装了对其他8大内置对象的引用!,也就是说,通过pageContext可以获取到其他的8个内置对象!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取八大内置对象</title>
</head>
<body>
<%
System.out.println(pageContext.getSession());
System.out.println(pageContext.getRequest());
System.out.println(pageContext.getResponse());
System.out.println(pageContext.getException());
System.out.println(pageContext.getPage());
System.out.println(pageContext.getServletConfig());
System.out.println(pageContext.getServletContext());
System.out.println(pageContext.getOut());
%>
</body>
</html>
- 看下效果:
pageContext作为域对象
类似于request,session,ServletContext作为域对象而言都有以下三个方法:
- setAttribute(String name,Objcet o)
- getAttribute(String name)
- removeAttribute(String name)
当然了,pageContext也不例外,pageContext也有这三个方法!
pageContext本质上代表的是当前JSP页面编译后的内容,作为域对象而言,它就代表着当前JSP页面(也就是page)!也就是说:pageContext域对象只在page范围内有效,超出了page范围就无效了!
首先来看看在page范围内能不能使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用page域对象</title>
</head>
<body>
<%
pageContext.setAttribute("name", "zhongfucheng");
%>
<%
String value = (String) pageContext.getAttribute("name");
System.out.println(value);
%>
</body>
</html>
- 效果如下:
我们现在来试验一下是不是超出了page范围就无效了!
在2.jsp中request域对象设置属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>request域对象设置属性</title>
</head>
<body>
<%
//这是request域对象保存的内容
request.setAttribute("name","zhongfucheng");
%>
<%--跳转到1.jsp中--%>
<jsp:forward page="1.jsp"/>
</body>
</html>
- 企图在1.jsp中pageContext取出request存进去的属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>在page域对象获取属性</title>
</head>
<body>
<%
//企图获取request域对象存进的属性
String value = (String) pageContext.getAttribute("name");
System.out.println(value);
%>
</body>
</html>
- 效果如下:
pageContext本质上代表着编译后JSP的内容,pageContext还可以封装了访问其他域的方法!
上面的pageContext默认是page范围的,但pageContext对象重载了set、get、removeAttribute这三个方法
- getAttribute(String name,int scope)
- setAttribute(String name,Object value,int scope)
- removeAttribute(String name,int scope)
多了一个设置域范围的一个参数,如果不指定默认就是page。当然了,pageContext把request、session、application、page这几个域对象封装着了静态变量供我们使用。
- PageContext.APPLICATION_SCOPE
- PageContext.SESSION_SCOPE
- PageContext.REQUEST_SCOPE
- PageContext.PAGE_SCOPE
刚才我们没有使用重载方法的时候,使用pageContext是无法获取到request域对象设置的属性的。现在我们使用重载后的方法看一下能不能获取得到!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>在page域对象获取request域对象的属性</title>
</head>
<body>
<%
//使用重载的方法获取request域对象的属性
String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE);
System.out.println(value);
%>
</body>
</html>
- 效果:
pageContexst还有这么一个方法:
- findAttribute(String name)
该方法会查找各个域的属性,从小到大开始寻找!也就是page—>request->session->application。这个是EL表达式的原理!,EL表达式后面会讲到!
我们用此方法看能不能查找出request域对象的属性吧!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用findAttribute</title>
</head>
<body>
<%
//使用findAttribute查找2.jsp中request域对象的属性
String value = (String) pageContext.findAttribute("name");
System.out.println(value);
%>
</body>
</html>
- 效果如下:
引入和跳转
PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法。
- pageContext.forward(String url)
- pageContext.include(String url)
4种属性范围
到目前为止,我们已经学了4种属性范围了。
- page【只在一个页面中保存属性,跳转页面无效】
- requet【只在一次请求中保存属性,服务器跳转有效,浏览器跳转无效】
- session【在一个会话范围中保存属性,无论何种跳转均有效,关闭浏览器后无效】
- application【在整个服务器中保存,所有用户都可以使用】
- 4个内置对象都支持以下的方法:
- setAttribute(String name, Object o )
- getAttribute(String name)
- removeAttribute(String name)
应用场景
- request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的
- session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐
- servletContext:如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在servletContext域中,像聊天数据
JSP第二篇【内置对象的介绍、4种属性范围、应用场景】的更多相关文章
- JSP中的内置对象和Struts中的Web资源的详解
JSP中的内置对象有如下几种: request :继承于HttpServletRequest, HttpServletRequest继承ServletRequest, 获得的Request对象的方法: ...
- jsp篇 之 Jsp中的内置对象和范围对象
Jsp中的内置对象: 在jsp页面代码中不需要声明,直接可以使用的对象. 一共有[9个内置对象]可以直接使用. 对象类型 名字 PageContext pageC ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...
- JavaWeb -jsp文件和内置对象的解析
jsp文件和内置对象的解析 对page解析 JSP九大内置对象(自带,无需new) 1 out:输出对象 2 request:请求对象,存储“客户端像服务端发送的请求信息” 3 response:响应 ...
- jsp有哪些内置对象?作用分别是什么?(至少三个)
jsp有哪些内置对象?作用分别是什么?(至少三个) 解答: 1)request表示HttpServletRequest对象.它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, head ...
- JSP有哪些内置对象
JSP有哪些内置对象? 1.page:JSP网页本身; 2.request:用户端请求,此请求会包含来自GET/POST请求的参数; 3.session:请求有关的会话; 4.application: ...
- 详解JSP九个内置对象
[JSP]☆★之详解九个内置对象 在web开发中,为方便开发者,JSP定义了一些由JSP容器实现和管理的内置对象,这些对象可以直接被开发者使用,而不需要再对其进行实例化!本文详解,JSP2 ...
- jsp九个内置对象、四个域对象及Servlet的三大域对象
一,什么是内置对象? 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创 ...
- jsp jsp九个内置对象
每个JSP页面在第一次被访问的时候,WEB容器都会把请求交给JSP引擎(即一个JAVA)程序.JSP引擎先将JSP翻译成一个_jspServlet实质也是一次servlet,然后按照 Servl ...
随机推荐
- GoF设计模式 - 概述
掌握编程语言仅仅意味着掌握了如何给计算机"下命令",而到底要计算机如何去做,怎么指挥,则是另一个问题--如何编程.设计模式是一套程序员的"武功套路",它教我们如 ...
- ffmpeg音频播放代码示例-avcodec_decode_audio4
一.概述 最近在学习ffmpeg解码的内容,参考了官方的教程http://dranger.com/ffmpeg/tutorial03.html,结果发现这个音频解码的教程有点问题.参考了各种博客,并同 ...
- java基础(数据类型,运算符)
java基础之数据类型(变量) java中存在的数据有常量和变量 常量:在程序执行的过程中其值不可以发生改变 常量的分类 字面值常量 字面值常量的分类 常量 描述 字符串常量 用双引号括起来的内容 整 ...
- Django 学习笔记(四)模板变量
关于Django模板变量官方网址:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.传入普通变量 在hello/Hell ...
- win32 Message(MSG)消息处理
一般情况下的消息处理如下,TranslateMessage转换virtual-keys消息到characters消息,DispatchMessage调度一个消息给窗口程序. //getMessage第 ...
- ubuntu下安装rubymine
1.安装jdk 先查看系统有没有安装jdk,打开终端,输入以下命令: java -version 如果没有安装,在联网的环境下执行: $ -jdk 2.安装rubymine 从官网(http://ww ...
- Java虚拟机基础
Java虚拟机基础 JVM是Java Virtual Machine的缩写.JVM是一个可以将Java字节码转换成机器语言并能被机器(电脑)执行的Java字节码处理引擎.Java字节码是处于Java和 ...
- SSH:dataSource配置问题
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- 关于 struts2 Unable to load configuration. - action
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能
Ajax文件上载 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能: 步骤 导入组件并准备静态脚本 <dependency> <groupId& ...