ServletContext初步理解笔记

it2024-04-08  44

ServletContext初步理解笔记

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

1.1 四大域对象

域对象范围具体类page仅在jsp中有效page域:pageContextrequest一次请求request域: HttpServletContextsession一次会话session域: HttpSessionapplication整个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.csdn.net/qq_36371449/article/details/80314024 2. https://www.w3cschool.cn/servlet/servlet-3ceg2p0t.html

最新回复(0)