目录
1.Session域
(1)什么是Session
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。
(2)Session的相关方法
setAttribute(String key,Object value) | 以key/value的形式保持对象值 |
getAttribute(String key) | 通过key获取对象值 |
getMaxlnactiveInterval() | 获取session的有效非活动时间,以秒为单位 |
getId() | 获取session对象的编号 |
invalidate() | 设置session对象失效 |
removeAttribute(String key) | 从session中删除指定名称(key)所对应的对象 |
(3)Session的生命周期
Session与Servlet相似,包括三个阶段:创建、活动、销毁。当用户在第一次访问Servlet时,服务器都会先创建一个SessionId对象,然后对象在这个页面会一直存在,只要当前页面没有全部关闭或者没有从其他浏览器打开页面则对象会一直存在。对象在同一页面中也可以执行多次。Session的销毁有三种方式,一是通过调用invalidate()方法销毁、二是session超过getMaxlnactiveInterval()设置的时间,就会自动销毁、三是服务器关闭。
2.Application域
(1)什么是Application
Application对象用于保存应用程序中的共有数据。他在服务器启动时自动创建,在服务器停止时销毁。当application对象存在时,所有用户都可以共享该application对象。
(2)Application方法
setAttribute(String key,Object value) | 以key/value的形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
String getRealPath(String path) | 返回相对路径的真实路径 |
(3)Application的生命周期
Application域的生命周期随着Servlet的创建而创建,在所有页面都可以使用域中的数据,相当于全局变量的作用。并且当一个页面修改了其中的数据后续页面再次调用就会沿用之前修改过的值。Application的销毁也是随着服务器的关闭而销毁。
3.二者的区别
(1)主要区别
Session域更加类似于编程语言中的局部变量,每次第一回打开页面都会重置Session域中的数据,所以当用多个浏览器来访问其中数据,每个浏览器的数据都不一样。而Application域更加类似编程语言中的全局变量,每次打开页面的初始数据都会沿用之前最后一次处理后的Application数据。
(2)实例演示
以下是一个使用Session域实现的累加器代码:
public class PrivateSum extends HttpServlet {
/**
* 初始化
*/
public void init() {
}
/**
* doGet方法
* <li> 完成局部私有累加计数
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int count;
// 设置输出类型和编码格式
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 通过表单中的控件名称获得控件的value值
String str = request.getParameter("number");
// 将字符串转为整型数据
int num = Integer.parseInt(str);
// 创建session对象
HttpSession session = request.getSession();
// 返回由count指定的会话属性
String o = (String) session.getAttribute("count");
if (o != null) {
count = Integer.parseInt(o);
} else {
count = 0;
}
// 累加,但在同一个session中会一直累加
count += num;
String result = String.valueOf(count);
session.setAttribute("count", result);
out.println("现在的累加结果是" + count);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request, response);
}
/**
* 销毁方法
*/
public void destroy() {
}
}
Session域实现的累加器html代码
<DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>私人累加器===使用不同浏览器,数据从头开始计数的</title>
</head>
<body>
<!--这里有一个知识点:相对路径和绝对路径,在客户端看的时候的理解 -->
<form action="../privateSum">
输入累加数字:
<input type="text" name="number">
<input type="submit" value="累加计算">
</form>
</body>
</html>
演示结果(以10作为累加数):
在第一个浏览器中运行并输入10:
运行三次后的结果为30:
在第二个浏览器中运行并输入10:
运行后结果为10。
所以可以判断此时的数据是重新开始运算得到的。
以下是一个使用Application域实现的累加器代码:
public class PublicSum extends HttpServlet
{
//声明上下文对象
ServletContext sc;
public void init()
{
//实例化上下文对象
sc=this.getServletContext();
}
public void doGet(
HttpServletRequest request,
HttpServletResponse response)throws ServletException,IOException{
int count; //计数器
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//通过表单中的控件名称获得控件的value值
String str=request.getParameter("number");
int num=Integer.parseInt(str); //字符串型转变为整型
//返回Servlet上下文中count的对象,如没有count的对象,则返回null
String o=(String)sc.getAttribute("count");
if( o != null ) { //如果在当前服务器中,曾调用过该应用程序,则有count的对象。
count=Integer.parseInt(o);
} else {
count=0;
}
// 累加,同一个服务一旦户动,会一直累加
count += num;
String result = String.valueOf(count); //整型转变为字符串型
sc.setAttribute("count",result); //把result对象的值赋给count对象,即count的值为result的值
out.println("现在的累加结果是"+count);
}
public void destroy(){}
}
Session域实现的累加器html代码:
<DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>公共累加器===使用不同浏览器,数据是共享的</title>
</head>
<body>
<!--这里有一个知识点:相对路径和绝对路径,在客户端看的时候的理解 -->
<form action="../publicSum">
输入累加数字:
<input type="text" name="number">
<input type="submit" value="累加计算">
</form>
</body>
</html>
演示结果(依然以10作为累加数):
在第一个浏览器中运行并输入10:
运行三次后的结果为30:
在第二个浏览器中运行并输入10:
运行后的结果为40
所以可以判断此时的数据是沿用之前的数据运算得到的。