一、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. linux下的powerline安装教程

    powerline是一款比较炫酷的状态栏工具,多用于vim和终端命令行.先上两张效果图,然后介绍一下具体的安装教程. 图 1 powerline在shell下的效果图 图 2 powerline在vi ...

  2. leetcode — candy

    /** * Source : https://oj.leetcode.com/problems/candy/ * * There are N children standing in a line. ...

  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本“产品管理”事例编辑界面新增KindEditor复文本编辑控件

    KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果,兼容IE.Firefox.Chrome.Safari.Opera等主流浏览器.KindEditor使 ...

  4. [二十一]JavaIO之BufferedReader 与 BufferedWriter

    功能简介 BufferedReader  从字符输入流中读取文本,内部缓冲各个字符,从而实现字符.数组和行的高效读取 BufferedWriter 将文本写入字符输出流,内部缓冲各个字符,从而提供单个 ...

  5. 我是这样理解HTTP和HTTPS区别的

    为何要用https? http协议的缺点 通信使用明文,内容可能被窃听(重要密码泄露) 不验证通信方身份,有可能遭遇伪装(跨站点请求伪造) 无法证明报文的完整性,有可能已遭篡改(运营商劫持) 用htt ...

  6. Django学习笔记(8)——前后台数据交互实战(AJAX)

    这里将自己这段时间学习的关于前后台数据交互的笔记写在这里,这里包含了Django传输数据给JS,AJAX的相关问题,跨域问题,如何解决AJAX的跨域问题等等.比较凌乱,请看到这篇博客的盆友见谅,如果我 ...

  7. SpringBoot系列——Spring-Data-JPA

    前言 jpa是ORM映射框架,更多详情,请戳:apring-data-jpa官网:http://spring.io/projects/spring-data-jpa,以及一篇优秀的博客:https:/ ...

  8. C#如何生成缩略图、水印

    1.安装CodeCarvings.Piczard   Install-Package CodeCarvings.Piczard 2.生成缩略图 ImageProcessingJob jobThumb ...

  9. Linux基础(Ubuntu16.04):安装vim及配置

    1.进入终端  Ctrl + Alt +T 出现终端窗口 2.输入命令: sudo apt-get install vim-gtk 3.验证是否成功 安装完vim后查看命令 vi tab键,就会关联出 ...

  10. 熟悉常用的HBase操作,编写MapReduce作业

    1. 以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据: 学生表(Student) 学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S_Age) 201 ...