ServletConfig回顾
    image.png

    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被称为Servlet上下文对象。(Servlet对象的四周环境对象。)

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

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

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

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

    - ServletContext接口中有哪些常用的方法?

    • java<br /> public String getInitParameter(String name); // 通过初始化参数的name获取value<br /> public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name<br />

    • xml<br /> <!--以上两个方法是ServletContext对象的方法,这个方法获取的是什么信息?是以下的配置信息--><br />xml

      1. <param-name>pageSize</param-name>
      2. <param-value>10</param-value>

      1. <param-name>startIndex</param-name>
      2. <param-value>0</param-value>

    1. <!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配置信息会放到以上的标签当中。--><br /> <!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用ServletConfig对象来获取。--><br />
    1. 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径<br /> java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。<br />
    1. public String getContextPath();
    2. //String contextPath = application.getContextPath();
    3. // 获取文件的绝对路径(真实路径)
    4. public String getRealPath(String path);
    5. // 通过ServletContext对象也是可以记录日志的
    6. public void log(String message);
    7. public void log(String message, Throwable t);
    1. 这些日志信息记录到哪里了 ?<br /> localhost.2021-11-05.log<br /> <br />** Tomcat服务器的logs目录下都有哪些日志文件?**<br />** catalina.2021-11-05.log 服务器端的java程序运行的控制台信息。**<br />** localhost.2021-11-05.log ServletContext对象的log方法记录的日志信息存储到这个文件中。**<br />** localhost_access_log.2021-11-05.txt 访问日志**<br /> ```
    2. // **ServletContext对象还有另一个名字:应用域(后面还有其他域,例如:请求域、会话域)**<br /> <br /> // 如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,可以将这些数据放到ServletContext这个应用域中<br /> <br /> // 为什么是所有用户共享的数据? 不是共享的没有意义。因为ServletContext这个对象只有一个。只有共享的数据放进去才有意义。<br /> <br /> // 为什么数据量要小? 因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据量会影响服务器的性能。占用内存较小的数据量可以考虑放进去。<br /> <br /> // 为什么这些共享数据很少的修改,或者说几乎不修改?<br /> // 所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。<br /> <br /> // 数据量小、所有用户共享、又不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升执行效率。<br />
    1. // 存(怎么向ServletContext应用域中存数据)
    2. public void setAttribute(String name, Object value); // map.put(k, v)
    3. // 取(怎么从ServletContext应用域中取数据)
    4. public Object getAttribute(String name); // Object v = map.get(k)
    5. // 删(怎么删除ServletContext应用域中的数据)
    6. public void removeAttribute(String name); // map.remove(k)

    ServletCContext01
    image.png
    image.png
    ServletContext01.java

    1. ** ServletContext02**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22702196/1637406712447-98709b98-4f15-43c1-b65f-3c93bb299947.png#clientId=u666dbaba-f1fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=432&id=u8bd5ce2b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=864&originWidth=1477&originalType=binary&ratio=1&rotation=0&showTitle=false&size=130552&status=done&style=none&taskId=u5b4aa69e-600b-4aa6-95c9-7de40d0f494&title=&width=738.5)

    image.png

    1. <br /> [ServletContext02.java](https://www.yuque.com/attachments/yuque/0/2021/java/22702196/1637406808768-7e40d5b8-c286-4321-8f52-bcaeda3be5f7.java?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fjava%2F22702196%2F1637406808768-7e40d5b8-c286-4321-8f52-bcaeda3be5f7.java%22%2C%22name%22%3A%22ServletContext02.java%22%2C%22size%22%3A690%2C%22type%22%3A%22%22%2C%22ext%22%3A%22java%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u015c7839-88ab-4982-b179-704eb74401c%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22uca7decbf%22%2C%22card%22%3A%22file%22%7D)
    2. ** ServletContext配置**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22702196/1637406827807-d314b88d-2a86-4e93-abf5-01ebc6c3e57c.png#clientId=u666dbaba-f1fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=205&id=ub598aed8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=409&originWidth=1334&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29864&status=done&style=none&taskId=u12ca2c1c-d83d-4da7-957f-9920d552d05&title=&width=667)
    3. [web.xml](https://www.yuque.com/attachments/yuque/0/2021/xml/22702196/1637406875162-46dbbc2f-adcc-4bd0-b96f-6dab4285c612.xml?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fxml%2F22702196%2F1637406875162-46dbbc2f-adcc-4bd0-b96f-6dab4285c612.xml%22%2C%22name%22%3A%22web.xml%22%2C%22size%22%3A1853%2C%22type%22%3A%22text%2Fxml%22%2C%22ext%22%3A%22xml%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u05a49f9b-5db6-4ac8-9457-ba2ca4440ae%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u0bd538d7%22%2C%22card%22%3A%22file%22%7D)
    4. <br />