﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-老王的蜕变</title><link>http://www.blogjava.net/liwei45212/</link><description>面对诱惑的时候，做一个真实的自我。</description><language>zh-cn</language><lastBuildDate>Wed, 06 May 2026 03:04:51 GMT</lastBuildDate><pubDate>Wed, 06 May 2026 03:04:51 GMT</pubDate><ttl>60</ttl><item><title>JSP九大内置对象及四个作用域 </title><link>http://www.blogjava.net/liwei45212/archive/2011/07/22/354873.html</link><dc:creator>广福的老王</dc:creator><author>广福的老王</author><pubDate>Fri, 22 Jul 2011 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/liwei45212/archive/2011/07/22/354873.html</guid><wfw:comment>http://www.blogjava.net/liwei45212/comments/354873.html</wfw:comment><comments>http://www.blogjava.net/liwei45212/archive/2011/07/22/354873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liwei45212/comments/commentRss/354873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liwei45212/services/trackbacks/354873.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf" face="Verdana">来源：<a href="http://www.blogjava.net/ourday/archive/2008/09/20/230107.html">http://www.blogjava.net/ourday/archive/2008/09/20/230107.html</a></p>
<div class="postText">
<p>九大对象：</p>
<p>内置对象（又叫隐含对象，有9个内置对象）:不需要预先声明就可以在脚本代码和表达式中随意使用</p>
<p>1-out: </p>
<p>&nbsp;javax.servlet.jsp.JspWriter类型，代表输出流的对象。作用域为page（页面执行期）</p>
<p>request：javax.servlet.ServletRequest的子类型，此对象封装了由WEB浏览器或其它客户端生成地HTTP</p>
<p>请求的细节（参数，属性，头标和数据）。作用域为request(用户请求期）。<br />方法由可查看API</p>
<p>response：javax.servlet.ServletResponse的子类型，此对象封装了返回到HTTP客户端的输出，向页面</p>
<p>作者提供设置响应头标和状态码的方式。经常用来设置HTTP标题，添加cookie，设置响应内容的类型和状</p>
<p>态，发送HTTP重定向和编码URL。作用域为page（页面执行期）。</p>
<p><br />pageContext：javax.servlet.jsp.PageContext（抽象类）类型，作用域为page（页面执行期）。此对象</p>
<p>提供所有四个作用域层次的属性查询和修改能力，它也提供了转发请求到其它资源和包含其他资源的方法</p>
<p>：<br />该对象的方法都是抽象方法</p>
<p>session：javax.servlet.http.HttpSession类型，主要用于跟踪对话。作用域session(会话期&#8212;）。</p>
<p>HttpSession是一个类似哈希表的与单一WEB浏览器会话相关的对象，它存在于HTTP请求之间，可以存储任</p>
<p>何类型的命名对象。<br />如果不需要在请求之间跟踪会话对象，可以通过在page指令中指定session="false"<br />需要记住的是pageContext对象也可以与session.getAttribute(),session.setAttribute()一样的方式取</p>
<p>得并设置会话属性。</p>
<p>application：javax.servlet.ServletContext类型，servlet的环境通过调用getServletConfig</p>
<p>().getContext()方法获得。作用域是application(整个程序运行期）。它提供了关于服务器版本，应用</p>
<p>级初始化参数和应用内资源绝对路径，注册信息的方式</p>
<p><br />config：javax.servlet.ServletConfig,作用域为page（页面执行期）</p>
<p>exception:java.lang.Throwable,通过JSP错误页面中一个catch块已经益出但没有捕获的</p>
<p>java.lang.Throwable的任意实例，传向了errorPage的URI。作用域为page（页面执行期）。注意</p>
<p>exception只有在page指令中具有属性isErrorPage="true"时才有效。</p>
<p>page:java.lang.Object类型，指向页面自身的方式。作用域为page（页面执行期</p>
<p>&nbsp;</p>
<p>JSP中九大内置对象为： <br />request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求对象　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.servlet.ServletRequest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域 Request<br />response&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 响应对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.servlet.SrvletResponse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp; Page<br />pageContext&nbsp;&nbsp;&nbsp; 页面上下文对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.servlet.jsp.PageContext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp;&nbsp;&nbsp; Page<br />session&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会话对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.servlet.http.HttpSession&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp;&nbsp;&nbsp; Session<br />application&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 应用程序对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.servlet.ServletContext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp;&nbsp;&nbsp; Application<br />out&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.servlet.jsp.JspWriter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp;&nbsp;&nbsp; Page<br />config&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.servlet.ServletConfig&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp;&nbsp;&nbsp; Page<br />page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 页面对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.lang.Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp;&nbsp;&nbsp; Page<br />exception&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例外对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型 javax.lang.Throwable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用域&nbsp;&nbsp;&nbsp; page</p>
<p>request 对象代表的是来自客户端的请求，例如我们在FORM表单中填写的信息等，是最常用的对象</p>
<p>常用的方法有：getParameter、getParameterNames 和getParameterValues 通过调用这几个方法来获取请求对象中所包含的参数的值。</p>
<p>response 对象代表的是对客户端的响应，也就是说可以通过response 对象来组织发送到客户端的数据。但是由于组织方式比较底层，所以不建议普通读者使用，需要向客户端发送文字时直接使用</p>
<p>pageContext 对象直译时可以称作&#8220;页面上下文&#8221;对象，代表的是当前页面运行的一些属性</p>
<p>常用的方法有 ：findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope<br />一般情况下pageContext对象用到得也不是很多，只有在项目所面临的情况比较复杂的情况下，才会利用到页面属性来辅助处理。</p>
<p>session&nbsp;&nbsp;&nbsp; 对象代表服务器与客户端所建立的会话，当需要在不同的JSP页面中保留客户信息的情况下使用，比如在线购物、客户轨迹跟踪等。&#8220;session&#8221; 对象建立在cookie的基础上，所以使用时应注意判断一下客户端是否打开了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。 </p>
<p>概要<br />HTTP是无状态（stateless）协议；<br />Web Server 对每一个客户端请求都没有历史记忆；<br />Session用来保存客户端状态信息；<br />由Web Server 写入；<br />存于客户端；<br />客户端的每次访问都把上次的session记录传递给Web Server；<br />Web Server读取客户端提交的session来获取客户端的状态信息</p>
<p>application 对象负责提供应用程序在服务器中运行时的一些全局信息，常用的方法有getMimeType和getRealPath等。</p>
<p>out 对象代表了向客户端发送数据的对象，与&#8220;response&#8221; 对象不同，通过&#8220;out&#8221; 对象发送的内容将是浏览器需要显示的内容，是文本一级的，可以通过&#8220;out&#8221; 对象直接向客户端写一个由程序动态生成HTML文件。常用的方法除了pirnt和println之外，还包括clear、clearBuffer、flush、getBufferSize和getRemaining，这是因为&#8220;out&#8221; 对象内部包含了一个缓冲区，所以需要一些对缓冲区进行操作的方法</p>
<p>&#8220;config&#8221; 对象提供一些配置信息，常用的方法有getInitParameter和getInitParameterNames，以获得Servlet初始化时的参数。</p>
<p>&#8220;page&#8221; 对象代表了正在运行的由JSP文件产生的类对象，不建议一般读者使用。</p>
<p>&#8220;exception&#8221; 对象则代表了JSP文件运行时所产生的例外对象，此对象不能在一般JSP文件中直接使用，而只能在使用了&#8220;&lt;%@ page isErrorPage="true "%&gt;&#8221;的JSP文件中使用 </p>
<p><br />&nbsp;</p>
<p><br />四个作用域：</p>
<p>何为作用域 <br />先让我们看看效果：</p>
<p><br />大概流程是这样的，我们访问04-01/index.jsp的时候，分别对pageContext, request, session, </p>
<p>application四个作用域中的变量进行累加。（当然先判断这个变量是不是存在，如果变量不存在，则要</p>
<p>把变量初始化成1。）计算完成后就从index.jsp执行forward跳转到test.jsp。在test.jsp里再进行一次</p>
<p>累加，然后显示出这四个整数来。</p>
<p>从显示的结果来看，我们可以直观的得出结论：</p>
<p>page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了，它们就不见了。</p>
<p>request里的变量可以跨越forward前后的两页。但是只要刷新页面，它们就重新计算了。</p>
<p>session和application里的变量一直在累加，开始还看不出区别，只要关闭浏览器，再次重启浏览器访问</p>
<p>这页，session里的变量就重新计算了。</p>
<p>application里的变量一直在累加，除非你重启tomcat，否则它会一直变大。</p>
<p>而作用域规定的是变量的有效期限。</p>
<p>如果把变量放到pageContext里，就说明它的作用域是page，它的有效范围只在当前jsp页面里。</p>
<p>从把变量放到pageContext开始，到jsp页面结束，你都可以使用这个变量。</p>
<p>如果把变量放到request里，就说明它的作用域是request，它的有效范围是当前请求周期。</p>
<p>所谓请求周期，就是指从http请求发起，到服务器处理结束，返回响应的整个过程。在这个过程中可能使</p>
<p>用forward的方式跳转了多个jsp页面，在这些页面里你都可以使用这个变量。</p>
<p>如果把变量放到session里，就说明它的作用域是session，它的有效范围是当前会话。</p>
<p>所谓当前会话，就是指从用户打开浏览器开始，到用户关闭浏览器这中间的过程。这个过程可能包含多个</p>
<p>请求响应。也就是说，只要用户不关浏览器，服务器就有办法知道这些请求是一个人发起的，整个过程被</p>
<p>称为一个会话（session），而放到会话中的变量，就可以在当前会话的所有请求里使用。</p>
<p>如果把变量放到application里，就说明它的作用域是application，它的有效范围是整个应用。</p>
<p>整个应用是指从应用启动，到应用结束。我们没有说&#8220;从服务器启动，到服务器关闭&#8221;，是因为一个服务</p>
<p>器可能部署多个应用，当然你关闭了服务器，就会把上面所有的应用都关闭了。</p>
<p>application作用域里的变量，它们的存活时间是最长的，如果不进行手工删除，它们就一直可以使用。</p>
<p>与上述三个不同的是，application里的变量可以被所有用户共用。如果用户甲的操作修改了application</p>
<p>中的变量，用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的，page, request, </p>
<p>session都是完全隔离的，无论如何修改都不会影响其他人的数据。</p>
<p>我们使用public Object getAttribute(String name)获得变量值，使用public void setAttribute</p>
<p>(String name, Object value)将变量值保存到对应作用域中。举个pageContext的例子就是：</p>
<p>// page<br />Integer countPage = (Integer) pageContext.getAttribute("countPage");<br />if (countPage == null) {<br />&nbsp;&nbsp;&nbsp; pageContext.setAttribute("countPage", 1);<br />} else {<br />&nbsp;&nbsp;&nbsp; pageContext.setAttribute("countPage", countPage + 1);<br />}<br />这里先从pageContext中取出名为countPage的整数，因为返回的都是java.lang.Object类型，所以需要强</p>
<p>制转换成我们需要的整形。这里取得的变量如果不存在就会返回null，通过判断countPage == null来辨</p>
<p>别变量是否存在，如果不存在就设置为1，如果存在就进行累加，最后使用setAttribute()方法将修改后</p>
<p>的变量值放入pageContext。</p>
<p>将其中的pageContext换成request, session, application就可以操作其他三个作用域中的变量。<br /></p></div>
<p></font>&nbsp;</p> <img src ="http://www.blogjava.net/liwei45212/aggbug/354873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liwei45212/" target="_blank">广福的老王</a> 2011-07-22 17:51 <a href="http://www.blogjava.net/liwei45212/archive/2011/07/22/354873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>