首页 > 其他分享 >适配器模式改造Servlet

适配器模式改造Servlet

时间:2023-05-20 11:32:07浏览次数:40  
标签:Servlet 改造 适配器 GenericServlet init import servlet public

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

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

2. 适配器设计模式Adapter   11

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

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

  - GenericServlet实现Servlet接口。

  - GenericServlet是一个适配器。

  - 以后编写的所有Servlet类继承GenericServlet,重写service方法即可。

代码在com.bjpowernode.javaweb.servlet.

适配器模式改造标准通用的GenericServlet

package com.bjpowernode.javaweb.servlet;

import jakarta.servlet.*;

import java.io.IOException;

//适配器模式改造Servlet   11
//编写一个标准通用的Servlet起名为GenericServlet,以后所有的Servlet类不要直接实现Servlet接口了
//以后所有的Servlet类都要继承GenericServlet类,GenericServlet就是一个适配器
public abstract class GenericServlet implements Servlet{
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    //将此方法改成一个抽象方法这个最常用,所以要求子类必须实现service方法
    @Override
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException;

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

    @Override
    public void destroy() {

    }
}

LoginServlet

package com.bjpowernode.javaweb.servlet;

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

import java.io.IOException;

//这个LoginServlet去继承我们改造的GenericServlet  11
//我们的这个GenericServlet继承了Servlet接口且实现了其方法,而且将最常用的service方法抽象
//所以我们这个LoginServlet继承GenericServlet只用实现service方法即可(因为继承抽象了其抽象方法
// 必须实现,这也恰恰正合我们的意思)因为只用实现service方法显得代码更加美观不冗余
public class LoginServlet extends GenericServlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("正在处理用户登录请求,请稍后……");
    }
}

VipServlet

package com.bjpowernode.javaweb.servlet;

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

import java.io.IOException;

//这个VipServlet去继承我们改造的GenericServlet  11
public class VipServlet extends GenericServlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("vip可以享受更好的服务……");
    }
}

配置文件web.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
        LoginServlet
        com.bjpowernode.javaweb.servlet.LoginServlet
    
    
        LoginServlet
        /login
    

    
        vipServlet
        com.bjpowernode.javaweb.servlet.VipServlet
    
    
        vipServlet
        /vip

适配器模式改造Servlet_子类

3. 改造GenericServlet  12

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

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

    - 还会执行。会执行GenericServlet类中的init方法。(即子类没有执行父类的)

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

    - Tomcat服务器调用的。

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

    - 都是Tomcat干的。

    - Tomcat服务器先创建了ServletConfig对象,然后调用init方法,将ServletConfig对象传给了init方法。

思考一下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方法
              // ....
              
          }
      }

3.2 改造GenericServlet案例   12

代码在com.bjpowernode.javaweb.servlet2.

GenericServlet

package com.bjpowernode.javaweb.servlet2;

import jakarta.servlet.*;

import java.io.IOException;

//适配器模式改造Servlet   12
//改造GenericServlet  12
//编写一个标准通用的Servlet起名为GenericServlet,以后所有的Servlet类不要直接实现Servlet接口了
//以后所有的Servlet类都要继承GenericServlet类,GenericServlet就是一个适配器
public abstract class GenericServlet implements Servlet{

    //成员变量
    private ServletConfig config;

    /**
     * init方法中的ServletConfig对象是小猫咪创建好的。
     * 这个ServletConfig对象目前在init方法的参数上,属于局部变量。
     * 那么ServletConfig对象肯定以后要在service方法中使用,怎么才能保证ServletConfig对象
     * 在service方法中能够使用呢?
     */
    //加final是为保证子类不能重写init方法
    @Override
    public final void init(ServletConfig config) throws ServletException {
        //解释
        //this.config指成员变量   config指参数的ServletConfig config
        //将参数的config赋值为成员变量的config,就可以保证成员变量的config不为空,从而确保
        //getServletConfig()方法中返回的return config不为空
        this.config=config;

        //调用我们写的init
        this.init();
    }

    //我们写的init
    //供子类重写的
    public void init(){

    }

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

    //将此方法改成一个抽象方法这个最常用,所以要求子类必须实现service方法
    @Override
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException;

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

    @Override
    public void destroy() {

    }
}

LoginServlet

package com.bjpowernode.javaweb.servlet2;

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

import java.io.IOException;

//这个LoginServlet去继承我们改造的GenericServlet  12
//我们的这个GenericServlet继承了Servlet接口且实现了其方法,而且将最常用的service方法抽象
//所以我们这个LoginServlet继承GenericServlet只用实现service方法即可(因为继承抽象了其抽象方法
// 必须实现,这也恰恰正合我们的意思)因为只用实现service方法显得代码更加美观不冗余
public class LoginServlet extends GenericServlet {

    // 思考一个问题:   12
    // 有没有一种可能,需要我在LoginServlet类中重写init方法?
    // 当然有可能,于是乎就重写了init方法。
    // 但是我们不想让子类重写init方法,既需要在父类的init方法加final,因为子类重写了init方法可能
    // 导致在子类中使用getServletConfig()获取的config为空null(因为子类一旦重写父类的init就不会执行)
    /*public void init(ServletConfig config) throws ServletException {
        System.out.println("重写我自己的规则。。。。。");
    }*/

    // 父类将原始的init方法final了,我子类没有办法重写这个init方法了。
    // 如果这个时候我还是希望能够重写init方法,该怎么办呢?
    @Override
    public void init(){
        System.out.println("LoginServlet's init() method execute!");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("正在处理用户登录请求,请稍后……");

        //想在LoginServlet子类中使用ServletConfig对象
        ServletConfig config = this.getServletConfig();
        System.out.println("service方法中可以获取到ServletConfig对象 "+config);
    }
}

配置文件web.xml

<servlet>
        <servlet-name>LoginServlet2</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet2.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet2</servlet-name>
        <url-pattern>/login2</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>vipServlet2</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet2.VipServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>vipServlet2</servlet-name>
        <url-pattern>/vip2</url-pattern>
    </servlet-mapping>

适配器模式改造Servlet_java_02

3.3 好消息GenericServlet不用我们自己写,原码提供了  12

3.3.1 案例演示

代码在com.bjpowernode.javaweb.servlet2.

UserServlet
package com.bjpowernode.javaweb.servlet2;

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

import java.io.IOException;

//演示使用系统的GenericServlet  12
public class UserServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("输出使用系统的GenericServlet");
    }
}
配置文件web.xml
<servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet2.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/user</url-pattern>
    </servlet-mapping>

适配器模式改造Servlet_适配器_03

标签:Servlet,改造,适配器,GenericServlet,init,import,servlet,public
From: https://blog.51cto.com/u_15784725/6317342

相关文章

  • Tomcat&Servlet
    Tomcat1、JavaWeb的概念1、什么是JavaWeb?1、JavaWeb是指,所有通过Java语言编写可以通过浏览器访问的程序的总称,叫JavaWeb。2、JavaWeb是基于请求和响应来开发的。2、什么是请求?1、请求是指客户端给服务器发送数据,叫请求Request3、什么是响应?响应是指服务器给客户端回传数......
  • 聊一聊适配器模式
    接口不能用?行,我帮你适配一、概述适配器模式(Adapter),是23种设计模式中的结构型模式之一;它就像我们电脑上接口不够时,需要用到的拓展坞,起到转接的作用。它可以将新的功能和原先的功能连接起来,使由于需求变动导致不能用的功能,重新利用起来。上图的Mac上,只有两个typec接口,当我们需......
  • 适配器模式
    目录适配器模式概述结构类适配器模式对象适配器模式应用场景JDK源码解析适配器模式概述如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当......
  • 10-Servlet
    1.简介Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务......
  • 同步处理servlet传递json数据到jsp
    在servlet里面也可以用request.setAttribute传递json的数据,但是传递之前需要先将这个数据格式转化为字符串Stringjsonstr=json.toString();request.setAttribute("jsonstr",jsonstr);request.getRequestDispatcher("/showjson.jsp").forward(req......
  • Tomcat10依赖问题 jakarta.servlet-api 6.0.0 spring6.x.x
    org.springframework.web.servlet.DispatcherServlet’isnotassignabletojavax.servlet.Servlet1、pom.xml配置<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifact......
  • WebApplicationInitializer究 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用
    大家应该都已经知道Spring3.1对无web.xml式基于代码配置的servlet3.0应用。通过spring的api或是网络上高手们的博文,也一定很快就学会并且加到自己的应用中去了。PS:如果还没,也可以小小参考一下鄙人的上一篇文章<<探Spring3.1之无web.xml式基于代码配置的servlet3.0应用>>。    ......
  • 老杜 JavaWeb 讲解(六) ——Servlet对象的生命周期
    (八)Servlet对象的生命周期对应视频:10-Servlet对象的生命周期8.1什么是Servlet对象生命周期?Servlet对象什么时候被创建。Servlet对象什么时候被销毁。Servlet对象创建了几个?Servlet对象的生命周期表示:一个Servlet对象从出生在最后的死亡,整个过程是怎样的。8.2Servle......
  • 适配器模式(Adapter Pattern)
    模式动机适配器模式(AdapterPattern)是一种使用频率非常高的结构型模式,如果在系统中存在不兼容的接口,可以通过引入一个适配器来使得原本因为接口不兼容而不能一起工作的两个类可以协同工作。适配器模式中适配器的作用与现实生活中存在的电源适配器、网络适配器等作用相同。在引入......
  • JavaWeb过滤器读取并修改POST请求的参数-YhtHttpServletRequestWrapper
    核心原理就是一个类:javax.servlet.http.HttpServletRequestWrapper一个简单的例子,当任何请求的参数里有aaa的时候,把它的值改成bbb新增一个类自定义的类CustomHttpServletRequestWrapper importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSer......