JavaWeb复习002-Servlet改造

56 阅读1分钟
public interface MyInterface {
    void m1();
    void m2();
    void m3();
    void m4();
    void m5();
    void core();
}

接口中的方法并不是全部都需要,那么避免代码冗余,就可以使用抽象类实现接口,作为适配器

public abstract class UserAdapter implements MyInterface{
    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }

    @Override
    public void m5() {

    }

    @Override
    public abstract void core();
}

把最常用的方法作为抽象方法,那么之后的类继承这个适配器抽象类,实现适配器的抽象方法即可,不需要实现接口的其他方法

public class UserService extends UserAdapter{
    @Override
    public void core() {

    }
}

改造Servlet,创建一个抽象类,实现Servlet接口,作为适配器,把需要经常使用的方法进行抽象


public abstract class ServletAdapter implements Servlet {
    @Override
    public abstract void init(ServletConfig servletConfig) throws ServletException;
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy();
}

最后继承抽象类的Servlet代码会变的更简洁


public class AServlet extends ServletAdapter {


    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

}

但问题仍然存在,如果此时需要ServletConfig,那就不行了,进一步解决方案,创建成员变量 Pasted image 20240613154453.png 此时之前的AServlet类,可以通过this.getServletConfig()获取servletConfig Pasted image 20240613154705.png 但仍然存在问题,如果需要重写init方法,但是又没法规范程序员严格编写,保证servletConfig获取正常,这时就需要在适配器中,把它final了,再写个init方法,让程序员去调用这个方法,保证了既要又要。 Pasted image 20240613155536.png Pasted image 20240613155553.png 改造完成,不过这就是官方提供的GenericServlet,不信?可以查看 Pasted image 20240613155817.png 实现了Servlet接口,定义了成员变量

Pasted image 20240613155948.png 获取了config,调用了另一个init方法,这就是GenericServlet的实现过程