BaseServlet详解
1、BaseServlet的作用
知其然,知其所以然,要用好一个东西必然是需要去了解它的作用与目的,BaseServlet是一个工具类,它不被直接调用而是用于被其余Servlet继承,因此不需要注解,目的是为了降低servlet冗余,可以将多个方法写到同一个servlet,通过子类继承BaseServlet,子类来获取前端需要调用servlet中的那一个方法,而未继承BaseServlet的时候对同一个类的每种操作(增、删、改、查)均需要一个Servlet去实现(一个doGet/doPost只能实现一种方法)。
2、BaseServlet的具体实现
我就不多说废话了,下面是我的BaseServlet的具体实现,内附有超详细注释。
public class BaseServlet extends HttpServlet {
/*
* init用于servlet初始化时调用,只调用一次,后续再次请求将不会再次调用init
* service:每次请求servlet时都会调用service
* service方法会调用doGet、doPost方法(HTTPServlet重写了service方法调用了doGet、doPost)
* 重写了Service就可以不重写doGet、doPost,直接在service中进行了处理
*
* 继承BaseServlet的子类servlet会自动调用service方法
* */
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取传来的方法名字,要知晓需要使用哪个方法
String methodName = req.getParameter("method");
Method method = null;
try {
/*
* Class<? extends BaseServlet> aClass = this.getClass();
* this.getClass()获取当前servlet类的class类对象,
* 进行了泛型约束Class<? extends BaseServlet>, 获取的是BaseServlet或者其子类的类对象
*/
/* getMethod(methodName,HttpServletRequest.class, HttpServletResponse.class);
* 获取方法对象(method类对象),需要的参数:需要获取的方法的方法名、HttpServletRequest.class, HttpServletResponse.class
*/
Class<? extends BaseServlet> aClass = this.getClass();
method = aClass.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
/*
* this:当前类,使用service方法的类,这里是继承BaseServlet的类
* method.invoke在this这个类中调用method方法
*/
method.invoke(this, req, resp);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
以上所有内容均为个人见解,如有错误欢迎批评与指正,更欢迎广大同胞们表达自己的看法共同进步。