JSP(3) - 9个JSP内置对象 - 小易Java笔记
1、9个JSP内置对象
| 内置对象引用名称 | 对应的类型 |
| request | HttpServletRequest |
| response | HttpServletResponse |
| config | ServletConfig |
| application | ServletContext |
| session | HttpSession(有开关的:page指令的session属性的取值,默认是true创建) |
| exception | java.lang.Throwable(有开关的:page指令的isErrorPage属性改为true) |
| page | this(当前Servlet对象) |
| out | JspWriter |
| pageContext | javax.servlet.jsp.PageContext(非常重要) |
==> 注:前7个和servlet差不多,后3个中pageContext比较重要。这些对象都在jsp文件对应翻译成的.java文件中的_jspservice()方法中声明了的,故是局部变量,每个jsp页面有自己的对象
2、out对象详解
(1)out隐式对象用于向客户端发送文本数据
(2)out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似
(3)JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存
(4)只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter()方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
==> 设置page指令的buffer属性关闭了out对象的缓存功能
==> out对象的缓冲区已满(并且可以自动刷新,即默认autoFlush=true;如果autoFlush=false,则不自动刷新,新数据会替换out缓存中的数据,直到页面结束)
==> 整个JSP页面结束
(5)图解
3、pageContext对象详解
(1)本身是一个域对象。同时还能操作其他三个域对象(PageContext ServletRequest HttpSession ServletContext)
①本身表示的域范围是本页面
void setAttribute(String name,Object value)
Object getAttribute(String name)
void removeAttribute(String name)
②操作其他的三个域对象
void setAttribute(String name,Object value,int scope)
Object getAttribute(String name,int scope)
void removeAttribute(String name,int scope)
注 : 参数int scope是由PageContext类提供的静态变量规定的,取值为
==> PageContext.PAGE_SCOPE:页面范围(是PageContext本身中的那个Map,代号page)
==> PageContext.REQUEST_SCOPE:请求范围(是ServletRequest中的那个Map,代号request)
==> PageContext.SESSION_SCOPE:会话范围(是HttpSession中的那个Map,代号session)
==> PageContext.APPLICATION_SCOPE:应用范围(是ServletContext中的那个Map,代号application)
(非常有用)Object findAttribute(String name):依次按照page request session application范围搜索指定名称的对象,找到为止
(2)获取其他8个隐式对象
==> getRequest方法返回request隐式对象
==> getResponse方法返回response隐式对象
==> getServletConfig方法返回config隐式对象
==> getServletContext方法返回application隐式对象
==> getSession方法返回session隐式对象
==> getException方法返回exception隐式对象
==> getPage方法返回page隐式对象
==> getOut方法返回out隐式对象
(3)提供了转发和包含的方法
pageContext.forward("url"); (相对于servlet的转发更方便,由服务器负责转发,也是只为一次请求)
pageContext.include("url");
==> servlet中的转发 : request.getRequestDispatcher("url").forward(request,response);
==> 和servlet一样,forward由服务器负责转发,所以url是给服务器用的,如果用绝对路径(加/),就不需要加项目名
4、out实例
实例1:a1.jsp的部分源码
<%@ page pageEncoding="UTF-8"%>
<body>
<%
out.print("aaa");
response.getWriter().write("bbb");
%>
</body>
结果:bbbaaa
-----------------------------------------
实例2:b1.jsp的部分源码
<%@ page pageEncoding="UTF-8"%>
<body>
<%
out.print("aaa");
out.flush();
response.getWriter().write("bbb");
%>
</body>
结果:aaabbb
-----------------------------------------
实例3:c1.jsp的部分源码
<%@ page pageEncoding="UTF-8" buffer="none"%>
<body>
<%
out.print("aaa");
response.getWriter().write("bbb");
%>
</body>
结果:
-----------------------------------------
实例4:d1.jsp的部分源码
<%@ page pageEncoding="UTF-8"%>
<body>
<%
response.getWriter().write("aaa");
out.print("bbb");
response.getWriter().write("ccc");
%>
</body>
结果:aaacccbbb
5、pageContext实例
实例1:
a1.jsp源码
<body>
<%
pageContext.setAttribute("username", "小易");
%>
利用pageContext对象的getAttribute方法从a1.jsp(此页面)获得的username的值是:
<%
out.print(pageContext.getAttribute("username"));
%>
</body>
a2.jsp源码
<body>
pageContext对象只针对本页面,所有想在a2.jsp中利用pageContext.getAttribute("username")
是获取不到a1.jsp中的值,所以结果是:
<%
out.print(pageContext.getAttribute("username"));
%>
</body>
访问http://127.0.0.1:8080/testJsp/pagecontext/a1.jsp
==>输出:利用pageContext对象的getAttribute方法从a1.jsp(此页面)获得的username的值是: 小易
访问http://127.0.0.1:8080/testJsp/pagecontext/a2.jsp
==>输出:pageContext对象只针对本页面,所有想在a2.jsp中利用pageContext.getAttribute("username") 是获取不到a1.jsp中的值,所以结果是: null
-------------------------------------------------------------
实例2:
b1.jsp源码
<body>
<%
pageContext.setAttribute("username", "小易SESSION", PageContext.SESSION_SCOPE);
%>
<a href="/testJsp/pagecontext/b2.jsp">访问b2.jsp</a>
</body>
b2.jsp源码
<body>
在b2.jsp中利用pageContext操作ServletRequest域对象来获取b1.jsp中的username的值,结果为:
<%
//或者为session.getAttribute("username");
out.print(pageContext.getAttribute("username",PageContext.SESSION_SCOPE));
%>
</body>
先访问http://127.0.0.1:8080/testJsp/pagecontext/b1.jsp
再访问http://127.0.0.1:8080/testJsp/pagecontext/b2.jsp
==>输出:在b2.jsp中利用pageContext操作ServletRequest域对象来获取b1.jsp中的username的值,结果为: 小易SESSION
-------------------------------------------------------------
实例3:
c1.jsp源码
<body>
<%
pageContext.setAttribute("username", "小易page");
pageContext.setAttribute("username", "小易request", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("username", "小易session", PageContext.SESSION_SCOPE);
pageContext.setAttribute("username", "小易application", PageContext.APPLICATION_SCOPE); //重定向,url是给浏览器使用的,所以绝对路径要加项目名
response.sendRedirect("/testJsp/pagecontext/c3.jsp");
%>
</body>
c2.jsp源码
<body>
<%
pageContext.setAttribute("username", "小易page");
pageContext.setAttribute("username", "小易request", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("username", "小易session", PageContext.SESSION_SCOPE);
pageContext.setAttribute("username", "小易application", PageContext.APPLICATION_SCOPE); //转发(这种方法更方便),url是给服务器使用的,所以绝对路径不用加项目名
pageContext.forward("/pagecontext/c3.jsp");
%>
</body>
c3.jsp源码
<body>
findAttribute是按照page request session application的顺序来查找的,找到就停止。
结果为:
<%
//pageContext.getOut()获取out对象,同理pageContext还可以获取JSP的其他8个内置对象
pageContext.getOut().print(pageContext.findAttribute("username"));
%>
</body>
访问http://127.0.0.1:8080/testJsp/pagecontext/c1.jsp
==>输出:findAttribute是按照page request session application的顺序来查找的,找到就停止。 结果为: 小易session
访问http://127.0.0.1:8080/testJsp/pagecontext/c2.jsp
==>输出:findAttribute是按照page request session application的顺序来查找的,找到就停止。 结果为: 小易request
JSP(3) - 9个JSP内置对象 - 小易Java笔记的更多相关文章
- JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象
1 什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的 ...
- JSP学习(三)JSP中的九个内置对象
JSP中的九个内置对象 NO. 内置对象 类型 1 pageContext javax.servlet.jsp.PageContext 2 request javax.servlet.http.Htt ...
- JSP(1) - JSP简介、原理、语法 - 小易Java笔记
1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...
- java web学习总结(二十五) -------------------JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb---总结(十七)JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb学习总结(十七)——JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- Jsp(3):内置对象和四种域对象的理解
由来:在jsp开发中,会频繁使用到一些对象 .例如HttpSession,ServletContext,ServletContext,HttpServletRequet.所以Sun公司设计Jsp时,在 ...
- javaWeb学习总结(8)- JSP中的九个内置对象(4)
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- jsp脚本的九个内置对象
JSP脚本中包含9个内置对象, 这9个内置对象都是Servlet API 接口实例, 只是JSP规范对它们进行了默认初始化(由JSP 页面对应Servlet 的jspService()方法来创建这些实 ...
随机推荐
- 转:DP和HDP
Dirichlet Process and Hierarchical Dirichlet Process 原文:http://hi.baidu.com/zentopus/item/46a622f5ef ...
- 【刷题】UOJ #34 多项式乘法
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数. 第二行 \(n+1\) 个整数,表示第一个多项式的 \( ...
- BZOJ3894:文理分科——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3894 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理 ...
- BZOJ2038:[2009国家集训队]小Z的袜子——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找 ...
- BZOJ4897 [Thu Summer Camp2016]成绩单 【dp】
题目链接 BZOJ4897 题解 发现我们付出的代价与区间长度无关,而与区间权值范围有关 离散化一下权值 我们设\(f[l][r][x][y]\)表示区间\([l,r]\)消到只剩权值在\([x,y] ...
- HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)
HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包) 题意分析 与普通的完全背包大同小异,区别就在于多了一个个数限制,那么在普通的完全背包的基础上,增加一维,表示个数.同时for循环 ...
- ContestHunter暑假欢乐赛 SRM 02
惨不忍睹 3个小时都干了些什么... 日常按顺序从A题开始(难度居然又不是递增的 第一眼A题就觉得很简单...写到一半才发现woc那是个环.感觉一下子复杂了,按照链的方法扩展的话要特判很多东西... ...
- angularJS入门小Demo2 【包含不用数据库而用data.json格式响应前台的ajax请求方式测试】
事件绑定: <html> <head> <title>angularJS入门小demo-5 事件指令</title> <script src=&q ...
- ubuntu16.04装chrome
--更简单的方法是先下载chromium浏览器,这是不禁止的,然后打开chromium搜索chrome,chrome的官网下载即可 //安装好后,终端输入google-chrome即可打开 另一种 ...
- POJ3468:A Simple Problem with Integers(线段树模板)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 149972 ...