zoukankan      html  css  js  c++  java
  • JavaWeb 之 ServletContext 接口

    一、ServletContext 接口

      1、ServletContext 是什么

        (1)ServletContext 是一个接口,它表示 Servlet 上下文对象(可以和程序的容器(服务器)来通信);

        (2)一个 web 工程, 只有一个 ServletContext 对象实例;

        (3)ServletContext 对象是一个域对象;

        (4)ServletContext 是在 web 工程部署启动的时候创建。 在 web 工程停止的时候销毁

      2、域对象

        域对象:就是类似于 Map,可以在里面存取数据,叫域对象。

        域对象的范围:指的是存取数据的操作范围。

        ServletContext 范围:整个 Web 工程。

          存数据      取数据      删除数据

    Map    put()         get()         remove()

    域对象   setAttribute()     getAttribute()    removeAttribute()

    二、获取 ServletContext 对象

      1、通过 ServletConfig 对象获取

    ServletContext servletContext = getServletConfig().getServletContext();
    

      

      2、通过 getServletContext() 方法获取

    ServletContext servletContext = getServletContext();
    

        直接调用该方法,其实是调用了 GenericServlet 类中的方法,其本质还是通过 ServletConfig 对象获取的。

        

      3、通过 ServletRequest 及其子类获取

        在 ServletRequest 接口中包含了一个抽象方法来获取 ServletContext:

    public ServletContext getServletContext();
    

           HttpServletRequest 接口继承了ServletRequest 接口,其中也就包含了这个方法:

     1     @Override
     2     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
     3         System.out.println("Hello Servlet被访问了");
     4         ServletContext servletContext = req.getServletContext();
     5         System.out.println("servletContext = " + servletContext);
     6     }
     7 
     8     @Override
     9     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10         super.doPost(req, resp);
    11         ServletContext servletContext = req.getServletContext();
    12         System.out.println("servletContext = " + servletContext);
    13     }

    三、ServletContext 的常用作用

      1、常用作用

        (1)获取 web.xml 中配置的上下文参数 context-param

        (2)获取当前的工程路径,格式:/工程路径

        (3)获取工程部署后在服务器硬盘上的绝对路径

        (4)像 Map 一样存取数据

      2、案例

        (1)读取 context-param 参数

          在 web.xml 中配置 context-param

     1     <!--context-param 是上下文参数(它属于整个 web 工程)-->
     2     <context-param>
     3         <param-name>username</param-name>
     4         <param-value>context</param-value>
     5     </context-param>
     6     <!--context-param 是上下文参数(它属于整个 web 工程)-->
     7     <context-param>
     8         <param-name>password</param-name>
     9         <param-value>root</param-value>
    10     </context-param>

        注意

          ① <context-param> 标签要书写在 <web-app> 里面,<servlet>的外面;

          ② 这里配置的参数是为整个 web 工程配置的,对所有的 servlet 都有效;而之前 <init-param> 为某一个servlet单独配置的,注意区分;

     1    @Override
     2     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     3         ServletContext servletContext = getServletContext();
     4         System.out.println(servletContext);
     5 
     6         //1.获取 context-param 是上下文参数
     7         String username = servletContext.getInitParameter("username");
     8         System.out.println("username = " + username);
     9         String password = servletContext.getInitParameter("password");
    10         System.out.println("password = " + password);
    11 
    12         Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
    13         while (initParameterNames.hasMoreElements()) {
    14             String key = initParameterNames.nextElement();
    15             System.out.println(key + "=" + servletContext.getInitParameter(key));
    16         }
    17   }

        (2)获取当前的工程路径(虚拟路径):格式:/工程路径

           获取当前工程的路径(虚拟路径),格式:/工程路径

    String contextPath = getServletContext().getContextPath();
    

        (3)获取工程部署后在服务器硬盘上的绝对路径(真实路径)

          获取工程绝对路径(真实路径)

    String realPath = getServletContext().getRealPath("/");
    

          Demo:

     1 // 获取工程部署后在服务器硬盘上的绝对路径(真实路径)
     2 /**
     3 * / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA/eclipse 代码的 web 目录
     4 */
     5 System.out.println("工程部署的路径是:" + context.getRealPath("/"));
     6 System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
     7 System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
     8 
     9 String b = context.getRealPath("/b.txt");//web目录下资源访问
    10 String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
    11 String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问

        (4)作为域对象,像Map一样存取数据

    (1)setAttribute(String name,Object value);   存储数据
    
    (2)getAttribute(String name);   获取数据
    
    (3)removeAttribute(String name);  移除数据
    

          ServletContext 对象范围:所有用户所有请求的数据(谨慎使用)

        (5)获取MIME类型

          MIME 类型:在互联网通信过程中定义的一种文件数据类型。

          格式:

    大类型/小类型;   如:text/html、image/jpeg 等
    

           获取一个文件的 MIME 类型:

    String mimeType = getServletContext().getMimeType(String fileName);
    

      

        代码测试:

          HelloServlet5:

     1     @Override
     2     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     3         ServletContext servletContext = getServletContext();
     4         System.out.println(servletContext);
     5 
     6         //1.获取 context-param 是上下文参数
     7         String username = servletContext.getInitParameter("username");
     8         System.out.println("username = " + username);
     9         String password = servletContext.getInitParameter("password");
    10         System.out.println("password = " + password);
    11 
    12         Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
    13         while (initParameterNames.hasMoreElements()) {
    14             String key = initParameterNames.nextElement();
    15             System.out.println(key + "=" + servletContext.getInitParameter(key));
    16         }
    17 
    18         //2. 获取当前的工程路径, 格式: /工程路径
    19         String contextPath = servletContext.getContextPath();
    20         System.out.println("当前工程路径 contextPath = " + contextPath);
    21 
    22         //3. 获取工程部署后在服务器硬盘上的绝对路径
    23         /**
    24          * / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录<br/>
    25          */
    26         System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
    27         System.out.println("工程下 css 目录的绝对路径是:" + servletContext.getRealPath("/css"));
    28         System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + servletContext.getRealPath("/imgs/1.jpg"));
    29 
    30         //4.像 Map 一样存取数据
    31         System.out.println(servletContext);
    32         System.out.println("保存之前: Context1 获取 key1 的值是:"+ servletContext.getAttribute("key1"));
    33         servletContext.setAttribute("key1", "value1");
    34         System.out.println("Context1 中获取域数据 key1 的值是:"+ servletContext.getAttribute("key1"));
    35     }

          HelloServlet6:

     1     @Override
     2     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     3         System.out.println("-----------------------------");
     4         ServletContext servletContext = getServletContext();
     5         System.out.println(servletContext);
     6 
     7         //1.获取 context-param 是上下文参数
     8         String username = servletContext.getInitParameter("username");
     9         System.out.println("username = " + username);
    10         String password = servletContext.getInitParameter("password");
    11         System.out.println("password = " + password);
    12 
    13         Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
    14         while (initParameterNames.hasMoreElements()) {
    15             String key = initParameterNames.nextElement();
    16             System.out.println(key + "=" + servletContext.getInitParameter(key));
    17         }
    18 
    19 
    20         System.out.println("Context2 中获取域数据 key1 的值是:"+ servletContext.getAttribute("key1"));
    21     }

      运行结果:

  • 相关阅读:
    SHT20 IIC 寄存器概述
    代理技术简介
    Spring基于注解配置AOP
    Spring基于XML配置AOP
    如何在国内下载Eclipse及其插件
    Spring AOP理解
    idea个人配置记录
    使用Gradle自动创建Java项目结构
    Spring使用外部属性文件
    Web程序员开发App系列
  • 原文地址:https://www.cnblogs.com/niujifei/p/15107857.html
Copyright © 2011-2022 走看看