(15)ServletContext对象介绍与使用

(15)ServletContext对象介绍与使用

前言

我们在前面学习了:
Java EE基础(12):Cookie介绍对象与使用 ,解决了不同请求间的数据共享问题
Java EE基础(14):Session对象介绍与使用,解决了同一个用户不同请求的处理,需要相同数据问题

这次我们学习ServletContext对象。它解决了不同的用户的数据共享。

一、ServletContext对象介绍

1.是什么

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。

ServletContext光看名字,会不会有人觉得这个对象是每个Servlet都有一个?其实并不是的,事实上,一个web应用对应的是一个ServletContext,所以ServletContext的作用范围(作用域)应该是整个应用的。

现在你知道了,你创建的一个web应用只对应着一个ServletContext。句话说,在你的web项目中只有一个ServletContext对象。

2.作用

解决了不同用户对同一数据的共享问题。

3.原理

ServletContext是由服务器进行创建的,一个项目有且仅有一个ServletContext对象。不管从项目中哪一个Servlet中获取,得到的都是同一个ServletContext对象。该对象由所有用户共同拥有,那么不同用户发起的请求获取到的也就是同一个对象。

4.生命周期

服务器启动到服务器关闭

5.作用域

整个项目内

6.特点

  • 服务器进行创建
  • 用户共享
  • 一个项目只且只有一个

二、ServletContext使用

1.如何获取

百度词条:

ServletContext接口是Servlet中最大的一个接口,呈现了web应用的Servlet视图。ServletContext实例是通过 getServletContext()方法获得的,由于HttpServlet继承GenericServlet的关系,GenericServlet类和HttpServlet类同时具有该方法。

解释:我们查询文档是会找到一个ServletContext接口,这个并不是我们要的。我们想要的是一个ServletContext对象。

既然在HttpServlet中并没有获取ServletContext对象的方法,那我们看它的父类GenericServlet。

我们发现HttpServlet的父类GenericServlet中有一个getServletContext() 方法,它可以返回一个ServletContext对象。返回的类型是ServletContext。此时我们应该就知道该怎么获取ServletContext对象了。

ServletContext servletContext = this.getServletContext(); // 获取ServletContext对象

getServletContext() 方法其实从GenericServlet实现的接口ServletConfig中来的,ServletConfig接口中有这个方法。

2.获取的三种方式

我们知道了getServletContext()方法是从什么地方来的,此时我们也知道如何获取ServletContext 对象。那么接下来会讲解三种不同的方法获取ServletContext对象

以下是三种方式获取ServletContext 对象:

ServletContext servletContext = this.getServletContext(); // 获取ServletContext对象,方式1
ServletContext servletContext2 = this.getServletConfig().getServletContext(); // 获取ServletContext对象,方式2
ServletContext servletContext3 = req.getSession().getServletContext(); // 获取ServletContext对象,方式3
		

3.数据存储与获取

和我们前面的Session存储与获取是一样的用法。

ServletContext servletContext = this.getServletContext(); // 获取ServletContext对象,方式1
servletContext.setAttribute("name", "value");
servletContext.getAttribute("name");

4.当前项目路径获取

ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath(""); // 获取项目下资源的绝对路径

5.示例代码

设置值和获取值、获取项目下资源的绝对路径。剩下的方法可以参考Tomcat文档。

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ServletContext简单使用
 * 
 * @author changsheng
 */
@WebServlet("/ServletContextServlet")
public class ServletContextServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 2.设置响应编码格式
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 3.获取请求信息
		// 4.处理请求信息
		StringBuilder print = new StringBuilder();
		ServletContext servletContext = this.getServletContext(); // 获取ServletContext对象,方式1
		servletContext.setAttribute("name", "value"); // 设置值
		String name = (String)servletContext.getAttribute("name");
		print.append(name+"\n");
		String realPath = servletContext.getRealPath(""); // 获取项目下资源的绝对路径
		print.append(realPath);
		// 5.响应处理结果
		System.out.println(print); // 打印Session对象id
		resp.getWriter().write(print.toString());
	}

}