适配器改造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()方法,也并不会修改原有的配置