Servletcontext对象

1. 介绍

  ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。为了方便大家理解,我们将ServletContext和Cookie、Session做一个简单对比,如下图:

在这里插入图片描述

我们可以把ServletContext当成一个公用的空间,可以被所有的客户访问,如上图,A、B、C三个客户端都可以访问。

  WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用,并且它被所有客户端共享。

  由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。

当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁

2. ServletContext使用方法

ServletContext对象如何得到

this.getServletContext(); 
this.getServletConfig().getServletContext();

你可以把它想象成一张表,这个和Session非常相似:每一行就是一个属性,如下:

在这里插入图片描述

  1. 添加属性:setAttribute(String name, Object obj);
  2. 得到值:getAttribute(String name),这个方法返回Object
  3. 删除属性:removeAttribute(String name)

生命周期
  ServletContext中的属性的生命周期从创建开始,到服务器关闭结束。

3. 一个快速入门的案例

我们创建Servlet1和Servlet2,分别用于在ServletContext中创建和读取属性:
Servlet1的doGet方法为:

在这里插入图片描述

Servlet2的doGet方法为:

在这里插入图片描述

以此访问Servlet1和Servlet2,我们可以分别看到输出如下:

在这里插入图片描述

  粗看之下,这个运行结果和Session,Cookie的应用似乎没什么区别,但事实上则完全不一样的。只要不关闭Tomcat或者reload该应用,当我们关闭当前的浏览器,或者是换一个浏览器,比如从360浏览器换到了IE浏览器再次访问Servlet2,我们依然可以看到这个结果!这就是和和Session,Cookie最大的不同了。之所以会造成这种不同,是因为ServletContext存在于服务器内存中的一个公共空间,它可以供所有的用户客户端访问。

4. ServletContext应用

之前我们学过的请求转发是通过request对象的:

在这里插入图片描述

这里要说明的是,ServletContext也可以实现请求转发:

在这里插入图片描述

这两个转发效果是一样的。

获取Web应用的初始化参数
  我们可以用<init-param>标签为servlet配置初始化参数,然后使用ServletConfig对象获取这些参数,假如有如下的MyServlet,它的配置为:

在这里插入图片描述

  1. 可以看到它配置了一个初始化参数:encoding=utf-8,那么我们在MyServlet的源代码中需要这样去得到这个参数:

在这里插入图片描述

  2. 注意,上述的参数配置方法只针对一个特定的Servlet有效,我们可以通过ServletContext来获取全局的、整个Web应用的初始化参数,全局的初始化参数是这样配置在web.xml文件中的:

在这里插入图片描述

  3. 然后我们可以在任意一个Servlet中使用ServletContext获取这个参数:

在这里插入图片描述

利用ServletContext对象读取资源文件(比如properties文件)
  读取资源文件要根据资源文件所在的位置来决定,一般分为以下两种情况:

  文件在WebRoot文件夹下,即Web应用的根目录。这时候我们可以使用ServletContext来读取该资源文件。

  假设我们Web根目录下有一个配置数据库信息的dbinfo.properties文件,里面配置了name和password属性,这时候可以通过ServletContext去读取这个文件:

   如果这个文件放在了src目录下,这时就不能用ServletContext来读取了,必须要使用类加载器去读取。

在这里插入图片描述

  如果这个文件此时还没有直接在src目录下,而是在src目录下的某个包下,比如在com.gavin包下,此时类加载器要加上包的路径,如下:

在这里插入图片描述

  补充一点,ServletContext只有在读取的文件在web应用的根目录下时,才能获取文件的全路径。比如我们在WebRoot文件夹下有一个images文件夹,images文件夹下有一个Servlet.jpg图片,为了得到这个图片的全路径,如下:

在这里插入图片描述

在网站开发中,有很多功能要使用ServletContext,比如
  1. 网站计数器
  2. 网站的在线用户显示
  3. 简单的聊天系统

  总之,如果是涉及到不同用户共享数据,而这些数据量不大,同时又不希望写入数据库中,我们就可以考虑使用ServletContext实现。

ServletContext使用建议
  因为存在ServletContext中的数据在服务器中会长时间,这样就会占用很多内存,因此在使用ServletContext时,建议不要往里面添加过大的数据!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgy_yuebin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值