JavaWeb篇_12——ServletContext对象

ServletContext对象

ServletContext对象介绍

ServletContext官方叫Servlet上下文。服务器会为每一个Web应用创建一个ServletContext对象。这个对象全局唯一,而且Web应用中的所有Servlet都共享这个对象。所以叫全局应用程序共享对象。

ServletContext对象的作用

  • 相对路径转绝对路径
  • 获取容器的附加信息
  • 读取配置信息
  • 全局容器
相对路径转绝对路径

context.getRealPath("path")

该方法可以将一个相对路径转换为绝对路径,在文件上传与下载时需要用到该方法做路径的转换。

java 复制代码
   	//获取ServletContext对象
       ServletContext servletContext = this.getServletContext();
       //转换路径
       String realPath = servletContext.getRealPath("image.PNG");
       File file=new File(realPath);
获取容器的附加信息

servletContext.getServerInfo()

返回Servlet容器的名称和版本号

servletContext.getMajorVersion()

返回Servlet容器所支持Servlet的主版本号。

servletContext.getMinorVersion()

返回Servlet容器所支持Servlet的副版本号。

java 复制代码
public class GetBaseInfoServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req, resp);
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取ServletContext对象
       ServletContext servletContext = this.getServletContext();
       //获取容器的基本信息
       String serverInfo = servletContext.getServerInfo();
       //获取容器所支持的主版本号
       int majorVersion = servletContext.getMajorVersion();
       //获取容器所支持的副版本号
       int minorVersion = servletContext.getMinorVersion();
       //设置响应编码
       resp.setContentType("text/plain;charset=utf-8");
       PrintWriter pw = resp.getWriter();
       pw.println("容器的基本信息:"+serverInfo);
       pw.println("容器所支持Servlet的版本号为:"+majorVersion+"."+minorVersion);
   }
}
xml 复制代码
    <servlet>
        <servlet-name>getBaseInfoServlet</servlet-name>
        <servlet-class>com.java.GetBaseInfoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getBaseInfoServlet</servlet-name>
        <url-pattern>/getBaseInfo.do</url-pattern>
    </servlet-mapping>
获取web.xml文件中的信息
xml 复制代码
<context-param>
  <param-name>key</param-name>
  <param-value>value</param-value>
</context-param>

servletContext.getInitParameter("key")

该方法可以读取web.xml文件中标签中的配置信息。

servletContext.getInitParameterNames()

该方法可以读取web.xml文件中所有param-name标签中的值。

xml 复制代码
    <context-param>
        <param-name>key1</param-name>
        <param-value>java1</param-value>
    </context-param>

    <context-param>
        <param-name>key2</param-name>
        <param-value>java2</param-value>
    </context-param>
java 复制代码
public class ContextReadInfoServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req, resp);
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取ServletContext对象
       ServletContext servletContext = this.getServletContext();
       //获取所有的<param-name>的值
       Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
       PrintWriter pw = resp.getWriter();
       while (initParameterNames.hasMoreElements()){
           String name = initParameterNames.nextElement();
           String value = servletContext.getInitParameter(name);
           pw.println("name:"+name+" = value:"+value);
       }
       pw.flush();
       pw.close();
   }
}
xml 复制代码
	<servlet>
        <servlet-name>contextReadInfoServlet</servlet-name>
        <servlet-class>com.java.ContextReadInfoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>contextReadInfoServlet</servlet-name>
        <url-pattern>/readInfo.do</url-pattern>
    </servlet-mapping>
    
全局容器

servletContext.setAttribute("key",ObjectValue)

向全局容器中存放数据。

servletContext.getAttribute("key")

从全局容器中获取数据。

servletContext.removeAttribute("key")

根据key删除全局容器中的value。

java 复制代码
public class GlobalContainerServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取ServletContext对象
       ServletContext servletContext = this.getServletContext();
       String s1 = (String) servletContext.getAttribute("key1");
       String s2 = (String)servletContext.getAttribute("key2");
       PrintWriter pw=resp.getWriter();
       pw.println(s1);
       pw.println(s2);
       pw.flush();
       pw.close();
   }

   @Override
   public void init() throws ServletException {
       //获取ServletContext对象
       ServletContext servletContext = this.getServletContext();
       servletContext.setAttribute("key1","java1");
       servletContext.setAttribute("key2","java2");
   }
}

ServletContext对象生命周期

​ 当容器启动时会创建ServletContext对象并一直缓存该对象,直到容器关闭后该对象生命周期结束。ServletContext对象的生命周期非常长,所以在使用全局容器时不建议存放业务数据。

相关推荐
東雪木11 分钟前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
adrninistrat0r15 分钟前
Java调用链MCP分析工具
java·python·ai编程
噜噜噜阿鲁~1 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
春生野草1 小时前
反射、Tomcat执行
java·开发语言
_日拱一卒2 小时前
LeetCode:207课程表
java·数据结构·算法·leetcode·职场和发展
飞翔中文网2 小时前
Java学习笔记之抽象类与接口(设计思想)
java·笔记·学习
qcx232 小时前
【系统学AI】09 Multi-Agent架构(2026版):从学术理论到工业级实践
java·人工智能·架构·multi-agent·claude agent
半旧夜夏3 小时前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
云烟成雨TD4 小时前
Spring AI 1.x 系列【33】RAG Advisor 组件与四大分层架构
java·人工智能·spring
江南十四行5 小时前
并发编程(七)
java