BaseServlet ——servlet的优化

servlet作用

艰深来讲servlet专门用来接管客户端的申请,专门接管客户端的申请数据,而后调用底层service解决数据并生成后果

传统的书写servlet的办法

从图片中看到,咱们只是有两个类,一个用户类,一个工作类,而性能很是简略,登录注册、增加批改查问工作,而servlet的就曾经是五个了,所以当前咱们一个性能一个servlet,那就会十分冗余,并且用户和工作的servlet写在了一起,不好分别什么是什么,加大了前期保护的难度。

优化思路

MVC三层架构

那咱们能不能设计一个容易治理的办法,便于对立治理呢?

参照咱们MVC三层架构中的service和dao层

咱们来试着和他们一样,一个具体的类用一个对应的dao或service类来治理。咱们便设计了BaseServlet。是不是感觉清晰了很多了呢。

而后每一个模块中的性能都形象为一个办法。(图为UserServlet中的办法)

而后咱们前端的申请门路这样写

servlet运行过程

客户端发送申请——init初始化servlet——调用service办法,自动识别post或是get申请办法。咱们下面设计了每一个性能都作为一个办法,那咱们要怎么去自动识别是哪一个办法呢?咱们想到了反射。那咱们来联合service办法和反射,去革新,让他自动识别是哪一个办法。

优化过程

  1. 原先咱们是间接类继承HttpServlet,当初咱们多了一层BaseServlet,那咱们原来的类就要继承BaseServlet,而后BaseServlet去继承HttpServlet,而后重写外面的service办法。
/*BaseSevlet继承HttpServlet*/public class BaseServlet extends HttpServlet {     @Override    protected void service(HttpServletRequest req, HttpServletResponse resp) {        //1.先获取申请门路        String requestUrl = req.getRequestURI();        //2.获取申请门路的最初的办法名称(详见上文url图片)        int index = requestUrl.lastIndexOf('/');        String methodName = requestUrl.substring(index + 1);        //3.获取调用对象的字节码文件        Class<? extends BaseServlet> clazz = this.getClass();        try {            //4. 通过办法名,获取类中的办法。            Method method = clazz.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);            //5. 执行办法            method.invoke(this, req,resp);        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {            e.printStackTrace();        }    }}
  1. 原来的类继承BaseServlet
/** * @program: BaseServlet * @description: * @author: stop.yc * @create: 2022-04-13 15:42 **///user下的,*代表任意@WebServlet("/user/*")public class UserServlet extends BaseServlet{    /**    * @Description: 登录servlet    * @Param: [req, resp]    * @return: void    * @Author: stop.yc    * @Date: 2022/4/13    */    public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {        //1.获取前端数据(post)申请体        BufferedReader reader = req.getReader();        String userStr = reader.readLine();                  //2......    }}
  1. 前端申请写法
//仅是url的举例,具体其余代码按照你的代码。axios({    method: "post",    url: "http://localhost:8080/qg-engineering-management-system/user/login",    data: _this.user,}).then(function (resp) {    //。。。}