session和application内置对象
一、Session内置对象
分析得知request内置对象中的属性只是在当次请求中有效,经过客户端跳转之后就无效,因为客户端跳转属于第二个请求,也就是说request只代表当次请求的对象,如果要让客户端跳转之后保存的属性还有效,则可以使用session内置对象。用户的信息保存在request内置对象中是不合理的,应该保存到表示 一个用户的内置对象中,就是session内置对象,因为Session就算客户端跳转了,保存的属性是有效的。session内置对象的类型是:HttpSession,其常见的方法有:
1.public void setAtrribute(String name, Object value) 保存属性
2.public Object getAttribute(String name) 根据属性名取得值,只能取得使用setAttribute()保存的数据值
3.public void invalidate() 销毁当前session,一般用来实现用户注销功能
4.public String getId() 取得Session的编号,其实这个编号和浏览器中的名字叫做 JSESSIONID cookie的值是一样的
二、application内置对象
我们知道repuest内置对象保存的属性只是在当次请求有效,经过客户端跳转之后就无效了,保存在session内置对象中属性范围当前用户有效,关闭当前浏览器就失效。如果要让关闭浏览器后属性还有效则该属性应该保存在一个更大内置对象中,该对象就是application内置对象,是一个表示服务器范围的内置对象。application内置对象的类型是:ServletContext
常见的方法有:
1.Object getAttribute(String name) 返回给定名的属性值
2.Enumeration getAttributeNames() 返回所有可用属性名的枚举
3.void setAttribute(String name,Object obj) 设定属性的属性值
4.void removeAttribute(String name) 删除一属性及其属性值
5.String getServerInfo() 返回JSP(Servlet)引擎名及版本号
6.String getRealPath(String path) 返回一虚拟路径的真实路径
7.ServletContext getContext(String uripath) 返回指定WebApplication的application对象
下面的demo实现的在线人数的监听
public class OnlineNumber extends HttpServlet{
//保存用户名
private Set<String> names= new HashSet<String>();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String pathInfo = req.getPathInfo();
System.out.println(pathInfo);
if ("/login".equals(pathInfo)) {
this.login(req, resp);
}else if ("/logout".equals(pathInfo)) {
this.logout(req, resp);
}
}
public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String username = req.getParameter("username");
System.out.println(username);
//如果为null则表示还没有登录
if (req.getSession().getAttribute("username")==null) {
if (!"".equals(username)) {//只有输入的用户名不能为空字符串才能进行操作
req.getSession().setAttribute("username", username);
//将用户名保存到Set集合中
names.add(username);
//再将names集合保存到application内置对象中
req.getServletContext().setAttribute("users", names);
req.getServletContext().setAttribute("count", names.size());
}
}
//继续跳转到在线显示的页面
resp.sendRedirect("/MvcPro/pages/onlinelogin.jsp");
}
public void logout(HttpServletRequest req, HttpServletResponse resp) {
names.remove(req.getSession().getAttribute("username"));
//销毁当前用户的session内置对象
req.getSession().invalidate();
try {
req.getServletContext().setAttribute("count", names.size());
resp.sendRedirect("/MvcPro/pages/onlinelogin.jsp");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<base href= "/MvcPro/">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>
在线人数为:${count==null ? 0 : count}
</h1>
${users}
<form action="online/login" method="POST">
<fieldset>
<legend>请登录</legend>
用户名:<input type="text" name="username" ><br/><br/>
<input style="margin-left:60px" type="submit" value="提交">
</fieldset>
</form>
<a href="online/logout" >注销</a>
</body>
</html>
web.xml配置
<servlet-name>onlineServlet</servlet-name>
<servlet-class>com.sxt.mvcpro.controller.OnlineNumber</servlet-class>
<servlet-name>onlineServlet</servlet-name>
<url-pattern>/online/*</url-pattern>

Session与Application区别
1.session是会话变量,只要同一个浏览器没有被关闭,session对象就会存在。因此在同一个浏览器窗口中,无论向服务器发送多少请求,session对象只有一个。但是如果在一个会话中,客户端长时间不向服务器发出请求,session对象就会自动消失。这个时间取决于服务器,但是我们可以通过编写程序进行修改这个session的生命周期的时间。session.setMaxInactiveInterval(10000);//用来设置session的有效期为10000秒,超出这个范围将失效。
并且通过session对象可以存储或者读取客户的相关信息,例如用户名或购物信息等,可以通过session对象的setAttribute(String name,Object obj)方法和getAttribute(String name)的方法实现。注意的是getAttribute()方法的返回值是Object类型,如果将获取到的信息赋给String类型的变量,则需要进行强制类型转换或者调用其的toString()方法。
session.setAttribute("user","小名");
String user=(String)session.getAttribute("user");
2.application它类似于系统的全局变量,用于保存所有程序中的公有数据。它在服务器启动时自动创建,在服务器停止时销毁。当application对象没有被销毁的时候,所有用户都可以享用该application对象。它的生命周期可以说是最长的。也就是说同时再打开另一个浏览器,他们使用的都是同一个application对象。
session和application内置对象的更多相关文章
- Servlet--取得session,application内置对象
在前面的博客里面,使用Servlet取得了request,response,config对象,实际上通过Servlet程序也可以取得session,application等内置对象. 1,通过Http ...
- application内置对象
application 实现用户间的数据共享,可存放全局变量 setAttribute() getAttribute() getServerInfo(); //获取引擎名和版本号,如:Apache T ...
- JSP第二篇【内置对象的介绍、4种属性范围、应用场景】
什么是JSP内置对象 JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用.JSP技术的设计者为便于开发人员在编写JSP页面时获得这些w ...
- JSP的内置对象application、session、request、page的作用域
1.application内置对象的类型名称为ServletContext. 2.session内置对象的类型名称为HttpSession. 3.application作用域:对应整个应用上下文. a ...
- Struts2初学 Struts2在Action获取内置对象request,session,application(即ServletContext)
truts2在Action中如何访问request,session,application(即ServletContext)对象???? 方式一:与Servlet API解耦的方式 可以使用 ...
- JSP内置对象之application对象
虽然常把Web应用称为B/S架构的应用,但其实Web应用一样是C/S结构的应用,只是这种应用的服务器是Web服务器,而客户端是浏览器. 现在抛开Web应用直接看Web服务器和浏览器. Web服务器负责 ...
- Tomcat的常用内置对象
Tomcat的常用内置对象 1.request内置对象 所谓内置对象就是容器已经创建好了的对象,如果收到一个用户的请求就会自动创建一个对象来处理客户端发送的一些信息,这个内置对象就是request.类 ...
- Response内置对象
request内置对象:主要用来处理用户的请求 response内置对象:处理对用户的响应(在调用service方法时容器会传递过来) response重要方法: public void addCoo ...
- JSP 9个内置对象
JSP内置对象(隐式对象)是JSP容器为每个页面自动实例化的一组对象,开发者可直接使用,也被称为预定义变量. JSP容器提供了9个内置对象 request // javax.servlet.http. ...
随机推荐
- git版本控制工具的使用
目录 git版本管理工具使用 一丶Git的下载与安装 1.windows下的git的下载与安装 2.linux下的git安装 二丶常用命令 三丶Git仓库 1.配置仓库信息 2.仓库的创建于管理 四丶 ...
- Shell从入门到精通进阶之三:表达式与运算符
3.1 条件表达式 表达式 示例 [ expression ] [ 1 -eq 1 ] ` expression ` ` 1 -eq 1 ` test expression test 1 -eq 1 ...
- Docker Compose 之进阶篇
笔者在前文<Docker Compose 简介>和<Dcoker Compose 原理>两篇文章中分别介绍了 docker compose 的基本概念以及实现原理.本文我们将继 ...
- [十七]JavaIO之CharArrayReader 和 CharArrayWriter
功能简介 CharArrayReader 和 CharArrayWriter, 字符数组作为数据源的字符读写 CharArrayReader CharArrayWriter 只需要记住他们的根 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(4)- 联合调试(vspd, sscom, PyCharm2018.2)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之联合调试. 软件开发离不开调试,调试手段分两种:一是黑盒调试,即直接从输入/输出角度测试软件功能是 ...
- Java并发专题(二)线程安全
前言 随着时代的发展,CPU核数的增加和计算速度的提升,串行化的任务执行显然是对资源的极大浪费,掌握多线程是每个程序员必须掌握的技巧.但是同时多线程也是一把双刃剑,带来了共享资源安全的隐患.在本节会介 ...
- spring-mvc里的 <mvc:resources> 及静态资源访问
在进行Spring MVC的配置时,通常我们会配置一个dispatcher servlet用于处理对应的URL.配置如下: <servlet> <servlet-name>Sp ...
- DAL分页
using System;using System.Collections.Generic;using LModel.DTO;using Newtonsoft.Json;using System.Da ...
- Powerdesigner逆向工程64位Oracle数据库
Powerdesigner老版本不支持64位Client,新版本弄不到破解码 解决方法,用Powerdesigner+32位Oracle Clent访问64位Oracle Server 遇到的坑分享下 ...
- windows安装elasticsearch
1. 去官网 https://www.elastic.co/cn/ 下载 注意: ES对JDK版本有较高的要求,5.x及以上版本需要JDK8支持,本人此次使用2.4.6版本2. 下载后,JDK先安装, ...