一、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内置对象的更多相关文章

  1. Servlet--取得session,application内置对象

    在前面的博客里面,使用Servlet取得了request,response,config对象,实际上通过Servlet程序也可以取得session,application等内置对象. 1,通过Http ...

  2. application内置对象

    application 实现用户间的数据共享,可存放全局变量 setAttribute() getAttribute() getServerInfo(); //获取引擎名和版本号,如:Apache T ...

  3. JSP第二篇【内置对象的介绍、4种属性范围、应用场景】

    什么是JSP内置对象 JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用.JSP技术的设计者为便于开发人员在编写JSP页面时获得这些w ...

  4. JSP的内置对象application、session、request、page的作用域

    1.application内置对象的类型名称为ServletContext. 2.session内置对象的类型名称为HttpSession. 3.application作用域:对应整个应用上下文. a ...

  5. Struts2初学 Struts2在Action获取内置对象request,session,application(即ServletContext)

    truts2在Action中如何访问request,session,application(即ServletContext)对象???? 方式一:与Servlet API解耦的方式      可以使用 ...

  6. JSP内置对象之application对象

    虽然常把Web应用称为B/S架构的应用,但其实Web应用一样是C/S结构的应用,只是这种应用的服务器是Web服务器,而客户端是浏览器. 现在抛开Web应用直接看Web服务器和浏览器. Web服务器负责 ...

  7. Tomcat的常用内置对象

    Tomcat的常用内置对象 1.request内置对象 所谓内置对象就是容器已经创建好了的对象,如果收到一个用户的请求就会自动创建一个对象来处理客户端发送的一些信息,这个内置对象就是request.类 ...

  8. Response内置对象

    request内置对象:主要用来处理用户的请求 response内置对象:处理对用户的响应(在调用service方法时容器会传递过来) response重要方法: public void addCoo ...

  9. JSP 9个内置对象

    JSP内置对象(隐式对象)是JSP容器为每个页面自动实例化的一组对象,开发者可直接使用,也被称为预定义变量. JSP容器提供了9个内置对象 request // javax.servlet.http. ...

随机推荐

  1. Java开发知识之Java的正则表达式

    目录 正则表达式 一丶什么是正则表达式 1.正则表达式简介 2.无正则表达式判断代码 3.使用正则表达式代码. 二丶正则表达式API 三丶正则表达式语法格式 1.正则表达式语法 正则表达式 一丶什么是 ...

  2. 通过 Ansible 安装 Docker

    本文的演示环境为 ubuntu 16.04. 先在 Ansible Galaxy 搜索 docker,由 geerlingguy 贡献的 docker role 是目前最受欢迎的: 通过 ansibl ...

  3. JS引擎线程的执行过程的三个阶段(一)

    浏览器首先按顺序加载由<script>标签分割的js代码块,加载js代码块完毕后,立刻进入以下三个阶段,然后再按顺序查找下一个代码块,再继续执行以下三个阶段,无论是外部脚本文件(不异步加载 ...

  4. Wcf传递的参数实际不为空,但是接收时显示为空。

    问题原因:参数大小写不一致引起,服务端接收参数为空 客户端引用 服务端定义

  5. #WEB安全基础 : HTML/CSS | 0x9美丽的饮料店

    我带着你,你带着钱,咱们去喝点饮料吧. 老板久仰你的大名,请你帮忙设计一个网站宣传他的饮料店 你要制定一个完美的方案还需要多学点东西 我先帮你设计一下 这是存放网站的文件夹 这是根目录   这是abo ...

  6. iOS----------APP怎样做更安全

    1 网络请求的安全方案 1.1 https请求,最好有安全交互平台. 1.2 对重要的参数请求进行加密(推荐AES,ERSA加密). 1.3 服务器返回数据时,对重要数据进行加密. 1.4 不要把密钥 ...

  7. Android BottomNavigationBar导航栏

    基本属性 setActiveColor //选中item的字体颜色 setInActiveColor //未选中Item中的颜色 setBarBackgroundColor//背景颜色 setMode ...

  8. WPF:DropShadowEffect 生效

    1.BorderThickness = “XX”,xx可以当作阴影四周的宽度 2.BorderBrush="Transparent"

  9. python读取txt文件最后一行(文件大+文件小)

    txt文件小 #coding:utf-8 ''' fname为所读xx.txt文件 输出为:文件第一行和最后一行 ''' fname = 'test.txt' with open(fname, 'r' ...

  10. Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee

    双击 勾上蓝色保存