概念
- 概念:代表整个web项目(工程)
1.ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
2.定义servlet用于与其servlet容器通信的一组方法,例如,获取文件的MIME类型、分派请求或写入日志文件。
获取
获取:有两种获取方式
1.通过request对象获取
2.通过Httpservlet从GenericServlet中继承的方法获取
如下:
@WebServlet("/servletContextDemo1")
public class ServletContextDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//方法一:使用request对象获取
ServletContext servletContext1 = request.getServletContext();
//方法二:通过Httpservlet的方法获取
ServletContext servletContext2 = this.getServletContext();
System.out.println(servletContext1);
System.out.println(servletContext2);
//其实很好理解,由于servletContext是tomcat服务器将当前工程创建的对象,那么使用这种方法获取肯定是相同的
System.out.println("两个方法获取的servletcontext是否相同"+(servletContext1==servletContext2));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
控制台:
功能
- 1 .获取MIME类型
MIME类型:在互联网通信的过程中定义的一种文件类型(http协议也遵循了MIME类型的标准)
MIME类型的格式:大类型/小类型 如:text/html
获取:
方法:
/*
* 获取MIME类型
* */
@WebServlet("/servletContextDemo2")
public class ServletContextDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取servletContext对象
ServletContext servletContext = this.getServletContext();
//通过文件名获取MIME数据类型
String mimeType = servletContext.getMimeType("a.jpg");
System.out.println(mimeType);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
控制台
所有的MIME类型都存在服务器中的WEB.XML文件中,由于servletContext对象可以与服务器进行通信,所以可以获取到
方法的原理:实际上是通过扩展名(文件的后缀名)进行获取的
- 2 .域对象,共享数据
方法::和request域对象的方法相同
//获取servletContext对象
ServletContext servletContext = this.getServletContext();
//1.存储数据
servletContext.setAttribute("mag","xzw");
//2.获取数据
Object mag = servletContext.getAttribute("mag");
//3.移除数据
servletContext.removeAttribute("mag");
范围:所有用户都可以请求的数据,这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象,但是这个对象从服务器开始的时候创建,在服务器关闭的时候销毁,全程存活的时间很长,我们在使用它的是时候需要谨慎,使用多了会造成内存压力
//用于存储数据
@WebServlet("/servletContextDemo3")
public class ServletContextDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1和request域的使用方法相同,也有如下几种方法
//1.获取servletContext对象
ServletContext servletContext = this.getServletContext();
//2.存储数据
servletContext.setAttribute("mag","xzw");
//打印消息
System.out.println("数据在demo3中存储成功");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
//用于获取数据
@WebServlet("/servletContextDemo4")
public class ServletContextDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取servletContext对象
ServletContext servletContext = this.getServletContext();
String mag = (String) servletContext.getAttribute("mag");
System.out.println("在demo4中获取共享数据mag:"+mag);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
控制台:
- 3 .获取文件的真实路径(服务器路径)
说明:我们在项目发布到服务器了之后,文件存放的路径是和工作空间中的文件结构不一致的
如图分别是在服务器中和在工作空间中的文件结构
在工作空间中文件的结构和我们写代码的时候是一样的,但是在服务器中的文件结构就有很大的不同,工作空间的src到服务器中之后会存放在classes文件中,所有的类变成字节码的形式。
方法:
//获取servletContext对象
ServletContext servletContext = this.getServletContext();
//使用getRealPath获取文件在服务器中的真实数据
String realPath = servletContext.getRealPath("path");
这个时候方法中的path写法就尤为重要
我们以一个配置文件为例,它可以在工作空间中存放在三个不同的位置,其实我们在写路径的时候只要思考该文件应该存放在服务器的那一个文件中就会很好写路径
1.src:获取a.txt 比较麻烦
方法一:
写法:/WEB-INF/classes/a.txt
//获取servletContext对象
ServletContext servletContext = this.getServletContext();
//使用getRealPath获取文件在服务器中的真实数据
String realPath = servletContext.getRealPath("/WEB-INF/classes/a.txt");
System.out.println(realPath);
方法二:在src下的文件也可以使用类加载器来进行加载
2.web:获取b.txt 简单
写法:/b.txt
//获取servletContext对象
ServletContext servletContext = this.getServletContext();
//使用getRealPath获取文件在服务器中的真实数据
String realPath = servletContext.getRealPath("/b.txt");
System.out.println(realPath);
3.WEB-INF:获取c.txt
写法:/WEB-INF/c.txt
//获取servletContext对象
ServletContext servletContext = this.getServletContext();
//使用getRealPath获取文件在服务器中的真实数据
String realPath = servletContext.getRealPath("/WEB-INF/c.txt");
System.out.println(realPath);