您当前的位置: 首页 >  servlet

liaowenxiong

暂无认证

  • 2浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ServletContext的学习笔记(属Servlet学习课程)

liaowenxiong 发布时间:2022-04-10 10:16:08 ,浏览量:2

文章目录
  • ServletContext 简介
    • 获取 ServletContext 对象
    • 功能
      • 获取 MIME 类型
      • 用来共享数据
      • 获取文件在服务器主机的物理路径
      • 获取全局级别的初始化参数
      • 获取临时目录

ServletContext 简介

web 服务器在启动时,会为每一个已经部署的应用创建唯一的一个 ServletContext 实例,ServletContext 实例对象代表整个 Web 应用,可以和 Servlet 的容器(服务器)通信。

该实例会一直存在,除非服务器关闭或者应用被删除。

注意:每个应用对应唯一的一个 ServletContext 实例

获取 ServletContext 对象

GenericServlet 提供了getServletContext() 方法 HttpSession 提供了getServletContext() 方法 ServletConfig 提供了getServletContext() 方法

在 Servlet 中获取 ServletContext 对象: 1.request.getServletContext() 2.this.getServletContext(),因为自定义的 Servlet 继承了来自 GenericServlet 的 getServletContext() 方法。

功能 获取 MIME 类型

一种互联网通信的文件数据类型 格式:大类型/小类型 例如:text/html、image/jpeg

ServletContext 可以获取文件的 MIME 类型,实际上 MIME 类型存储在服务器的 conf/web.xml 文件中,因为 ServletContext 可以和服务器通信,所以可以获取 MIME 数据。

在这里插入图片描述

客户端会根据 MIME 类型使用对应的解析引擎来解析响应体的数据。

示例代码:

package priv.lwx.javaex.servlet_demo.web.servletcontext;
/**
 * 获取MIME类型
 *
 * @author liaowenxiong
 * @date 2022/1/12 15:34
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.IOException;

@WebServlet("/servlet_context_demo01")
public class ServletContextDemo01 extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    File file = new File("druid.properties");
    String name = file.getName();
    System.out.println(name);
    ServletContext context = this.getServletContext();
    String mimeType = context.getMimeType(name);
    System.out.println(mimeType); // 结果为null,properties文件没有对应的MIME类型
    String name1 = "a.jpeg";
    String mimeType1 = context.getMimeType(name1);
    System.out.println(mimeType1); // 结果为image/jpeg

  }
}
用来共享数据

ServletContext 对象也是一个域对象,可以用来共享数据。

setAttribute(String name, Object value); getAttribute(String name); removeAttribute(String name);

数据共享范围:所有用户的所有请求的数据。比方说,张三把自己的数据往 ServletContext 对象存放,李四可以获取到张三存放的数据,李四也可以存放自己的数据到 ServletContext 对象中,张三也可以获取李四存放的数据。

生命周期:服务器启动就创建 ServletContext 对象,服务器关闭了 ServletContext 对象被销毁。

注:谨慎使用 ServletContext 对象存放数据,因为共享范围太多,数据不安全;另外 ServletContext 对象存活周期太长,存放数据过多,会对服务器内存造成压力。

获取文件在服务器主机的物理路径

方法:getRealPath(String path)

调用 ServletContext 对象的 getRealPath(String path) 方法可以获取指定文件在服务器主机的实际路径。实际这个方法只是在你给定的路径(也叫逻辑路径)前面加上项目的根目录路径而已。例如,我的项目的根目录路径是 /Users/liaowenxiong/Documents/IdeaProjects/java-exercises/out/artifacts/servlet_demo_war_exploded,如果你给定的路径 /WEB-INF/classes/druid.properties,那么会返回给你 /Users/liaowenxiong/Documents/IdeaProjects/java-exercises/out/artifacts/servlet_demo_war_exploded/WEB-INF/classes/druid.properties,如果你给定的路径是 druid.properties,那么会返回给你 /Users/liaowenxiong/Documents/IdeaProjects/java-exercises/out/artifacts/servlet_demo_war_exploded/druid.properties

注意: 1.文件在 src 目录下或者 resources 目录下(maven工程),getRealPath(String path) 中的 path 你要写成 /WEB-INF/classes/文件名 2.文件在 web 目录下或者 webapp 目录下,你要写成 /文件名 3.文件在 WEB-INF 目录下,你要写成 /WEB-INF/文件名

另外一种获取文件真实路径的方式:

// 通过类加载器获取文件的真实路径
URL url = ServletContextDemo02.class.getClassLoader().getResource("/druid.properties"); // 也可以去掉斜杆
String path = url.getPath();
System.out.println(path);

特别注意:getResource(String name),中 name 是文件的名称,文件只能在 src 目录或者 resources 目录下,其它位置下的文件无法识别到。

获取全局级别的初始化参数

step1 在 web.xml 中,使用 配置的参数,可以被所有的 Servlet 共享。

在这里插入图片描述

step2

通过 ServletContext 获取全局参数的值:

ServletContext servletContext = getServletContext();
String version = servletContext.getInitParameter("version");
获取临时目录

可以把客户端上传的文件缓存在这个临时目录下,这个目录下的数据容器会自动清理掉。

File file0 = (File) sctx.getAttribute("javax.servlet.context.tempdir");
System.out.println(file0);
关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0539s