在正式讲解之前,先让大家有一个整体印象。
之前讲过ServletConfig,我发现他们有两个共同的方法,我对他们的区别做了小小的总结

JavaWeb系列的其他教程,持续更新中

JavaWeb系列教程
JavaWeb—Servlet
模拟Servlet本质
使用IDEA开发Servlet程序
Servlet对象的生命周期
适配器(GenericServlet)改造Servlet
ServletConfig
Servlet–ServletContext
HTTP协议,get和post的区别
web站点欢迎页
一篇学会HttpServletRequest

上面的思维导图是对下面内容的总结,大家可以先看看,对等会的内容有一个大概印象,看完后,可以再回头看看这个思维导图。

如果大家觉得有帮助的话,不妨动动小手,点赞收藏一波,也方便后面的复习哈

ServletContext是什么

  • ServletContext是一个接口,是Servlet规范中的一员,

  • ServletContext对象的创建也是Tomcat服务器来完成的。启动webapp的时候创建的。

  • ServletContext是谁实现的

    Tomcat服务器(WEB服务器)实现了ServletContext接口
    public class org.apache.catalina.core.ApplicationContextFacade implements ServletContext{}

  • Servlet对象是谁创建的,在什么时候创建的

ServletContext对象是WEB服务器启动的时候创建的
ServletContext对象是WEB服务器创建的

ServletContext的生命周期

  • 对于一个WEBAPP来说,ServletContext对象只有一个

  • 一个web应用对应一个ServletContext实例,这个实例是应用部署启动后,servlet容器为应用创建的。

  • ServletContext对象在服务器关闭的时候销毁

    • 一个Servlet对象对应一个ServletConfig。100个Servlet对象则对应100个ServletConfig对象。
  • 只要在同一个webapp当中,只要在同一个应用当中,所有的Servlet对象都是共享同一个ServletContext对象的。

  • ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。ServletContext对象是应用级对象。

  • Tomcat服务器中有一个webapps,这个webapps下可以存放webapp,可以存放多个webapp,假设有100个webapp,那么就有100个ServletContext对象。但是,总之,一个应用,一个webapp肯定是只有一个ServletContext对象。
    接下来,通过程序验证一下

        ServletContext servletContext = this.getServletContext();response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print("ServletContext对象:"+servletContext+"<br>");

一个webapp应用共享一个ServletContext对象

        ServletContext servletContext = this.getServletContext();response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print("ServletContext对象:"+servletContext+"<br>");



  • ServletContext被称为Servlet上下文对象。(Servlet对象的四周环境对象。)

  • 一个ServletContext对象通常对应的是一个web.xml文件。

  • ServletContext对应显示生活中的什么例子呢?

    • 一个教室里有多个学生,那么每一个学生就是一个Servlet,这些学生都在同一个教室当中,那么我们可以把这个教室叫做ServletContext对象。那么也就是说放在这个ServletContext对象(环境)当中的数据,在同一个教室当中,物品都是共享的。比如:教室中有一个空调,所有的学生都可以操作。可见,空调是共享的。因为空调放在教室当中。教室就是ServletContext对象。

    • Tomcat是一个容器,一个容器可以放多个webapp,一个webapp对应一个ServletContext对象

    • ServletContext接口中常用的方法

public String getInitParameter(String name); // 通过初始化参数的name获取value
public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
        ServletContext servletContext = this.getServletContext();response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print("ServletContext对象:"+servletContext+"<br>");String initParameter = servletContext.getInitParameter("pageSize");writer.println("pageSize=  "+initParameter);
  Enumeration<String> names = servletContext.getInitParameterNames();while (names.hasMoreElements()){String s = names.nextElement();//通过name获取valueString initParameter = servletContext.getInitParameter(s);writer.println(s+"--->"+initParameter+"<br>");}


<!--以上两个方法是ServletContext对象的方法,这个方法获取的是什么信息?是以下的配置信息-->
<context-param><param-name>pageSize</param-name><param-value>10</param-value>
</context-param>
<context-param><param-name>startIndex</param-name><param-value>0</param-value>
</context-param>
<!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配置信息会放到以上的标签当中。-->
<!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用ServletConfig对象来获取。-->

获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。

 获取项目的根路径获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。writer.print("获取项目的根路径:");String contextPath = servletContext.getContextPath();//  /servlet04writer.println(contextPath+"<br>");

获取文件的绝对路径String realPath = servletContext.getRealPath("AServlet.java");writer.println(realPath+"<br>");

  通过ServletContext对象也是可以记录日志的
public void log(String message);
public void log(String message, Throwable t);这些日志信息记录到哪里了?localhost.2022-03-12.logTomcat服务器的logs目录下都有哪些日志文件?catalina.2022-03-12.log 服务器端的java程序运行的控制台信息。localhost.2022-03-12.log ServletContext对象的log方法记录的日志信息存储到这个文件中。localhost_access_log.2022-03-12.txt 访问日志

应用域(重点)

ServletContext对象还有另一个名字:应用域(后面还有其他域,例如:请求域、会话域)

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

为什么是所有用户共享的数据? 不是共享的没有意义。因为ServletContext这个对象只有一个。只有共享的数据放进去才有意义。

为什么数据量要小? 因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据量会影响服务器的性能。占用内存较小的数据量可以考虑放进去。

为什么这些共享数据很少的修改,或者说几乎不修改?
所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。

数据量小、所有用户共享、又不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升执行效率。

  存(怎么向ServletContext应用域中存数据)
public void setAttribute(String name, Object value);   map.put(k, v)取(怎么从ServletContext应用域中取数据)
public Object getAttribute(String name);   Object v = map.get(k)删(怎么删除ServletContext应用域中的数据)
public void removeAttribute(String name);   map.remove(k)
  • 注意:以后我们编写Servlet类的时候,实际上是不会去直接继承GenericServlet类的,因为我们是B/S结构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范当中,提供了一个类叫做HttpServlet,它是专门为HTTP协议准备的一个Servlet类。我们编写的Servlet类要继承HttpServlet。(HttpServlet是HTTP协议专用的。)使用HttpServlet处理HTTP协议更便捷。但是你需要知道它的继承结构:

>    jakarta.servlet.Servlet(接口)【爷爷】
>     jakarta.servlet.GenericServlet implements Servlet(抽象类)【儿子】
>     jakarta.servlet.http.HttpServlet extends GenericServlet(抽象类)【孙子】
>
>    我们以后编写的Servlet要继承HttpServlet类。

大家到目前为止都接触过哪些缓存机制了?

  • 堆内存当中的字符串常量池。

    • “abc” 先在字符串常量池中查找,如果有,直接拿来用。如果没有则新建,然后再放入字符串常量池。
  • 堆内存当中的整数型常量池。
    • [-128 ~ 127] 一共256个Integer类型的引用,放在整数型常量池中。没有超出这个范围的话,直接从常量池中取。
  • 连接池(Connection Cache)
    • 这里所说的连接池中的连接是java语言连接数据库的连接对象:java.sql.Connection对象。
    • JVM是一个进程。MySQL数据库是一个进程。进程和进程之间建立连接,打开通道是很费劲的。是很耗费资源的。怎么办?可以提前先创建好N个Connection连接对象,将连接对象放到一个集合当中,我们把这个放有Connection对象的集合称为连接池。每一次用户连接的时候不需要再新建连接对象,省去了新建的环节,直接从连接池中获取连接对象,大大提升访问效率。
    • 连接池
      • 最小连接数
      • 最大连接数
      • 连接池可以提高用户的访问效率。当然也可以保证数据库的安全性。
  • 线程池
    • Tomcat服务器本身就是支持多线程的。
    • Tomcat服务器是在用户发送一次请求,就新建一个Thread线程对象吗?
      • 当然不是,实际上是在Tomcat服务器启动的时候,会先创建好N多个线程Thread对象,然后将线程对象放到集合当中,称为线程池。用户发送请求过来之后,需要有一个对应的线程来处理这个请求,这个时候线程对象就会直接从线程池中拿,效率比较高。
      • 所有的WEB服务器,或者应用服务器,都是支持多线程的,都有线程池机制。
  • redis
    • NoSQL数据库。非关系型数据库。缓存数据库。
  • 向ServletContext应用域中存储数据,也等于是将数据存放到缓存cache当中了。

本次内容到这里就结束了,感谢大家的支持,javaweb系列的教程正在持续更新

希望得到大家的支持

Servlet----ServletContext相关推荐

  1. javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/

    今天在启动tomcat的时候,出现了这个错误 javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletC ...

  2. java 构造函数抛出异常,构造函数抛出异常;嵌套异常是java.lang.NoClassDefFoundError:javax/servlet/ServletContext...

    我正在尝试使用MockMVC设置Junit测试. 从这个link – "要么不能使用Servlet API,要么你需要在类路径上提供它". 我在pom.xml中添加了以下内容但是没 ...

  3. SpringBoot运行出现异常解决: nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext

    今天在使用SpringBoot创建了一个项目出现如下异常 org.springframework.beans.factory.BeanCreationException: Error creating ...

  4. 关于IDEA启动Spring Boot项目出现Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext at j

    Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext at java.lang.Class.getDeclar ...

  5. Java Servlet ServletContext

    ServletContext用来和容器(Tomcat)通信 获取方法: 1.通过request对象获取request.getServletContext(); 2.HttpServlet获取this. ...

  6. java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

    运行springboot时出现getVirtualServerName(),方法找不到异常,在网上看了一下说是包冲突,我一开始的思路是本地依赖的jar包冲突,排查下来发现不是,网上说是servetl包 ...

  7. 解决 java.lang.ClassNotFoundException: javax.servlet.ServletContext报错

    本文转载自: https://www.cnblogs.com/hdaydayup/p/6747804.html 作者:Hdaydayup 转载请注明该声明. 原因:tomcat找不到servlet,即 ...

  8. JaveWeb学习之Servlet(二):ServletConfig和ServletContext

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2018-07-26/20.html 作者:夜月归途 出处:http://www.guitu ...

  9. JavaWeb(五)——Servlet、Mapping问题、ServletContext

    文章目录 1. Servlet 简介 2. HelloServlet 3. Servlet原理 4. Mapping问题 5. ServletContext 1. Servlet 简介 Servlet ...

  10. Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象

    本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法. ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始 ...

最新文章

  1. Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
  2. EF映射之DataBaseFirst
  3. Python高效率遍历文件夹寻找重复文件
  4. 【MongoDB】增删改查基本操作
  5. 第8章 SQL语言(一)
  6. 页面定时跳转(读秒)
  7. Fedora15安装NVIDIA显卡驱动全过程
  8. impala简介(大数据技术)
  9. 启用属性,索引和存储的用途是什么?
  10. Word 2003中对不同的节设置不同的页面边框的特殊情况小结
  11. GoDaddy Linux主机支持机房的更换
  12. JAVA线程池 之 Executors (一) 简介
  13. 产品配件类目税目分类_2018商品和服务税收分类编码表
  14. pp助手苹果版_iOS 版 PP 助手下线,再见了
  15. AirPrint 基础知识
  16. 北京内推 | 微软亚洲研究院视觉计算组招聘研究与开发实习生
  17. Vue input 限制只能输入正整数、数字、英文、两个小数
  18. 3G UMTS与4G LTE核心网(一):移动核心网基础
  19. PMI-ACP练习题(22)
  20. 使用Nexus添加jar包到私服里

热门文章

  1. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传
  2. 项目中使用 Git 高频场景
  3. 【J2SE】语言基础
  4. MyBatis 一对多、多对一的处理~
  5. TVM/Relay 的 PartitionGraph()(mod) 函数讨论整理
  6. 目标检测数据集The Object Detection Dataset
  7. 2021年大数据Flink(一):乘风破浪的Flink-Flink概述
  8. 2021年大数据Spark(四十五):Structured Streaming Sources 输入源
  9. Lumen框架多数据库连接配置方法
  10. Cocos 属性常用参数