本文共 3063 字,大约阅读时间需要 10 分钟。
js中有四大作用域,在Servlet中,只存在三大作用域.
HttpServletRequest 一次请求
HttpSession 一次会话
ServletContext 当前应用
下面详细介绍这三个作用域。
1、HttpServletRequest作用域:
存入数据的方法request.setAttribute(“User”,user);
此作用域保存的数据只是针对一次请求。使用该对象保存数据,一次请求内数据有效。请求转发是属于一次请求的,所以放在此作用域中的数据,在一个页面转发多个页面数据都是有效的。
作用域创建时间:客户端向服务器发送一次请求时创建。
销毁时间:服务器为这次请求作出响应之后,销毁request.
2、HttpSession作用域:
针对一次会话,使用该对象保存数据,数据保存在服务器上,一次会话(多个请求)内数据有效,如果关闭一次浏
览器,结束这次回话,再次打开的时候session就失效了。
创建时间:服务器第一次调用getSession()方法的时候,服务器创建session对象。
销毁时间:销毁有三种情况
1.服务器非正常关闭(正常关闭时:Session被序列化);
2.Session过期,xml文件配置默认时间是30分钟。
3.手动调用Session的invalidate的方法。
3、SevletContext作用域:
针对一个web应用。一个web应用只有一个SevletContext对象,使用该对象保存的数据在整个web应用中都有效。
创建时间:服务器启动的时候。
销毁时间:服务器关闭的时候或者项目移除的时候。
总结:如果数据保存在request对象中,一般使用请求转发,来获取。因为请求转发是只有一次请求的。但是如果
是重定向,因为重定向是多次请求,所以不能使用request中的数据,可以使用session或context中的。
4、三个作用域通用方法:
存放数据:setAttribute(name,value)
获取数据:getAttribute(name);
删除数据:removeAttribute(name);
三大作用域的使用,其本质是根据作用域的范围,生命周期决定其使用的方式.
当我们的数据只需要在一次请求之间进行传递时,优先HttpServletRequest :例如 : 你的数据需要传递给下一个地址.
当我们的数据,在多次请求时需要实现共享时,优先使用HttpSession.例如: 用户的多个操作,都需要用户ID或者检查是否存在用户信息时.
当我们的数据,在整个应用是全局唯一的,且大家都可以访问,使用时,使用ServletContext.: 例如 : 整个应用的访问人数.虽然用户访问的地址不同,但是整个应用的访问人数都应该增长.此时使用ServletContext.
例如:全局的常量值,也可以使用ServletContext.
获取ServletContext作用域对象.一般用:req.getServletContext();
//1. 获取ServletContext ServletContext context1 = req.getServletContext(); System.out.println(context1); ServletContext context2 = this.getServletContext(); System.out.println(context2); ServletContext context3 = req.getSession().getServletContext(); System.out.println(context3); ServletContext context4 = this.getServletConfig().getServletContext(); System.out.println(context4); //在整个项目,全局只有一个ServletContext对象,所有对象都共有它.
ServletContext的核心方法:
//1. 获取ServletContext ServletContext context = req.getServletContext(); //2. ServletContext相关方法 //1. 作用域属性相关方法 //context.setAttribute(name, object); // 设置作用域属性值 //context.getAttribute(name) // 根据属性名 从作用域中获取值 //context.getAttributeNames()// 获取作用域中所有的属性名 //context.removeAttribute(name); // 删除作用域中属性值 //2. 作用域初始化属性值相关方法 //context.getInitParameter(name) // 根据参数名称,获取初始化参数对应的值 //context.getInitParameterNames() // 获取所有初始化参数的name值集合 //获取初始化参数的 name 属性值 EnumerationinitParameterNames = context.getInitParameterNames(); while(initParameterNames.hasMoreElements()) { String name = initParameterNames.nextElement(); System.out.println(name); System.out.println(context.getInitParameter(name)); } //获取服务器资源路径 String contextPath = context.getContextPath();// 获取项目名称 System.out.println(contextPath); String realPath = context.getRealPath("/");// 获取项目的物理路径 System.out.println(realPath); realPath = context.getRealPath("img");// 获取项目中img文件夹的物理路径 只能获取 webContent下面直接文件夹 System.out.println(realPath); realPath = context.getRealPath("child");// 获取项目的物理路径 返回child物理路径错误的 img/child System.out.println(realPath); Set resourcePaths = context.getResourcePaths("/"); // 获取webContent文件夹下面文件信息 for (String string : resourcePaths) { System.out.println(string); }
转载地址:http://sqyki.baihongyu.com/