![2fcccda59e594db7e4eb7d1a0b1ce688.png](https://i-blog.csdnimg.cn/blog_migrate/c3c2500af73215c428f3b555438e7f88.jpeg)
第五章 JSP拓展 : JSP内置对象与对象作用域
5.1 其他内置对象的讲解
5.1.1 pageContext对象
九大内置对象之一,pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,我们 可以使用这个对象在JSP页面内存储各种各样的数据和调用各种各样的数据;
比如我们调用的 : ${pageContext.request.contextPath} 这个就是我们利用pageContext来获取 现在访问的项目名称,它能帮助我们绝对定位到项目的根目录下,所以在配置一 些请求或者引入文件的位置的时候这个应用还是非常多的;
$
![8ec01d2b0f44707f42d758df9653ef3f.png](https://i-blog.csdnimg.cn/blog_migrate/1f8b3fa0b90d7d76b21f47699dae9a10.png)
通过这个参数获取项目的名称,这样就很方便的可以定位网站元素的位置了; pageContext 除了能够帮助我们获取对象数据之外,还能够保存数据信息;
<%
效果 :
![b3e3b8792541242ccd44f57c6e606104.png](https://i-blog.csdnimg.cn/blog_migrate/fe46b4a452b268c4f6f4181707888ae7.png)
当然同样可以保存数据的还有request,那么他们保存数据上有什么区别么?
如果在页面范围内的话 request保存的数据 pageContext保存的数据,这个页面都可以获取 到,但是如果转发到下一个页面的话,request的值可以接收到但是pageContext就接收不到了;
这种现象叫做页面存储数据的作用域;
也就是说
pageContext保存的数据只有在当前页面有效;
request保存的数据是在一次请求有效;
举例说明:
在同一个页面两个变量都可以获取到
<%
![7988690e75b14414e6fa24356ebb6f9c.png](https://i-blog.csdnimg.cn/blog_migrate/d6ad056bd3272cc783fa457bdbb70f31.png)
但是要是转发到下一个页面就只有request的值能获取到了
<%
page1.jsp:
<
![dd07a0894632a31d0d1a680ae2456a32.png](https://i-blog.csdnimg.cn/blog_migrate/30dae0f521fdbd94ef682a8171eb6c2c.png)
通过上面的案例我们不难发现,pageContext它的存值范围只有当前页面,所以它的作用域是 非常小的;
而request能比它大一点,request的作用域能够维持在一次转发链(转发链:一次请求在多个页 面进行转发)的范围内,
比如做个试验,让page1.jsp再转发给page2.jsp,看下这个变量还能不能获取到?
page1.jsp
<%
page2.jsp
<
效果:
![8034b40149685822fc2d59a2050915b8.png](https://i-blog.csdnimg.cn/blog_migrate/79efff82e5bf68f2d3cc7b90cc189eda.png)
但是此处我们必须意识到一个问题,如果page1.jsp是重定向给page2.jsp的话那么这个值就拿 不到了,那这个问题怎么解决呢?
page1.jsp
<%
效果 :
![0630b53a2effa7b4b42b8d7e68ee2260.png](https://i-blog.csdnimg.cn/blog_migrate/f27424fed3eae9e1f7273d8c5daafecb.png)
面对以上的问题,我们就应该学习更大的作用域了! HttpSession
5.1.2 session 对象
1) 问题分析 : 想要解决上面的问题其实并不难,如果仔细思考其实还是能发现解决方案的,大家想不管是转发和重定向,只是页面之间跳转,我浏览器并没有关闭重新打开呀,所以
我们如果把值存在在浏览器的一次打开与关闭的范围内,那不就能解决这个问题了么;
2) 会话概述
一个会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程
![74cf0852464d16e07d481afc4f65aabd.png](https://i-blog.csdnimg.cn/blog_migrate/bd3c95bd5e8c06c0bb3c1dfef5e148e9.png)
我们与tomcat的一次通信,其中会包含多个页面的跳转里面就包含转发与重定向,而不管多少 次转发与重定向其实tomcat就只给我们创建一个会话叫做session对象;
session对象也是jsp的内置对象之一,是服务器创建用于与浏览器沟通的通道,类似我们数据 库连接一样,所以我们如果把值存到这里那么肯定就能解决上面的问题;
3) session对象的常用方法 :
![89b4f4e3947aa298323e07f99a009989.png](https://i-blog.csdnimg.cn/blog_migrate/702c33dbd2577a1923869ec6ff361e19.jpeg)
4) 向session中保存数据,在index.jsp页面创建一个msg2 将其保存在session中
<%
在page2.jsp获取这几个值,注意现在page1.jsp还是以重定向的方式向page2.jsp发起请求
page1.jsp
<%
page2.jsp
<
效果
![fdf903961b401cd6f9848b24b2a36e23.png](https://i-blog.csdnimg.cn/blog_migrate/236629ce2c1e3ca80caa08cec7b9f7d6.png)
能到达page2的就只有session里保存的数据;但是需要注意一个问题,session保存的数据也 是有作用范围的,也就是说它的数据作用做只能在本次浏览器的打开与关闭之间,
比如我们再打开个网页,因为此时第一个网页已经向session里保存了数据,所以第二个网页直 接访问page2.jsp依然能够获取信息;
![f0bf2a3d414e4750bfadb69be3913f5d.png](https://i-blog.csdnimg.cn/blog_migrate/88c133859e8fda78362751295c06a2bd.png)
但是如果浏览器关闭的话 你要是直接访问page2就什么也得不到了;
![9b81e383351b20e783b05edd5140291e.png](https://i-blog.csdnimg.cn/blog_migrate/81342b508d72801cee918abd0871a205.png)
小结 : 一般我们都会把自己的登录信息保存在session中,这样一次浏览器的打开与关闭我们 就不用重复登录了
5) 问题引出 : 那么我们怎么解决打开和关闭网页都能访问数据的这种无(sang)与(xin)伦 (bing)比(kuang)的想法呢?
5.1.3 Application 对象
1) 概述 : application对象类似于系统的“全局变量”,在tomcat开启的时候,创建一个
application对象,然后整个项目不管打开和关闭多少次都只有这一个对象
2) 常用方法:
![e9f309bde2535cfb095feb01bbd92fa3.png](https://i-blog.csdnimg.cn/blog_migrate/595ced273b188aea68a53d086a0d3063.jpeg)
3) 案例 :
通过application对象保存数据
index.jsp
<%
page1.jsp
<%
page2.jsp
<
访问index.jsp 测试结果
![466057363b44ed384a95926f4167689c.png](https://i-blog.csdnimg.cn/blog_migrate/ba972cfdd3c1d2955e3bb6602c7e00c0.png)
关闭浏览器再访问page2.jsp 测试结果
![398e865a04214f441ad68a875b8dc9af.png](https://i-blog.csdnimg.cn/blog_migrate/67f40d2ee65ca051075201a5456726dc.png)
小结 : 我们可以使用application对象保存网站的登录次数,只要tomcat不重启累计的登录次数 都是有效的
5.1.5 内置对象小结
内置对象
![9d676be65b8593364606f37989913fe2.png](https://i-blog.csdnimg.cn/blog_migrate/4a0d8da27f9c20d0bafb55d5db074d39.jpeg)
作用域分类
![8a357fec679fc95c8783c002eb46e017.png](https://i-blog.csdnimg.cn/blog_migrate/03c63c22dd02d7ba3ec51b8bda08719e.jpeg)
说明:
![33d458086b523719b5b18e0e120a2151.png](https://i-blog.csdnimg.cn/blog_migrate/96cbb7ed8f491bcfccaf2b115cc1da75.jpeg)
作用域之间的关系
![11f7b0cc55432cf5a7e03f2a2097106b.png](https://i-blog.csdnimg.cn/blog_migrate/d72b8478083c91436b78381bb3cc465f.jpeg)
问题 : 如果关闭了tomcat 之后我还想获取之前保存的信息那该怎么办呢?
5.1.4 Cookie 对象
1) 概述 :
视频网站查看观看不同视频,系统会自动记录已经浏览过的视频,历史记录 。
![827ad456fd8b2df19cf0eab2cbca2a37.png](https://i-blog.csdnimg.cn/blog_migrate/3cedd3b676a85c30c4665a8b6e223698.jpeg)
那么大家可以想一个问题:网站用户的浏览记录是保存在哪里呢?
分析这波数据特点 : 它不会随着你浏览器打开与关闭就没有 也不会随着你的tomcat开启与 关闭就清空.这个清空跟我们现在的需求特别吻合
那么这个数据应该存在哪里呢?答案是存储在cookie里的
概念 : cookie是Web服务器保存在客户端的一系列文本信息
cookie的作用
对特定对象的追踪
实现各种个性化服务
简化登录
安全性能
容易泄露信息
也就是说cookie是网站把一些信息保留在你本地的浏览器的一种操作,这样不管服务器是否 关闭,只要你不手动删除cookie,cookie里的数据肯定都是有的
2) 语法结构:
![f4389db38b430ced111f2349be1051a7.png](https://i-blog.csdnimg.cn/blog_migrate/70a36d007c5347c2903573fc989a36bc.jpeg)
根据语法规定,cookie中只能保存字符串,不能保存别的;
而且还需要说明一点就是 cookie是脱离服务器管理的,所以一些敏感数据也不应该放在 cookie里,如果真的想放也应该是加密之后再放进去
4) cookie对象的常用方法
![de8378b343bbb9a69dcc99f2c9c3b0f7.png](https://i-blog.csdnimg.cn/blog_migrate/9e65fbc792e6bddd77de0cf1772a0c1c.jpeg)
3) 演示 :
index.jsp
<%
此处注意设置cookie的有效期,如果不设置的话cookie瞬间就没有了;
page1.jsp
<%
page2.jsp
<
访问效果 :
![880b52095f2d66a85728140eef648e56.png](https://i-blog.csdnimg.cn/blog_migrate/f407e85f6fd210861663354820651326.png)
重启tomcat:
![983c6979d39b4d440364529f05f92813.png](https://i-blog.csdnimg.cn/blog_migrate/66884795d90c102b7ac37e3b5ef0306e.png)
注意此处我们设置了一个小时失效,所以在这一个小时的时间里,这个数据都会保存在cookie 中,不管服务器是否打开与关闭,所以我们利用这个特性可以
做自动登录的效果
4) 总结 : 面试的时候要注意对比session与cookie的区别
![0d8f525fe2d1b1ef4461d232eef32fc2.png](https://i-blog.csdnimg.cn/blog_migrate/e3ad01ebc20f35129400bedeb3b76600.jpeg)