在正式讲解之前,先让大家有一个整体印象。
之前讲过ServletConfig,我发现他们有两个共同的方法,我对他们的区别做了小小的总结
JavaWeb系列的其他教程,持续更新中
JavaWeb系列教程
JavaWeb—Servlet
模拟Servlet本质
使用IDEA开发Servlet程序
Servlet对象的生命周期
适配器(GenericServlet)改造Servlet
ServletConfig
Servlet–ServletContext
HTTP协议,get和post的区别
web站点欢迎页
一篇学会HttpServletRequest
上面的思维导图是对下面内容的总结,大家可以先看看,对等会的内容有一个大概印象,看完后,可以再回头看看这个思维导图。
如果大家觉得有帮助的话,不妨动动小手,点赞收藏一波,也方便后面的复习哈
ServletContext是一个接口,是Servlet规范中的一员,
ServletContext对象的创建也是Tomcat服务器来完成的。启动webapp的时候创建的。
Tomcat服务器(WEB服务器)实现了ServletContext接口
public class org.apache.catalina.core.ApplicationContextFacade implements ServletContext{}
Servlet对象是谁创建的,在什么时候创建的
ServletContext对象是WEB服务器启动的时候创建的
ServletContext对象是WEB服务器创建的
对于一个WEBAPP来说,ServletContext对象只有一个
一个web应用对应一个ServletContext实例,这个实例是应用部署启动后,servlet容器为应用创建的。
ServletContext对象在服务器关闭的时候销毁
只要在同一个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+"
");
一个webapp应用共享一个ServletContext对象
ServletContext servletContext = this.getServletContext();
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.print("ServletContext对象:"+servletContext+"
");
ServletContext被称为Servlet上下文对象。(Servlet对象的四周环境对象。)
一个ServletContext对象通常对应的是一个web.xml文件。
ServletContext对应显示生活中的什么例子呢?
一个教室里有多个学生,那么每一个学生就是一个Servlet,这些学生都在同一个教室当中,那么我们可以把这个教室叫做ServletContext对象。那么也就是说放在这个ServletContext对象(环境)当中的数据,在同一个教室当中,物品都是共享的。比如:教室中有一个空调,所有的学生都可以操作。可见,空调是共享的。因为空调放在教室当中。教室就是ServletContext对象。
Tomcat是一个容器,一个容器可以放多个webapp,一个webapp对应一个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+"
");
String initParameter = servletContext.getInitParameter("pageSize");
writer.println("pageSize= "+initParameter);
Enumeration<String> names = servletContext.getInitParameterNames();
while (names.hasMoreElements()){
String s = names.nextElement();
//通过name获取value
String initParameter = servletContext.getInitParameter(s);
writer.println(s+"--->"+initParameter+"
");
}
<context-param>
<param-name>pageSizeparam-name>
<param-value>10param-value>
context-param>
<context-param>
<param-name>startIndexparam-name>
<param-value>0param-value>
context-param>
获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
获取项目的根路径
获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
writer.print("获取项目的根路径:");
String contextPath = servletContext.getContextPath();
// /servlet04
writer.println(contextPath+"
");
获取文件的绝对路径
String realPath = servletContext.getRealPath("AServlet.java");
writer.println(realPath+"
");
通过ServletContext对象也是可以记录日志的
public void log(String message);
public void log(String message, Throwable t);
这些日志信息记录到哪里了?
localhost.2022-03-12.log
Tomcat服务器的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)
> jakarta.servlet.Servlet(接口)【爷爷】
> jakarta.servlet.GenericServlet implements Servlet(抽象类)【儿子】
> jakarta.servlet.http.HttpServlet extends GenericServlet(抽象类)【孙子】
>
> 我们以后编写的Servlet要继承HttpServlet类。
大家到目前为止都接触过哪些缓存机制了?
本次内容到这里就结束了,感谢大家的支持,javaweb系列的教程正在持续更新
希望得到大家的支持