我们在前面学习了:
Java EE基础(12):Cookie介绍对象与使用 ,解决了不同请求间的数据共享问题。
Java EE基础(14):Session对象介绍与使用,解决了同一个用户不同请求的处理,需要相同数据问题。
这次我们学习ServletContext对象。它解决了不同的用户的数据共享。
ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
ServletContext光看名字,会不会有人觉得这个对象是每个Servlet都有一个?其实并不是的,事实上,一个web应用对应的是一个ServletContext,所以ServletContext的作用范围(作用域)应该是整个应用的。
现在你知道了,你创建的一个web应用只对应着一个ServletContext。句话说,在你的web项目中只有一个ServletContext对象。
解决了不同用户对同一数据的共享问题。
ServletContext是由服务器进行创建的,一个项目有且仅有一个ServletContext对象。不管从项目中哪一个Servlet中获取,得到的都是同一个ServletContext对象。该对象由所有用户共同拥有,那么不同用户发起的请求获取到的也就是同一个对象。
服务器启动到服务器关闭
整个项目内
百度词条:
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接口中有这个方法。
我们知道了getServletContext()方法是从什么地方来的,此时我们也知道如何获取ServletContext 对象。那么接下来会讲解三种不同的方法获取ServletContext对象
以下是三种方式获取ServletContext 对象:
ServletContext servletContext = this.getServletContext(); // 获取ServletContext对象,方式1
ServletContext servletContext2 = this.getServletConfig().getServletContext(); // 获取ServletContext对象,方式2
ServletContext servletContext3 = req.getSession().getServletContext(); // 获取ServletContext对象,方式3
和我们前面的Session存储与获取是一样的用法。
ServletContext servletContext = this.getServletContext(); // 获取ServletContext对象,方式1
servletContext.setAttribute("name", "value");
servletContext.getAttribute("name");
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath(""); // 获取项目下资源的绝对路径
设置值和获取值、获取项目下资源的绝对路径。剩下的方法可以参考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());
}
}
更多Java EE基础的 Servlet与JSP相关 请点击:【Servlet + JSP】 目录