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