Servlet的一些接口

GenericServlet

  • 我们编写一个Servlet类直接实现Servlet接口有什么缺点?
    • 我们一般只需要实现service方法,可是其他方法也要全部重写,代码不简化。
  • (适配器设计模式Adapter)编写一个GenericServlet类,这个类是一个抽象类,其中只有一个抽象方法service方法。
    • GenericServlet实现Servlet接口。
    • GenericServlet是一个适配器。
    • 以后编写所有的Servlet类继承GenericServlet,重写service方法即可。
  • 思考:GenericServlet是否需要改造一下?更利于我们的编写?
    • 提供一个GenericServlet之后,init方法还会执行么?
      • 会执行,会执行GenericServlet中的init方法(子类默认执行父类)。
    • init方法是谁调用的?
      • Tomcat服务器调用的。
    • init方法中ServletConfig对象是谁创建的?是谁传过来的?
      • Tomcat服务器。
    • Tomcat服务器如何进行操作的?(以UserServlet对象为例子,自己创建的class)
      • 创建UserServlet对象(通过反射机制,调用无参构造方法来去实例化UserServlet对象)。
      • 创建ServletConfig对象,Tomcat服务器负责将ServletConfig对象实例化出来。
      • 调用Servlet的init方法,service方法…

ServletConfig

  • 什么是ServletConfig?

    • Servlet对象的配置信息对象。
    • ServletConfig对象中封装了标签中的配置信息。(web.xml文件中servlet的配置信息)
  • 一个Servlet对象对应一个ServletConfig对象。

  • Servlet对象是由Tomcat服务器创建的,ServletConfig对象也是由Tomcat服务器创建的。并且默认情况下,他们都是在用户发送第一次请求时创建的。

  • Tomcat服务器调用Servlet对象的init方法的时候,要传一个ServletConfig对象的参数给init方法。

  • SerlvetConfig接口的实现是Tomcat服务器给实现的。

  • ServletConfig有哪些方法?

    • public String getInitParameter(String name); //通过初始化参数的name获取value
      public Enumeration<String> getInitParamterNames(); //获取所有的初始化参数的name
      public ServletContext getServletContext(); //获取ServletContext对象
      public String getServletName(); //获取Servlet的name
      
    • ​ 以上的方法在Servlet类当中,都可以通过this调用。因为GenericServlet实现了ServletConfig接口。

ServletContext

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

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

  • Tomcat服务器中有一个webapps,这个webapps下可以存放webapp,可以存放多个webapp,假设有100个webapp,就有100个ServletContext对象。总之,一个应用,一个webapp肯定只有一个ServletContext对象。

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

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

  • ServletContext是一个接口,Tomcat服务器对ServletContext接口进行了实现。

    • ServletContext对象的创建也是Tomcat服务器来完成的。启动webapp的时候创建的。
  • ServletContext对象还有另一个名字:应用域(后面还有其他的域:会话域、请求域)

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

      • 为什么是所有用户共享的数据?不是共享的没有意义,因为ServletContext这个对象只有一个,只有共享数据才有意义。
      • 为什么数据量要小?因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据会影响服务器的性能。占用内存较小的数据量可以考虑放进去。
      • 为什么这些共享数据很少被修改,或者几乎不修改?所有用户都是共享数据的,如果设计到修改操作的话,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。
    • 数据量小,所有用户共享,又不修改,这样的额数据放在ServletContext这个应用域当中,会大大提升效率。因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,从而大大提升执行效率。

    • 存,删,取:

      //存(怎么向ServletContext应用域中存数据)
      public void setAttribute(String name, Object value);
      //取(怎么从ServletContext应用域取数据)
      public Object getAttribute(String name);
      //删(怎么删除ServletContext应用域的数据)
      public void removeAttribute(String name);
      
  • 注意:以后编写代码不会继承GenericServlet类的,因为我们是B/S结构的系统,这种系统是基于HTTP超文本传输协议的。在Servlet规范中,提供了一个叫HttpServlet,它是专门为Http协议准备的一个Servlet类,我们编写的Servlet类要继承HttpServlet,处理Http协议更方便。

    Servlet(接口)   【爸爸】
    GenericServlet implements Servlet (抽象类)   【儿子】
    HttpServlet extends GenericServlet(抽象类)    【孙子】
        
    以后编写的Servlet都继承HttpServlet类。
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孤妄的Devil

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

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

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

打赏作者

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

抵扣说明:

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

余额充值