11-GenericServlet

念念念北 / 2023-05-07 / 原文

1. 我们编写一个 Servlet 类直接实现 Servlet 接口有什么缺点?

我们只需要 service 方法,其他方法大部分情况下是不需要使用的。代码很丑陋。

2. 适配器设计模式 Adapter

适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

手机直接插到 220V 的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充电器就是一个适配器。手机连接适配器。适配器连接 220V 的电压。这样问题就解决了。

3. 编写一个 GenericServlet 类,这个类是一个抽象类,其中有一个抽象方法 service。

image-20230507082238013

image-20230507082254531

  • GenericServlet 实现 Servlet 接口。
  • GenericServlet 是一个适配器。
  • 以后编写的所有 Servlet 类继承 GenericServlet,重写 service 方法即可。

4. 思考:GenericServlet 类是否需要改造一下?怎么改造?更利于子类程序的编写?

4.1 思考第一个问题:我提供了一个 GenericServlet 之后,init 方法还会执行吗?

还会执行。会执行 GenericServlet 类中的 init 方法。

image-20230507082652744

控制台上打印的结果为:

image-20230507082611733

4.2 思考第二个问题:init 方法是谁调用的?

Tomcat 服务器调用的。

4.3 思考第三个问题:init 方法中的 ServletConfig 对象是谁创建的?是谁传过来的?

  • 都是 Tomcat 干的。
  • Tomcat 服务器先创建了 ServletConfig 对象,然后调用 init 方法,将 ServletConfig 对象传给了 init 方法。

4.3 思考一下 Tomcat 服务器伪代码:

public class Tomcat {
    public static void main(String[] args){
        // .....
        // Tomcat服务器伪代码
        // 创建LoginServlet对象(通过反射机制,调用无参数构造方法来实例化LoginServlet对象)
        Class clazz = Class.forName("com.bjpowernode.javaweb.servlet.LoginServlet");
        Object obj = clazz.newInstance();

        // 向下转型
        Servlet servlet = (Servlet)obj;

        // 创建ServletConfig对象
        // Tomcat服务器负责将ServletConfig对象实例化出来。
        // 多态(Tomcat服务器完全实现了Servlet规范)
        ServletConfig servletConfig = new org.apache.catalina.core.StandardWrapperFacade();

        // 调用Servlet的init方法
        servlet.init(servletConfig);

        // 调用Servlet的service方法
        // ....

    }
}