Loading

javaweb中的servletContext 对象

什么是ServletContext

在Tomcat服务器中的web的项目 也叫做WEB应用程序。在java中 万物皆对象,那么,应用程序也是对象。

在Java Web开发中,使用ServletContext对象表示WEB应用程序。

说明:

  1. 在一个WEB应用程序中,只能存在一个ServletContext对象。
  2. 每个应用程序,都有它自己所对应的一个ServletContext对象。
  3. 在服务器启动的时候,为每个web应用程序创建一个单独的ServletContext对象。
  4. ServletContext是接口, 此接口的实现类是tomcat引擎提供

ServletContext对象的作用

  • 获取WEB应用程序的初始化参数
    **- 获取WEB应用程序下任意资源的绝对路径
  • ServletContext作为域对象,存储数据**

如何获取ServletContext对象

一个web应用程序只有一个ServletContext对象

  • 方式1:通过ServletConfig接口获取,它提供了方法 getServletContext()

    public interface ServletConfig {
        ServletContext getServletContext();
        
    }
    
  • 方式2:通过继承的HttpServlet类的父类GenericServlet获取, GenericServlet类 提供了方法 getServletContext(),下面是源码分析

    class Context1Servlet extends HttpServlet {}
                            ↓
                            ↓
    public abstract class HttpServlet extends GenericServlet{}
                            ↓
                            ↓
    public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
        //用transient关键字标记的成员变量不参与序列化过程。
        private transient ServletConfig config;
        
        public ServletConfig getServletConfig() {
            return this.config;
        }
        
        public ServletContext getServletContext() {
            return this.getServletConfig().getServletContext();
        }
        //省略其他
    }
    
  • 代码演示

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //方式1:通过ServletConfig对象获取,它提供了方法 getServletContext()
        ServletConfig config = super.getServletConfig();
        ServletContext servletContext = config.getServletContext();
        System.out.println("servletContext = "+servletContext);
    
        //方式2:通过继承的HttpServlet类的父类GenericServlet获取, GenericServlet类 提供了方法 getServletContext()
        ServletContext servletContext2 = super.getServletContext();
        System.out.println("servletContext2 = "+servletContext2);
    
    }
    

作用一:获取WEB应用程序的初始化参数(已经不常用了)

因为一个web应用程序只有一个ServletContext对象,所以这个对象对整个应用程序的相关内容都是了解的

  • web.xml 配置WEB应用程序的初始化参数
<!-- 配置的是WEB程序的初始化参数-->
<context-param>
    <param-name>heima</param-name>
    <param-value>java</param-value>
</context-param>
  • API操作
方法 返回值 描述
getInitParameter(String name) String 获取web应用程序的初始化参数
  • 代码演示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * 获取ServletContext对象
     * 父类的方法
     * org.apache.catalina.core.ApplicationContextFacade实现接口ServletContext
     */
    ServletContext context = getServletContext();
    System.out.println(context);
    //context对象,获取配置文件中的初始化参数
    String value = context.getInitParameter("heima");
    System.out.println(value);
}

作用二:获取WEB应用程序下任意资源的绝对路径

方法 返回值 描述
getRealPath(String path) String 接收一个资源的相对路径,返回真实路径(完整路径)的字符串
  • 获取web目录下的a.txt绝对路径
  • 获取web目下WEB-INF目录下的b.txt绝对路径
  • 获取src目录下的c.txt绝对路径
  • 获取web02 module下的d.txt绝对路径,获取不到

在这里插入图片描述

代码演示:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取servletContext对象
    ServletContext servletContext = super.getServletContext();
    //获取web目录下的a.txt绝对路径
    String apath = servletContext.getRealPath("a.txt");
    System.out.println("apath = " + apath);
    //获取web目录下WEB-INF目录下的b.txt绝对路径
    String bpath = servletContext.getRealPath("WEB-INF/b.txt");
    System.out.println("bpath = " + bpath);
    //获取src目录下的c.txt绝对路径
    String cpath = servletContext.getRealPath("WEB-INF/classes/c.txt");
    System.out.println("cpath = " + cpath);
}

作用三:ServletContext作为域对象

ServletContext是在服务器启动的时候为每个web项目 单独创建一个ServletContext对象。
当web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。
向ServletContext中保存的数据一直存在
(当服务器关闭的时候ServletContext对象被销毁,然后里面数据才会失效)。

  • ServletContext作用范围:整个web应用。
方法 返回值 描述
setAttribute(String key, Object value) void 向域对象存储数据
getAttribute(String key) Object 取出域对象数据
removeAttribute(String key) void 移除域对象数据

代码演示:

第一个Servlet(设置值):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取servletcontext对象
    ServletContext context = super.getServletContext();
    //存储数据 heima=java
    context.setAttribute("language","java");
    //读取数据 heima的值
    Object value = context.getAttribute("language");
    System.out.println("Context4Servlet language= " + value);
}

第二个Servlet(获取值):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取ServletContext域对象
    ServletContext context = super.getServletContext();
    //获取域对象中 指定键的值
    Object value = context.getAttribute("language");
    System.out.println("Context5Servlet language= " + value);
}
posted @ 2021-03-25 22:18  克豪  阅读(126)  评论(0)    收藏  举报