BaseServlet的优点
减少servlet请求。
让前端的请求更加方便
具体原理
servlet在执行的时候,其实是在向上一层一层的查找service方法,这个service方法,在httpservlet中的实现就是调用具体的servlet的doget或者dopost方法。而baseservlet,继承httpservlet后重写了service方法,让继承自己的servlet,可以按照方法名实现多个请求。
##实现步骤
创建servlet的时候,不再继承HttpServlet,而是继承BaseServlet。只需要在servlet内创建各种方法即可。
前端在发送请求的时候。需要传入相应的servlet和方法名,如果没有方法名,BaseSerlvet会执行默认的execute方法,有方法名,baseservlet会执行相应servlet内的方法名的方法。
#baseservlet
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// localhost:8080/store/productServlet?method=addProduct
String method = req.getParameter("method");
System.out.println("获取到的方法是 ================="+method);
if (null == method || "".equals(method) || method.trim().equals("")) {
method = "execute";
}
// 注意:此处的this代表的是子类的对象
// System.out.println(this);
// 子类对象字节码对象
Class clazz = this.getClass();
try {
// 查找子类对象对应的字节码中的名称为method的方法.这个方法的参数类型是:HttpServletRequest.class,HttpServletResponse.class
Method md = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
//遍历出所有userservlet中的方法
if(null!=md){
String jspPath = (String) md.invoke(this, req, resp);
if (null != jspPath) {
req.getRequestDispatcher(jspPath).forward(req, resp);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 默认方法
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
System.out.println("我是默认方法我执行了!!!!!");
return null;
}
}```