ServletConfig接口详情
一、ServletConfig 是什么?
javax.servlet.ServletConfig 是一个接口。也是 Servlet 规范中的一员【自从Tomcat 9 之后javax改成:Jakarta】
二、谁去实现了这个接口?
我们可以看见: org.apache.catalina.core.StandardWrapperFacade 是这个类实现了 ServletConfig 这个接口。
也就是 Tomcat 服务器 实现了。
三、一个 Servlet 对象对应一个 ServletConfig对象。100个Servlet对象有 100个ServletConfig对象。
四、ServletConfig 对象是谁创建的,什么时候创建的?
是Tomcat服务器创建的,在创建 Servlet 对象的同时,创建了 ServletConfig 对象。也就是用户发送第一次请求的时候。
五、ServletConfig 接口到底是干什么用的?
ServletConfig被翻译为:Servlet对象的配置信息对象。一个对象对应一个配置信息。
六、ServletConfig对象包含了什么信息?
包含了web.xml配置文件 <servlet></servlet>标签中的配置信息。
<servlet>
<servlet-name>ConfigTest</servlet-name>
<servlet-class>yangzhaoguang.servlet.ConfigTest</servlet-class>
</servlet>
ServletContext 接口详情
一、ServletContext 也是一个接口,是Servlet规范中的一员
二、ServletContext 接口是谁实现的?
Tomcat 实现了 ServletContext 接口。
三、ServletContext 对象 是谁创建的?什么时候创建的?
Tomcat 创建的,在Tomcat启动的时候创建的。ServletContext 对象 只有一个。在服务器关闭的时候销毁。
四、ServletContext 怎么理解?
Servlet 的环境对象。ServletContext 对象其实对应的就是整个web.xml文件。所有Servlet 对象 都共享一个 ServletContext 对象
AServlet 和 BServlet 都是同一个 Context 对象。因为都对应一个 web.xml 文件。
五、ServletContext 中 有什么常用的方法?
String getInitParameter(String name)
Enumeration<String> getInitParameterNames()
<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的里面,怎么区分呢?
就相当于 全局 和 局部 的意思,如果想让所有的Servlet 都起作用,就写到Servlet 的外面,如果只想让某个 Servlet 有作用,就写到某个 Servlet 标签里面
//获取上下文的根 String contextPath = application.getContextPath();
//获取文件的绝对路径 //这个 "/" 代表根路径:web,写不写都可以。 // String realPath = application.getRealPath("/web.xml"); //找path文件夹中的path.html String realPath = application.getRealPath("/path/path.html"); writer.print("path.html 的绝对路径:" + realPath);
我们在部署 Tomcat 时候,这个就是 上下文的根。
//记录日志功能 application.log("hello world !!!");
当我们使用 IDEA 工具记录日志时,其实并不是写在 Tomcat 下的 logs 目录下。
这是因为 IDEA 中的Tomcat 是一种镜像。并不会记录在原本的Tomcat下的logs目录下
而是记录在这个目录下: localhost.2022-01-20.log
当Tomcat 服务器 未启动时,可以看到 logs 目录时空的~
但是当我们启动Tomcat时,会出现以下文件:
当服务器未发送请求时,访问日志的初始状态:
当我们不断刷新页面。发送请求时:localhost_access_log.2022-01-20.txt 会记录访问记录。
localhost.2022-01-20.log 会记录日志内容!
在 Tomcat 页面 中:这俩个一个记录日志内容 一个记录 Tomcat 启动信息
六、Servlet Context 又叫 应用域。
如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,我们可以将这些数据放到 Servlet Context 这个域 中。
- 为什么所有的数据必须是共享的?
- 因为不是共享的没有意义,所有Servlet对象只有一个 Servlet Context 对象,只有共享的数才有意义
- 为什么数据量要小?
- 数据量太大,占用内存,Servlet Context 对象 生命周期较长,从 Tomcat 开启 到固 关闭才会销毁。
- 为什么这个共享的数据要很少的修改?
- 这个数据是修改的,如果涉及到修改,可能出现多线程并发 安全问题。所以放到 Servlet Context中的数据一般是只读的。
- 数据量小,共享数据,不会修改,这样的数据放到应用域中才会提升效率。因为应用域中相当与一个缓存,使用时不需要从数据库中再取数据;
- 一些缓存技术?
- 字符串常量池
- 整数型连接池(但凡是 -128-127 之间的Integer对象。都不会重新创建,直接从连接中拿)
- 数据库连接池(提前创建好连接对象放到连接池中)
- 线程池
那么怎么向 应用域中存数据,取数据,删除数据?
Object |
|
void | setAttribute(String name, Object object)//存数据 |
void | removeAttribute(String name)//删除数据 |
其实我们以后编写 Servlet 类的时候,实际上不会直接继承 GenericServlet 类的,因为我们时 B/S 结构,这种结构是基于 HTTP 协议的,在 Serlvet 规范当中:提供了一个类叫做 HttpServlet ,他是专门为 HTTP 协议准备的一个 Servlet 类,我们编写的 Servlet类要继承 HttpServlet(HttpServlet 是 HTTP 协议专用的。)
他们之间的继承关系:
javax.servlet.Servlet 接口【爸爸】
javax.servlet.GenericServlet implements Servlet 抽象类【儿子】
javax.servlet.http.HttpServelt extends GenericServlet 抽象类【孙子】
以后编写的Servlet 类。要继承 HttpServlet