ServletContext和ServletConfig使用说明

简介: ServletContext和ServletConfig使用说明

       通过前面知识点的学习,我们对于请求的处理已经可以说比较灵活了,但是还不够。我们再介绍两个重要的对象 ServletContext 对象和 ServletConfig 对象

ServletContext 对象:

问题:Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?


解决:使用 ServletContext 对象


作用:解决了不同用户的数据共享问题原理:ServletContext 对象由服务器进行创建,一个项目只有一个对 象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。


特点:服务器进行创建用户共享一个项目只有一个


生命周期:服务器启动到服务器关闭


作用域:项目内


使用:


1.获取 ServletContext 对象


2.使用作用域进行共享数据流转


3.获取 web.xml 中的全局配置


4.获取 webroot 下项目资源流对象


5.获取 webroot 下资源绝对路径


TestServlectContextA:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * ServletContext对象:
 *  作用:
 *    解决了不同用户之间的数据共享问题
 *  使用:
 *    创建ServletContext对象
 *        ServletContext sc1 = this.getServletContext();
        ServletContext sc2 =this.getServletConfig().getServletContext();
        ServletContext sc3=req.getSession().getServletContext();
    存储用户共享数据
      sc.setAttribute(String name,Object value);
    获取用户共享数据
      sc.getAttribute(String name);
    删除共享数据
      sc.removeAttribute(String name);
    获取web.xml中的全局配置属性,作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。
      sc.getInitParameter(String name);注意返回的是String类型数据
    获取webRoot下的资源流对象
      sc.getResourceAsStream(String path);
      注意:
        path为相对路径,写从webRoot开始查找资源的路径即可。
    获取webRoot下的资源绝对路径
      sc.getRealPath(String path);
      注意:
        path为相对路径,写从webRoot开始查找资源的路径即可。
 *  特点:
 *    服务器创建
 *    所有用户共享
 *  生命周期:
 *    服务器开启到服务器关闭
 * @author MyPC
 */
public class TestServlectContextA extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    //设置请求编码格式
    req.setCharacterEncoding("utf-8");
    //设置响应编码格式
    resp.setContentType("text/html;charset=utf-8");
    //获取请求信息
    //处理请求信息
      String str="我是用户共享数据";
      //获取ServletContext对象
        ServletContext sc1 = this.getServletContext();
        ServletContext sc2 =this.getServletConfig().getServletContext();
        ServletContext sc3=req.getSession().getServletContext();
        System.out.println(sc1==sc2);
        System.out.println(sc2==sc3);
      //存储用户共享数据到ServletContext中
        sc1.setAttribute("str", str);
      //获取web.xml中的全局配置属性
        String f=sc1.getInitParameter("flag");
        if("false".equals(f)){
          System.out.println("TestServlectContextA.service(关闭***资源)");
        }else{
          System.out.println("TestServlectContextA.service(打开***资源)");
        }
      //获取webRoot下资源的流对象
        //File f2=new File("D:\\apache-tomcat-7.0.56\\webapps\\sc\\image");
        InputStream resourceAsStream = sc1.getResourceAsStream("image/s.png");
      //获取WebRoot下资源的绝对路径
        String path=sc1.getRealPath("image/s.png");
        System.out.println(path);
    //响应处理结果
      //直接响应
        resp.getWriter().write("数据已经在ServletContext中存储完毕");
      //请求转发
      //重定向
  }
}

TestServletContextB:

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public  class TestServletContextB extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    //设置请求编码格式
    req.setCharacterEncoding("utf-8");
    //设置响应编码格式
    resp.setContentType("text/html;charset=utf-8");
    //获取请求信息
      //获取ServletContext对象
      ServletContext sc = this.getServletContext();
      //获取共享数据
      String s=(String) sc.getAttribute("str");
    //处理请求信息
      System.out.println("TestServletContextB.service()"+s);
    //响应处理结果
      //直接响应
      //请求转发
      //重定向
  }
}

案例:网页浏览器次数统计

ServletConfig 对象:

问题:使用 ServletContext 对象可以获取 web.xml 中的全局配置文件,在 web.xml 中每个 Servlet 也可以进行单独的配置,那么该怎么获取配置信息呢?

解决:使用 ServletConfig对象


作用:ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信息。


使用:


1.获取 ServletConfig 对象


2.获取 web.xml 中 servlet 的配置信息

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServletConfig extends HttpServlet {
  @Override 
  protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    //获取ServletConfig对象
      ServletConfig sg = this.getServletConfig();
    //设置请求编码格式
      req.setCharacterEncoding(sg.getInitParameter("code"));
    //设置响应编码格式
      resp.setContentType("text/html;charset=utf-8");
    //获取请求信息
      //获取web.xml中的属性配置
      String flag = sg.getInitParameter("flag");
      System.out.println(flag);
      //获取用户请求信息
      String uname=req.getParameter("uname");
    //处理请求信息
      System.out.println(uname);
    //响应处理结果
  }
}


目录
相关文章
|
人工智能 自然语言处理 物联网
AI Safeguard联合 CMU,斯坦福提出端侧多模态小模型
随着人工智能的快速发展,多模态大模型(MLLMs)在计算机视觉、自然语言处理和多模态任务中扮演着重要角色。
283 0
|
存储 缓存 Linux
在 CentOS 7 上释放磁盘空间的简单方法
【10月更文挑战第28天】
1569 2
在 CentOS 7 上释放磁盘空间的简单方法
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
安全 Linux Shell
OverTheWire Bandit 通关解析(中)
OverTheWire Bandit 通关解析(中)
|
存储 分布式计算 Hadoop
手把手教你使用OSS-HDFS服务平替自建HDFS
本文主要介绍了OSS-HDFS服务以及使用OSS-HDFS服务平替自建HDFS。
131120 21
|
Prometheus 监控 Cloud Native
JVM工作原理与实战(三十三):监控GC过程的工具
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了jstat工具、VisualVM插件、Prometheus + Grafana、GC日志等内容。
613 0
|
存储 安全 异构计算
阿里云服务器2核4G、4核8G、8核16G配置最新收费标准及活动价格参考
2核4G、4核8G、8核16G配置的云服务器处理器与内存比为1:2,阿里云个人和普通企业用户在购买云服务器时通常比较喜欢选择2核4G、8核16G、4核8G等配置,这些配置既能满足各种图文类中小型网站和应用又能满足企业网站应用、批量计算、中小型数据库系统等场景,2核4G配置适合新手入门或初创企业,4核8G与8核16G兼具成本与性能优势,适合通用场景,本文介绍这些配置的最新购买价格,包含原价收费标准和最新活动价格。
1283 0
阿里云服务器2核4G、4核8G、8核16G配置最新收费标准及活动价格参考
Qt之QSpinBox和QDoubleSpinBox
简述 QSpinBox和QDoubleSpinBox均派生自QAbstractSpinBox。 QSpinBox旨在处理整数和离散值(例如:月份名称),QDoubleSpinBox则用于处理浮点值。他们之间的区别就是处理数据的类型不同,其他功能都基本相同。 QDoubleSpinBox的默认的精度是2位小数,但可以通过setDecimals()来改变。 下面主要以QS
2311 0
|
8天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1400 10

热门文章

最新文章