目录
1.4.4 page 作用域与 pageContext 对象
关键步骤如下。
- 使用 session 对象实现数据的保存和读取。
- 使用 Cookie 实现数据的保存和读取。
- 使用 application 对象实现数据的保存和读取。
1.4.1 理解会话
1.会话的概念
会话据说用户通过浏览器与服务器之间进行的一次通话,它可以包含浏览器与
服务器之间的多次请求、响应过程。简单地说就是在一段时间内,单个客户端与Web 服务
器的一连串相关的交换过程。
在一个会话中,客户端可能会多次请求访问一个网页,也有可能请求访问各种不同
的服务器资源。
图 1.13 描述了浏览器与服务器的一次会话过程。当用户向服务器发出第一次请求时,
服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束(浏览器关闭可以
借宿会话)。
图1.13 一次会话过程
JSP 提供了一个可以在多个请求之间持续有效的会话对象 session,session 对象允许
用户存储和提取会话状态的信息。接下来,我们就来学习 JSP 内置对象 session.
2.session 对象
(1)session 对象
session 一词的原意是指有始有终的一系列动作,在实际应用中通常翻译成会话。
例如,打电话时,甲方拿起电话拨通乙方电话这一系列的过程就可以称为一个会话,电
话挂断时会话结束。
(2)session 的工作方式
session 机制是一种服务器端的机制,在服务器端保存信息。当程序接收了客户端
的请求时,服务器首先会检查是否已经为这个客户端创建了 session 。判断session 是否
创建是通过一个唯一的标识 "sessionid" 来实现的。如果在客户端请求中包含了一个
sessionid ,则说明在此前已经为客户端创建 了session,服务器就会根据这个 sessionid
将对应的 session 读取出来。否则,就会重新创建一个新的 session ,并生成一个与
此 session 对应的 sessiond ,然后将 sessiond 在首次响应过程中返回到客户端保存。
(3)使用 session 实现数据的存储与读取
使用 session 进行数据保存时,需要调用相应的方法。session 对象常用的方法如
表 1-7 所示。
方法 | 返回值类型 | 说明 |
---|---|---|
setAttribute(String key,Object value) | void | 以 key-value 的形式保存对象值 |
getAttribute(String key) | Object | 通过 key 获取对象值 |
getId | String | 获取 sessionid |
invalidate() | void | 设置 session 对象失效 |
setMaxInactiveInterval(int interval) | void | 设置 session 的有效期 |
removeAttribute(String key) | void | 移除 session 中的属性 |
使用 session 保存数据。
session.setAttribute(String key,Object value);
从 session 中读取数据。
Object value = session.getAttribute(String key);
示例 7
用户注册成功后,将用户信息保存到 session 中,在新页面中读取 session 保存的用户信息
并显示。
分析如下。
要完成此功能,首先要在用户注册成功后,将用户的信息保存到 session 中。然后
当页面跳转到下一个 JSP 中,读取 session 中的数据并显示。需要注意的是,读取
session 时,首先要对 session 内容进行判断,否则对一个不存在的数据进行方法调用将
会造成程序异常。
关键代码如下;
注册处理页面关键代码:
<%
if(username.equals("admin")){
//不允许注册,返回注册页面
……
}else{
session.setAttribute("user",username);
response.sendRedirect("index.jsp");
}
%>
注册跳转页面关键代码:
<%
Object o = session.getAttribute("user");
if(0==null){
//显示用户名密码输入框,可以在此登录
%>
<label>用户名</labet><input type="text" name = "uname"/>
<label>密码</labet><input type="text" name = "unpassword"/>
<button>登录</button>
<%
}else{
//显示 "欢迎你,XXX"
out.print("欢迎你," +o.toString());
}
%>
当运行页面页,输入同户名 "user" 时,运行效果如图 1.14 所示。
图1.14 使用 session 保存数据
(4)session 的有效期
设置 session 有效期的作用是通过及时清理不使用 的 session 以实现资源的释放。在
JSP 中清除主动清除长时间没有发出请求的 session .
1)程序主动清除 session 的方式也分为两种:一种是使用 session,invalidate(); 使
session 失效;另一种是如果仅仅希望清除 session 的某个属性,可以使用
session.removeAttribute("userName"); 方法将指定名称的属性清除。
2)服务器主动清除 session 同样也可以通过两种方式实现:一种是通过设置 session
的过期时间,调用 setMaxInactiveInterval(int interval) 方法设置 session 的最大活动
时间,以秒为单位,如果这个时间内客户端没有再次发送请求,那么服务器
将清除这个 session ;另一种是通过配置文件中设置过期时间来实现,即在
Tomcat 服务器的 web.xml 文件中 <web-app> 和 <./web-app> 之间添加如下代码。
<session-config><session-timeout>10</session-timeout></session-config>
注意
<session-timeout> 里设置的数值以分为单位,而不是以秒为单位。
1.4.2 使用 Cookie\
1.Cookie
(1) Cookie 的概念
Cookie 由服务器端生成并发送给客户端浏览器,浏览器会将其保持成某个目录下
的文本文件。
(2) Cookie 的工作原理
用户在浏览网站时, Web 服务器会将一些资料存放在客户端,这些资料包括用户在
浏览网站期间输入的一些文字或选择记录。当用户下一次访问该网站的时候,服务器会
从客户端查看是否有保留下来的 Cookie 信息,然后依据 Cookie 的内存,呈现特定的页面内
容给用户。
(3)Cookie 与 session 的比较
- session 是在服务器端保存用户信息,Cookie 是在客户端保存用户信息。
- session 中保存的是对象,Cookie 中保存的是字符串。
- session 对象随会话结束而失效, Cookie 则可以长期保存在客户端。
- Cookie 通常用于保存不重要的用户信息,重要的信息使用 session 保存
2. Cookie 的应用
在 JSP 中使用 Cookie 需要经过以下三个步骤。
(1)创建 Cookie 对象
创建 Cookie 对象的语法如下。
Cookie cookieName = new Cookie(String key,String value);
- 变量 cookieName:引用创建的 Cookie 对象。
- 参数 key :Cookie 的名称。
- 参数 value:Cookie 所包含的值。
(2)写入 Cookie
Cookie 创建后,需要将其添加到响应中发送回浏览器保存,在响应中写入 Cookie
对象的语法如下。
reponse.addCookie(cookieName);
示例 8
用户登录成功,使用 Cookie 保存用户名。
关键代码:
// 允许注册,注册成功
Cookie cookie = new Cookie ("user",username);
response.addCookie(cookie);
……
response.sendRedirect("index.jsp");
(3)读取 Cookie
JSP 通过 response 对象的 addCookie() 方法写入 Cookie 后,读取时将会调用 JSP 中
request 对象的 getCookie() 方法,该方法将会返回一个 Cookie 对象数组,因此必须要
通过遍历的方式进行访问。Cookie 通过 key-value 方式保存,因而在遍历数组时,需要
通过调用 getName() 对每个数组成员的名称进行检查,直至找到需要的 Cookie ,然后再
调用 Cookie 对象的 getValue() 方法获得与名称对应的值。读取 Cookie 的语法如下。
Cookie[] cookies = request.getCookies();
示例 9
在新闻系统首页读取 Cookie 中的用户名。
关键代码:
<%
Cookie[] cookies=request.getCookies();
String user"";
for(int i = 0 ;i<cookies.length;i++){
if(cookies[i].getName().equals("user")){
user=cookies[i].getValue();
}
}
%>
<label> 用户名</label>
<input type = "text" name="uname" value="<%=user%>"/>
运行程序,当在首页单击 "注销" 按钮后,用户名自动显示在 "用户名" 文本框
中。效果如图 1.15 如图和 图 1.16 所示。
图 1.15 注册 成功后保存用户名 图 1.16 读取 Cookie 显示用户名
注意
在读取 Cookie 时,为了确保页面运行不会出现异常,建议在 循环 Cookie 数
组时先对数组进行非空判断,以免出现空指针异常。
Cookie 创建后,可以通过调用其自身的方法来对 Cookie 进行设置。Cookie 的常用
方法如表 1-8 所示。
方法 | 返回值类型 | 说明 |
---|---|---|
setValue(String value) | void | 创建 Cookie 后,为 Cookie 赋值 |
getName() | String | 获取 Cookie 的名称 |
getValue() | String | 获取 Cookie 的值 |
getMaxAge() | int | 获取 Cookie 的有效期 |
setMaxAge(int expiry) | void | 设置 Cookie 的有效期,以秒为单位 |
提示
使用 setMaxAge(int expiry) 时,有以下几种情况。
- 通常情况下 expiry 参数应大于 0 的整数,表示 Cookie 的有效期。
- 如果设置 expiry 参数为0,表示删除 Cookie.
- 设置 expiry 参数为-1或者不设置,表示 Cookie 会在当前窗口关闭后失效。
1.4.3 application 内置对象与全局作用域
application 对象类似于系统的 "全局变量",每个 Web 项目都会有一个 application
对象,可以在整个 Web 项目中共享使用数据。application 对象的常用方法如表 1-9 所示。
方法 | 返回值类型 | 说明 |
---|---|---|
setAttribute(String key,Object value) | void | 以 key-value 的形式保存对象值
|
getAttribute(String key) | Object | 通过 key 获取对象值 |
示例 10
统计网站的访问人数。
关键代码:
<%
Object count =application.getAttribute("count");
if(count==null){ //application 中未存放 count
application.setAttribute("count",new Inter(1));
}else{ //application 中已经存放 count
Integer i=(Integer)count:
application.setAttribute("count",i.intValue()+1);
}
Integer icount = (Integer)application.getAttribute("count");
out.println("页面被访问了"+icount.intValue()+:"次");
%>
运行程序,在页面底部显示访问次数,效果如图 1.17 所示。
图 1.17 统计网站访问次数
补充知识
在 JSP 中的对象,包括用户创建的对象,都有一个范围属性,这个范围也称
为 "作用域“ 。作用域定义了在什么时间内,在哪一个 JSP 中可以访问这些对象。
在 JSP 中有四种作用域,分别是 page、request、session 、application。
1.4.4 page 作用域与 pageContext 对象
所谓 page 作用域指单一 JSP 的范围,page 作用域内的数据只能在本页面中访问。
在 page 作用域内可以使用 pageContext 对象的 setAttribute() 和 getAttribute() 方法来
访问具有这种作用域类型的数据。
page 作用域内的对象在客户端每次请求 JSP 时创建,在服务器发送回响应或请求
转发到其他的页面或资源后失效。
示例 11
制作两个 JSP 页面,在 testOne 页面 中使用 pageContext 对象保存一个数据,在
testTwo 页面中读取数据,查看效果。
分析如下。
如果在创建对象时指定作用范围为 page 范围,那么这个对象只能在当前页面内
被访问,如果在其他页面中进行访问,将无法获取到该对象信息。
关键代码如下。
testOne.jsp 页面代码:
<%
String name ="page";
pageContext.setAttribute("name",name);
%>
<strong>
testOne:<%=pageContext.getAttribute("name")%>
</strong>
<br/>
<%
pageContext.include("testTwo.jsp")
%>
<strong>
testTwo:<%=pageContext.getAttribute("name")%>
</strong>
运行效果如图 1.18所示。
图 1.18 page 作用域
提示
pageContext 对象本身也属于 page 范围。具有 page 范围的对象都被绑定到
pageContext 对象中。
1.4.5 不同作用域的对比
到目前为止,我们已经掌握了对象的四种作用域范围。它们彼此之间的区别如
表 1-10 所示。
名称 | 说明 |
---|---|
page 作用域 | 只在当前页面有效,一旦离开当前页面,则在该范围内创建的对象将无法访问 |
request 作用域 | 在同一个请求范围内可以访问该范围内创建的对象,一旦请求失效,则创建的对象也随之失效 |
session 作用域 | 在会话没有失效或者销毁前,都可以访问该范围内的对象 |
application 作用域 | 在整个 Web 应用范围没有停止前,都可以从 application 中进行数据的存取 |