ServletContext

ServletContext

  • 怎么获取 ServletContext 对象呢?

    • 第一种方式:通过 ServletConfig 对象获取 ServletContext 对象。

      config.getServletContext()
      
    • 第二种方式:实际上获取一个 ServletContext 对象,可以不用获取 ServletConfig 对象。直接通过 this 也可以。

      this.getServletContext()
      
  • ServletContext 是什么?

    • ServletContext 是接口,是 Servlet 规范中的一员。
  • ServletContext 是谁实现的?

    • Tomcat 服务器实现了 ServletContext 接口。
  • ServletContext 对象是谁创建的?在什么时候创建的?

    • ServletContext 对象在 WEB 服务器启动的时候创建。
    • ServletContext 对象是 WEB 服务器创建的。
    • 对于一个 webapp 来说,ServletContext 对象只有一个。
    • ServletContext 对象在服务器关闭的时候销毁。
  • ServletContext 怎么理解?

    • Servlet 对象的上下文(环境)对象。
    • ServletContext 对象其实对应的就是 web.xml 文件。
  • ServletContext 接口中有哪些常用的方法?

    • 在 web.xml 文件的 <context-param></context-param> 标签中配置上下文初始化信息。

      • <context-param>
            <param-name>pageSize</param-name>
                <param-value>10</param-value>
        </context-param>
        
    • 通过 ServletContext 对象的两个方法,可以获取到 web.xml 文件中的初始化参数配置信息。

      • 以上的配置信息属于应用级的配置信息,一般一个项目中共享的配置信息会放到以上的标签当中

      • // 获取 key
        java.util.Enumeration<java.lang.String>	getInitParameterNames()
        // 通过 key 获取 value
        java.lang.String	getInitParameter(java.lang.String name)
        
    • 获取应用上下文的根(非常重要),因为在 Java 源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径。

      • java.lang.String	getContextPath()
        
    • 获取文件的绝对路径。

      • java.lang.String	getRealPath(java.lang.String path)
        
    • 通过 ServletContext 对象也是可以记录日志的。

      • void	log(java.lang.String msg)	
        void	log(java.lang.String message, java.lang.Throwable throwable)
        
      • 这些日志信息记录到哪里了?

        • 记录到 localhost.2021-11-05.log
      • Tomcat 服务器的 logs 目录下有哪些日志文件?

        • IDEA 中日志路径:C:\Users\ShiYingZhang\AppData\Local\JetBrains\IntelliJIdea2022.3\tomcat

        • 在这里插入图片描述

        • localhost.2021-11-05.log // ServletContext 对象的 log 方法记录的日志信息存储到这个文件中。
          
  • ServletContext 对象还有另一个名字:应用域。

    • 如果所有用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,可以将这些数据放到 ServletContext 这个应用域中。

    • 为什么是所有用户共享的数据?

      • 因为 ServletContext 这个对象只有一个,只有共享的数据放进去才有意义。
    • 为什么数据量要小?

      • 因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。
    • 为什么这些共享数据很少的修改,或者说几乎不修改?

      • 所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所需带来的安全问题。
    • 存 怎么向 ServletContext 应用域中存数据?

      • void	setAttribute(java.lang.String name, java.lang.Object object)
        
    • 取 怎么从 ServletContext 应用域中取数据?

      • java.lang.Object	getAttribute(java.lang.String name)
        
    • 删 怎么删除 ServletContext 应用域中的数据?

      • void	removeAttribute(java.lang.String name)
        
  • 注意:以后我们编写 Servlet 类的时候,实际上是不会直接继承 GenericServlet 类的,因为我们是 B/S 结构的系统,这种系统是基于 HTTP 超文本传输协议的,在 Servlet 规范当中,提供了一个类叫做 HttpServlet,它是专们门为HTTP 协议准备的一个 Servlet 类i,我们编写的 Servlet 要继承 HttpServlet。

    • jakarta.servlet.Servlet(接口)
      jakarta.servlet.GenericServlet(抽象类)
      jakarta.servlet.http.HttpServlet(抽象类)
      
  • 大家到目前为止都接触过哪些缓存机制了?

    • 堆内存当中的字符串常量池
      • “abc” 先在字符串常量池中查找,如果有,直接拿来用。如果没有则新建,然后再放入字符串常量池。
    • 堆内存当中的整数型常量池
      • [-128~127] 一共 256 Integer 类型的引用,放在整数常量池中。没有超出这个范围的话,直接从常量池中取。
    • 连接池
      • 这里所说的连接池中的连接时 Java 语言连接数据库的连接对象:java.sql.connection 对象
    • 线程池
      • Tomcat 服务器本身就是支持多线程的。
      • Tomcat 服务器是在用户发送一次请求,就新建一个 Thread 线程对象吗?
        • 当然不是,实际上是 Tomcat服务器启动的时候,会先创建好 N 多个线程 Thread 对象,然后将线程对象放到集合当中,称为线程池。
    • redis
      • NoSQL 数据库。非关系型数据库。缓存数据库。
    • 向 ServletContext 应用域中存储数据,也等于是将数据存放到缓存 cache 当中了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值