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