ServletContext概述
ServletContext代表整个web应用,可以和程序的容器(服务器)来通信
ServletContext的获取
- 通过request对象获取
request.getServletContest();
- 通过HttpServlet获取
this.getServletContext();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxb6ezSU-1582260673258)(https://upload-images.jianshu.io/upload_images/14451551-df69f4e6544fea48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
ServletContext功能
- 获取MIME类型
MIME类型概念:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型
比如:text/html text是指纯文本(大类型) html是小类型
或者 image/jpeg
获取的方法:
String getMimeType(String file)
在演示获取MIME类型之前先说明一下为什么要获取MIME类型
我们在之前的博客讲到过请求头中的Accept对应的值其实就是MIME类型
我们看看tomcat里面的web.xml,可以看到很多MIME类型,非常的繁杂
如果我们每次写请求头或者响应头都要查询web.xml找出对应的MIME类型太过于繁琐,所以我们可以通过ServletContext来获取MIME类型
//1.通过HttpServlet获取ServletContext对象
ServletContext context = this.getServletContext();
//2.定义文件名称
String filename = "a.jpg";
//3.获取MIME类型
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);
2. 域对象(共享数据)
方法:
1.setAttribute(String name,Object value)
2.getAttribute(String name)
3.removeAttribute(String name)
ServletContext对象的范围:所以用户请求的数据
Demo3:
//1.通过HttpServlet获取ServletContext对象
ServletContext context = this.getServletContext();
//2.设置数据
context.setAttribute("msg", "haha");
Demo04:
//1.通过HttpServlet获取ServletContext对象
ServletContext context = this.getServletContext();
//2.获取数据
Object msg = context.getAttribute("msg");
System.out.println(msg);
我们先访问Demo03再访问Demo04,效果如下:
由于这种方法会使数据在内存中驻留很长时间,我们一般很少使用
3. 获取文件的真实路径(服务器路径)
方法:getRealPath(String path)
首先明确一个概念
我们的web项目一般会同时存在两个地方,分别是tomcat服务器和本地工作空间
而当别人远程访问我的web项目时,真正起作用的是tomcat服务器
如果我们想加载一个文件,要怎么样才能获取它的真实路径(服务器路径)呢?
//1.通过HttpServlet获取ServletContext对象
ServletContext context = this.getServletContext();
//2.获取文件的服务器路径
String realPath = context.getRealPath("/b.txt");
System.out.println(realPath);
File file = new File(realPath);
运行效果如下:
我们来验证一下这个真实路径对不对
我们进入看看
上面的就是真实路径
我们刚才的b.txt是放在web目录下的,所以直接用**/斜杆就可以找到,如下图:
如果我们放在WEB-INF或者src下呢?
首先看看WEB-INF**目录下的c.txt
String realPath = context.getRealPath("/WEB-INF/c.txt");
最后看看src目录下的a.txt
String realPath = context.getRealPath("/WEB-INF/classes/a.txt");
我们之前尝试过用反射的classloader来获取src目录下的真实目录,效果不错,但是也只能获取src目录下的资源,不能获取web和WEB-INF目录下的资源,所以我们以后都会使用ServletContext来获取真实路径