ServletContext初步理解笔记

本文详细介绍了ServletContext的概念及作用,包括其在Web应用中的唯一性和共享特性。解释了它与其他域对象的区别,并探讨了其生命周期、常用方法及其应用场景,如数据共享、请求转发及资源文件读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ServletContext初步理解笔记

ServletContext:解释为servlet的上下文,当项目部署到服务器的时候,服务器会为这个项目创建一个对象,而这个对象就是ServletContext对象,并且这个对象是全局唯一的,而且所有的servlet都共享这个对象。可以理解为全局程序共享对象。
在这里插入图片描述
从图中就可以很清晰看出,并不是一个servlet对应一个servletContext,而是一整个项目只有一个servletContext。

1.1 四大域对象
域对象范围具体类
page仅在jsp中有效page域:pageContext
request一次请求request域: HttpServletContext
session一次会话session域: HttpSession
application整个web应用application域:ServletContext

上表可以看做是从小到大排序,也就是说servletContext是四大域对象中最大的一个域对象。

1.2 声明周期

可以值只要你的服务器不宕机,servletContext就一直存在。

1.3 常用方法
setAttribute()

getAttribute()

getAttributeNames()

removeAttribute()

1.4 应用方法

1.实现数据之间的共享

通过ServletContext 对象,可以实现数据共享,类似于session,但是session只能在一个客户端中共享数据,但是servletContext中的数据是在所有客户端中都可以实现实现数据共享。

2.实现请求转发

我们都知道request可以实现转发,同样的道理,同样作为域对象的servletContext也可以实现转发

this.getServletContext().getRequestDispatcher("xxx").forward(request, response);

3. 利用ServletContext对象读取资源文件(比如properties文件)

读取资源文件要根据资源文件的位置所决定,一般分为两种情况:

3.1 web应用的根目录(WebRoot文件夹)

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

// 这种方法的默认读取路径就是Web应用的根目录,以流的方式读取
InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
// 创建属性对象
Properties properties = new Properties();
// 以流的方式加载
properties.load(stream);
// 根据key,value的方式获取参数
String name = properties.getProperty("name");
String password = properties.getProperty("password");
out.println("name="+name+";password="+password);

如果图片放在web应用的根路径下面,也就是说webroot文件下面有一个img的文件里面有一张test.jpg的图片,可以得到这个图片的全路径:

// 如何读取到一个文件的全路径,这里会得到在Tomcat的全路径
String path = this.getServletContext().getRealPath("/img/test.jpg");

3.2 放在src目录下面

放在src目录下面的文件,不能用servletContext来读取,必须使用类加载器去读取。(因为项目部署以war包的形式部署到服务器,里面只有.class文件,没有.java文件)

// 类加载器的默认读取路径是src根目录
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties")

如果文件没有在src目录下面,必须加上包下的相对路径

InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("com/gavin/dbinfo.properties")
1.5 通常在spring项目中获取servletContext有以下方式

第一种:request获取servletContext

ServletContext servletContext = request.getServletContext()

第二种:使用ContextLoader

ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext()

第三种:使用spring注入自动注入

@Autowired
private ServletContext servletContext;
ServletContext使用建议

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


本文的参考博文:
1.https://blog.youkuaiyun.com/qq_36371449/article/details/80314024
2. https://www.w3cschool.cn/servlet/servlet-3ceg2p0t.html

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值