ServletConfig接口与ServletContext接口

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

getAttribute(String name)  //取数据

voidsetAttribute(String name, Object object)//存数据
voidremoveAttribute(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲨瓜2号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值