适配器模式改造Servlet

适配器模式改造Servlet


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

​ 在编写Servlet的时候,使用最多的就是service方法和init,destory方法,ServletConfig和getServletInfo方法大部分情况不使用.

在开发过程中实现了Servlet接口,就要重写这5个方法,因为使用不到其他的两个方法,所以只能给一个空返回,造成了代码的不美观和代码量大

package indi.yuluo.javaweb.Servlet;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * @author: yuluo
 * @createTime: 2022/1/9 11:19
 * @File : Bservlet.java
 * @Software : IntelliJ IDEA
 * @Description:
 */

public class Bservlet implements Servlet {


    // 利用无参的构造方法判断Tomat是否新建了Servlet对象
    public Bservlet() {
        System.out.println("Bservlet无参构造方法执行了");
    }

    @Override
    public 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() {

    }
}

解决方法,适配器设计模式

手机不能直接插到220V的电源上,电池容易烧毁,就需要一个充电器来进行转换。充电器便是适配器设计

package indi.yuluo.javaweb.adapter;

public interface MyInterface {

    void m1();

    void m2();

    void custmoerService();

    void m3();

    void m4();

    void userService();

}

package indi.yuluo.javaweb.adapter;

/**
 * @author: yuluo
 * @createTime: 2022/1/9 17:05
 * @File : UserAdapter.java
 * @Software : IntelliJ IDEA
 * @Description:
 */

public abstract class UserAdapter implements MyInterface{

    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void custmoerService() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }

    public abstract void userService();
}

package indi.yuluo.javaweb.adapter;

/**
 * @author: yuluo
 * @createTime: 2022/1/9 17:05
 * @File : UserService.java
 * @Software : IntelliJ IDEA
 * @Description:
 */

public class UserService extends UserAdapter{

    /*
    对于UserService来说,不需要实现MyInterface中的所有方法,只需要实现UserService方法即可,
    如果实现了所有的放方法,对于当前的UserService来说,代码不够优雅,不够美观
    所以编写了userAdapter,user的适配器来解决这个问题,只需要继承这个适配器即可,
     */

    @Override
    public void userService() {

    }

}

GenericServlet

Grneric是一个抽象类,有一个抽象方法service

以后写servlet代码只需要继承GenericServlet,重写里面的service方法即可

package indi.yuluo.javaweb.Servlet;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * @author: yuluo
 * @createTime: 2022/1/9 17:15
 * @File : GenericServlet.java
 * @Software : IntelliJ IDEA
 * @Description:  通用的Servlet的适配器
 */

public abstract class GenericServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 这个方法在Servlet中经常使用,所以要求子类必须实现service方法
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException;

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

    @Override
    public void destroy() {

    }
}


package indi.yuluo.javaweb.Servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;

import java.io.IOException;

/**
 * @author: yuluo
 * @createTime: 2022/1/9 17:19
 * @File : LoginServlet.java
 * @Software : IntelliJ IDEA
 * @Description:
 */

public class LoginServlet extends GenericServlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("正在处理用户请求,请稍后。。。。。。");
    }
}

改造GenericServlet

  • 第一个问题:提供了GenericServle方法之后,init方法还会继续执行吗?

    • 会,会执行GenericServlet里面的inti方法,
      
  • init方法和init方法中的ServletConfig对象,是谁创建的,谁传过来的

    • Tomcat干的,
    • Tomcat服务器先创建了Servletconfig对象,然后将ServletConfig对象传给了inti方法
  • 输出ServletConfig对象如下:

    • ServletConfig对象org.apache.catalina.core.StandardWrapperFacade@7d5a4458
      
  • tomcat已经为我们封装了GenericServlet

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值