ServletContext

Request 解决了一次请求内的数据共享问题,session 解决了用户不一样请求的数据共享问题,而不一样的用户的数据共享则该使用使用 ServletContext 对象。java

原理

ServletContext 对象由服务器进行建立,一个项目只有一个对象。无论在项目的任意位置进行获取获得的都是同一个对象,那么不一样用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。数据库

特色

  1. 服务器进行建立
  2. 用户共享
  3. 一个项目只有一个生命周期:
  4. 服务器启动到服务器关闭
  5. 做用域:项目内

使用

经过 this.getServletContext(); 获得ServletContext对象。你能够把它想象成一张表,这个和Session很是类似:每一行就是一个属性,以下:服务器

  • 添加属性:setAttribute(String name, Object obj);
  • 获得值:getAttribute(String name),这个方法返回Object
  • 删除属性:removeAttribute(String name)

实现Servlet的请求转发

  1. 经过request对象: java //url 是目的地,会将当前 servlet 的request 和 response 传过去 request.getRequestDispatcher("/url").forward(request, response);
  2. ServletContext 实现: java this.getServletContext().getRequestDispatcher("/url").forward(request, response);

利用 ServletContext 对象读取资源文件(好比properties文件)

文件在 WebRoot 文件夹下,即咱们的 Web 应用的根目录下。这时候咱们能够使用 ServletContext 来读取该资源文件。假设咱们Web根目录下有一个配置数据库信息的 dbinfo.properties 文件,里面配置了 name 和 password 属性,这时候能够经过 ServletContext 去读取这个文件:session

1 // 这种方法的默认读取路径就是Web应用的根目录
2 InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
3 // 建立属性对象
4 Properties properties = new Properties();
5 properties.load(stream);
6 String name = properties.getProperty("name");
7 String password = properties.getProperty("password");
8 out.println("name="+name+";password="+password);
由于存在ServletContext中的数据会长时间保存在服务器,会占用内存,所以建议不要向 ServletContext 中添加过大的数据!