适配器模式改造Servlet

一、引入适配器

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

二、适配器设计模式Adapter

2.1 实例

  • 手机连直接插到220V的电压下,手机就报废了,找一个充电器,这个充电器就是一个适配器。手机连接适配
    器,适配器连接220V的电压,这样问题就解决了

2.2 方法

  • 编写一个GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service
  • GenericServlet实现Servlet接口
  • GenericServlet是一个是适配器
  • 以后编写所有的Servlet类继承GenericServlet,重写service方法即可
  1. package servlet;
  2. import jakarta.servlet.*;
  3. import java.io.IOException;
  4. /**
  5. * @Author: 小雷学长
  6. * @Date: 2022/3/17 - 19:47
  7. * @Version: 1.8
  8. */
  9. /**
  10. * 编写一个标准通用的Servlet,起名:GenericServlet
  11. * 以后所有的Servlet类都不要直接实现Servlet接口了
  12. * 以后所有的Servlet类都要继承GenericServlet类
  13. * GenericServlet 就是一个适配器
  14. */
  15. public abstract class GenericServlet implements Servlet {
  16. @Override
  17. public void init(ServletConfig servletConfig) throws ServletException {
  18. }
  19. @Override
  20. public ServletConfig getServletConfig() {
  21. return null;
  22. }
  23. /**
  24. * 抽象方法,这个最常用,所以要求子类必须实现service方法
  25. * @param servletRequest
  26. * @param servletResponse
  27. * @throws ServletException
  28. * @throws IOException
  29. */
  30. @Override
  31. public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)
  32. throws ServletException, IOException;
  33. @Override
  34. public String getServletInfo() {
  35. return null;
  36. }
  37. @Override
  38. public void destroy() {
  39. }
  40. }
  1. package servlet;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.ServletRequest;
  4. import jakarta.servlet.ServletResponse;
  5. import java.io.IOException;
  6. /**
  7. * @Author: 小雷学长
  8. * @Date: 2022/3/17 - 21:03
  9. * @Version: 1.8
  10. */
  11. public class VipServlet extends GenericServlet {
  12. @Override
  13. public void service(ServletRequest servletRequest, ServletResponse servletResponse)
  14. throws ServletException, IOException {
  15. System.out.println("VIP");
  16. }
  17. }
  1. package servlet;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.ServletRequest;
  4. import jakarta.servlet.ServletResponse;
  5. import java.io.IOException;
  6. public class LoginServlet extends GenericServlet{
  7. @Override
  8. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  9. System.out.println("Login");
  10. }
  11. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>loginServlet</servlet-name>
  8. <servlet-class>servlet.LoginServlet</servlet-class>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>loginServlet</servlet-name>
  12. <url-pattern>/login</url-pattern>
  13. </servlet-mapping>
  14. <servlet>
  15. <servlet-name>VIPServlet</servlet-name>
  16. <servlet-class>servlet.VipServlet</servlet-class>
  17. </servlet>
  18. <servlet-mapping>
  19. <servlet-name>VIPServlet</servlet-name>
  20. <url-pattern>/VIP</url-pattern>
  21. </servlet-mapping>
  22. <servlet>
  23. <servlet-name>aservlet</servlet-name>
  24. <servlet-class>servlet.AServlet</servlet-class>
  25. <!--<load-on-startup>0</load-on-startup>-->
  26. </servlet>
  27. <servlet-mapping>
  28. <servlet-name>aservlet</servlet-name>
  29. <url-pattern>/a</url-pattern>
  30. </servlet-mapping>
  31. <servlet>
  32. <servlet-name>bservlet</servlet-name>
  33. <servlet-class>servlet.BServlet</servlet-class>
  34. <!--<load-on-startup>1</load-on-startup>-->
  35. </servlet>
  36. <servlet-mapping>
  37. <servlet-name>bservlet</servlet-name>
  38. <url-pattern>/b</url-pattern>
  39. </servlet-mapping>
  40. </web-app>

三、改造GenericServlet

3.1 关于init方法

  • 在提供了GenericServlet之后,init方法仍然会被调用
  • init方法是Tomcat服务器调用的
  • Tomcat服务器先创建了ServletConfig对象,如何调用init方法,将ServletConfig对象传给了init方法