资讯详情

适配器改造Servlet并优化

适配器改造Servlet并优化

先看默认实现Servlet接口代码:

package com.example.Java_Servlet;  import javax.servlet.*; import java.io.IOException;  public class Bservlet implements Servlet { 
                  @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() { 
              } }  

上述代码存在以下问题:

  • 实现默认情况Servlet界面中的方法需要重写,但界面中最常用的方法是service,如果只是简单的继承,代码就会变得冗长
  • init()方法中的ServletConfig是Tomcat创建了服务器,这个ServletConfig对象再init该方法属于局部变量,该对象必须在未来service()使用方法,但默认getServletConfig()返回值是null。我们需要获得这个对象

有必要提供相应的解决方案来解决上述问题

  • 首先,对于第一个问题,你可以写一个适配器来实现这一点Servlet所有类的方法,但设置为抽象类,常用的方法设置为抽象方法,然后编写servlet只要继承适配器类并重写所需的方法

    package com.example.Java_Servlet;  import javax.servlet.*; import java.io.IOException;  public abstract class GenericServlet implements Servlet{
           
             
        
    
        @Override
        public final void init(ServletConfig servletConfig) throws ServletException { 
              
    
        }
        public void init(){ 
              
    
        }
        
    
        @Override
        public ServletConfig getServletConfig() { 
              
            return config;
        }
    
        @Override
        public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)
                throws ServletException, IOException;
    
    
        @Override
        public String getServletInfo() { 
              
            return null;
        }
    
        @Override
        public void destroy() { 
              
    
        }
    }
    
    
  • 对于第二个问题,只要设置一个私有的成员变量ServletConfig,并在init()方法中将其初始化为init方法中的config参数即可

    package com.example.Java_Servlet;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public abstract class GenericServlet implements Servlet { 
              
        private ServletConfig config;
    
        @Override
        public final void init(ServletConfig servletConfig) throws ServletException { 
              
            this.config=servletConfig;
            this.init();
    
        }
        public void init(){ 
              
    
        }
        //这样子类依然能够重写init()方法并且不会修改原来的代码
    
        @Override
        public ServletConfig getServletConfig() { 
              
            return config;
        }
    
        @Override
        public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)
                throws ServletException, IOException;
    
    
        @Override
        public String getServletInfo() { 
              
            return null;
        }
    
        @Override
        public void destroy() { 
              
    
        }
    }
    
    
  • 这里还有一个小的改变,就是因为init()方法一般是不建议重写的,所以我们将该方法添加了final限制,但是由于实际情况中并不是一定不调用该方法,所以我们有编写了一个init()方法,并在init()方法中进行里初始化。这样,即使要调用init()方法,也并不会修改原有的配置

标签: 角度传感器适配器的防脱出结构

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台