当前位置: 首页 > 图灵资讯 > 技术篇> 适配器模式改造Servlet

适配器模式改造Servlet

来源:图灵教育
时间:2023-05-21 09:22:41

1.直接实现Servlet接口的缺点是什么?11

-我们只需要service方法,大多数情况下不需要使用其他方法。代码很难看。

2.Adapter11适配器设计模式

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

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

-实现Servlet接口的Genericservlet。

-Genericservlet是一种适配器。

-以后编写的所有Servlet类别都可以继承GenericServlet,重写Service方法。

com中的代码.bjpowernode.javaweb.servlet.Genericservletet适配器模式改造标准通用

package com.bjpowernode.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;///适配器模式改变Servletetet   11//编写一个标准通用的Servlet,命名为GenericServlet,以后所有的Servlet类别都不会直接实现Servlet接口//以后所有的Servlet类别都会继承GenericServlet类别,Genericservlet是适配器publicic 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  我们的Genericservlet继承了Servlet接口,实现了它的方法,而且最常用的service方法是抽象//所以我们的loginservlet继承genericservlet只需要实现service方法(因为它的抽象方法是抽象的// 必须实现,这正好适合我们的意思)因为实现service的代码更漂亮,不冗余publice 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  11public 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.改造Genericservlet123.1思考:Genericservlet类需要改造吗?如何改造?更有利于子类程序的编写?12

-思考第一个问题:我提供了Genericservlet之后,init方法还会实施吗?

-也将执行。将执行genericservlet类中的init方法。(即子类不执行父类)

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

-Tomcat服务器调用。

3.2改造Genericservlet案例12.2com中的代码.bjpowernode.javaweb.servlet2.GenericServlet

package com.bjpowernode.javaweb.servlet2;import jakarta.servlet.*;import java.io.IOException;///适配器模式改变Servletetet   12//改造Genericservleter  12//编写一个标准通用的Servlet,命名为GenericServlet,以后所有的Servlet类别都不会直接实现Servlet接口//以后所有的Servlet类别都会继承GenericServlet类别,Genericservlet是适配器publicic abstract class GenericServlet implements Servlet{    ///成员变量    private ServletConfig config;    /**     * ServletConfig在init方法中的对象是小猫创造的。     * 在init方法的参数中,这个ServletConfig对象属于局部变量。     * 在init方法的参数中,这个ServletConfig对象属于局部变量。     * 那么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  我们的Genericservlet继承了Servlet接口,实现了它的方法,而且最常用的service方法是抽象//所以我们的loginservlet继承genericservlet只需要实现service方法(因为它的抽象方法是抽象的// 必须实现,这正好适合我们的意思)因为实现service的代码更漂亮,不冗余publice 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.printlnServletconfig对象可以在service方法中获得 "+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_子类_02

3.3好消息Genericservlet不需要我们自己写,原码提供123.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//演示使用系统  12public 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_java_03