快速入门Servlet之ServletContext(十五)

ServletContext概述

ServletContext代表整个web应用,可以和程序的容器(服务器)来通信

ServletContext的获取

  1. 通过request对象获取
    request.getServletContest();
  2. 通过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功能

  1. 获取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);

运行效果如下:

我们来验证一下这个真实路径对不对

我们进入看看
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cb0MSlBx-1582260673278)(https://upload-images.jianshu.io/upload_images/14451551-f220ca42abaf3458.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
上面的就是真实路径

我们刚才的b.txt是放在web目录下的,所以直接用**/斜杆就可以找到,如下图:


如果我们放在
WEB-INF或者src下呢?

首先看看
WEB-INF**目录下的c.txt
image.png

String realPath = context.getRealPath("/WEB-INF/c.txt");

最后看看src目录下的a.txt

String realPath = context.getRealPath("/WEB-INF/classes/a.txt");

我们之前尝试过用反射的classloader来获取src目录下的真实目录,效果不错,但是也只能获取src目录下的资源,不能获取webWEB-INF目录下的资源,所以我们以后都会使用ServletContext来获取真实路径

发布了109 篇原创文章 · 获赞 2 · 访问量 1232

猜你喜欢

转载自blog.csdn.net/qq_42528769/article/details/104426031