【JavaWeb】09-四大作用域对象

1. 四大作用域

  1. application: 应用
作用域是整个项目
项目关闭、重启数据会丢失
如果项目不关闭,所有用户访问该项目的所有页面都可以获取application
  1. session: 会话
作用域是一次会话
关闭浏览器数据会丢失
如果会话不中断,本次会话访问的所有页面都可以获取session中的数据
  1. request: 请求
作用域是一次请求
发送另一次请求时数据无法传递
  1. pageContext: 页面上下文
作用域是一个页面
不同页面无法共享域中的数据。

2. 作用域存放数据的方式是key-value形式,key是String,value是Object

  1. 基本使用
//我们在page1.jsp中存值。
application.setAttribute("name","123");
session.setAttribute("name","123");
request.setAttribute("name","123");
pageContext.setAttribute("name","123");

//我们在page1.jsp中取值
application域:<%=application.getAttribute("name") %><br>
session域:<%=session.getAttribute("name") %><br>
request域:<%=request.getAttribute("name") %><br>
pageContext域:<%=pageContext.getAttribute("name") %><br>
这时,四个值都是可以取到的

//此时,定义一个page2.jsp,按照相同的方法取值
application域:<%=application.getAttribute("name") %><br>
session域:<%=session.getAttribute("name") %><br>
request域:<%=request.getAttribute("name") %><br>
pageContext域:<%=pageContext.getAttribute("name") %><br>
这时,request和pageContext的数据会丢失

//当我们浏览器重启之后,session的数据会丢失
  1. request域的转发
request.setAttribute("name","123");
request.getRequestDispatcher("page06.jsp").forward(request, response);
//此时在page06.jsp也可以获得request域的值。
//转发只可在项目内的页面跳转不可转发到其他项目中去
 request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
  1. response的重定向
request.setAttribute("name","123");
response.sendRedirect("page06.jsp");
//此时在page06.jsp中访问不到request的值
//重定向可以访问到百度,但是值发不过去
response.sendRedirect("http://www.baidu.com")

3. session的实际使用:

  1. 保存在线用户的信息
  2. 判断用户是否登录:
//利用表单制作用户的登录界面
//在表单提交时做session的存储
request.setCharacterEncoding("utf-8");

String username = request.getParameter("username");
String password = request.getParameter("password");

UserService userService = new UserService();
User user = userService.login(username, password);
//如果用户存在则放在session中,不存在显示登录失败!
if (user != null) {
	//out.write(user.getNickname() + "登陆成功!");
	// 把当前用户保存到session
	session.setAttribute("onlineUser", user);
	response.sendRedirect("");
} else {
	//out.write("登陆失败!");
	request.setAttribute("message", "用户名密码错误!");
	request.getRequestDispatcher("login.jsp").forward(request, response);
}

// 在其他页面中加入头部
Object onlineUserSession = session.getAttribute("onlineUser");
//如果session的值不是null则表示登录成功
if (onlineUserSession == null) {
	// response.sendRedirect("login.jsp");
	request.setAttribute("message", "请先登录再访问其他页面!");
	request.getRequestDispatcher("login.jsp").forward(request, response);
}
User onlineUser = (User)onlineUserSession;
  1. 实现权限:
    1. 视图权限:例如权限不够看不见操作的按钮
    2. 接口权限:权限不够不能请求相应的路径
//这里使用枚举去做了一个简单的管理员校验

Object onlineUserSession1 = session.getAttribute("onlineUser");
if (onlineUserSession1 == null) {
	request.setAttribute("message", "请先登录再访问其他页面!");
	request.getRequestDispatcher("login.jsp").forward(request, response);
} else if (((User)onlineUserSession1).getRole() != RoleEnum.ADMIN.ordinal()) {
	response.sendRedirect("403.jsp");
}
//枚举类
public enum RoleEnum {
	
	ADMIN("管理员"),
	USER("普通用户");
	
	private String desc;

	private RoleEnum(String desc) {
		this.desc = desc;
	}

	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}
}

4. application域的实例

网站访问量的统计
    1. 使用数据库记录访问量:
        优点:可以实现持久化
        缺点:效率低、浪费资源
    2. application记录访问量
        优点:效率高,节省系统资源
        缺点:项目重启,数据会丢失
        
// 记录访问量
Object count = application.getAttribute("web_access_count");
if (count == null) {
	application.setAttribute("web_access_count", 1L);
} else {
	application.setAttribute("web_access_count", (Long)count + 1);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值