💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # ServletContext **全局上下文** ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象 内部封装是该web应用的信息,ServletContext对象一个web应用只有一个 代表: 服务器在启动时,会为每个部署的项目创建唯一的一个对象,代表整个应用的web.xml配置文件,所有的Servlet获取到的都是同一个全局上下文对象 ## 生命周期 创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状态)) 销毁:web应用被卸载(服务器关闭,移除该web应用) ## 获取 ~~~ ServletContext context = servletConfig.getServletContext(); 或者 ServletContext context = getServletContext(); ~~~ ## 作用 1. 获取上下文路径context.getContextPath() 2. 获取文件的真实路径 虚拟路径: url 真实路径: 文件全路径(文件上传下载时使用) 3. 作为整个web应用的最大域对象,在项目中共享数据 context.getAttribute context.setAttribute 4. 获取全局上下文的配置参数 5. 获取MIME类型 `String getMimeType(String file)` ## 示例 ~~~ <!-- 给全局上下文配置初始化参数,写在web.xml标签内 --> <context-param> <param-name>name</param-name> <param-value>xjd</param-value> </context-param> </web-app> ~~~ ~~~ public void init(ServletConfig servletConfig) throws ServletException { //获取全局上下文 ServletContext context = servletConfig.getServletContext(); System.out.println(context); //获取上下文路径,带/,就是8080/这边 System.out.println(context.getContextPath()); //获取文件的真实路径,编译后的 System.out.println(context.getRealPath("1.html")); //获取全局初始化参数 System.out.println(context.getInitParameter("name")); } ~~~ 获得web应用中任何资源的绝对路径 方法:`String path = context.getRealPath(相对于该web应用的相对地址);` ~~~ //获得ServletContext对象 ServletContext context = getServletContext(); //1. 获得a b c d.txt的绝对路径 //1.1 获得a.txt String realPath_A = context.getRealPath("a.txt"); System.out.println(realPath_A); //1.2 获得b.txt String realPath_B = context.getRealPath("WEB-INF/b.txt"); System.out.println(realPath_B); //1.3 获得c.txt String realPath_C = context.getRealPath("WEB-INF/classes/c.txt"); System.out.println(realPath_C); //在读取src(classes) 下的资源是可以同类加载器----专门加载classes 下的文件的 //getResource() 参数是一个相对地址 相对classes //ContextServlet是我这个文件的类名,换成自己类的名字就行 String path = ContextServlet.class.getClassLoader().getResource("c.txt").getPath(); System.out.println(path); //2. 域对象---向servletContext中存数据,小的向大的存,大的不能向小的存 context.setAttribute("name", "zhangsan"); ~~~ ## 域对象 ServletContext是一个域对象 什么是域对象?什么是域? 存储数据的区域就是域对象 ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向Servletcontext域中存取数据,数据可以共享) 域对象的通用的方法 ~~~ setAtrribute(String name,Object obj); getAttribute(String name); removeAttribute(String name); ~~~ ## 读取文件的数据 若UserDao类中的update()方法为: ~~~ public void update() throws IOException { // 以下代码虽然可以读取到资源文件的数据,但是无法获取更新后的数据。 Properties dbconfig = new Properties(); InputStream in = UserDao.class.getClassLoader().getResourceAsStream("db.properties"); dbconfig.load(in); System.out.println(dbconfig.getProperty("url")); } ~~~ 以上代码虽然可以读取到资源文件的数据,但是无法获取更新后的数据,即此时修改资源文件db.properties中的内容,但读取不到最新的内容。这一般不是我们所希望的,那么怎么解决这个问题呢? 解决办法:通过类装载的方式得到资源文件的位置,再通过传统方式读取资源文件的数据,这样就可以读取到更新后的数据。代码如下: ~~~ public void update() throws IOException { // 通过类装载的方式得到资源文件的位置,再通过传统方式读取资源文件的数据,这样就可以读取到更新后的数据。 String path = UserDao.class.getClassLoader().getResource("db.properties").getPath(); FileInputStream in = new FileInputStream(path); Properties dbconfig = new Properties(); dbconfig.load(in); System.out.println(dbconfig.getProperty("url")); } ~~~ 总结: 如果读取资源文件的程序不是Servlet的话,就只能通过类装载器去读了。而通过类装载器去读取资源文件需要注意两个问题: * 资源文件不能太大!!! * **通过类装载的方式去读,采用类装载的方式去读文件,经常读不到更新后的数据** # 注意 ServletContext对象会被所有的web资源所共享,通过它来带数据,会出现数据紊乱的现象。在实际开发里面,不能通过context域,要通过request域