BaseServlet ——servlet的优化

266 阅读2分钟

BaseServlet ——servlet的优化

servlet作用

通俗来讲servlet专门用来接收客户端的请求,专门接收客户端的请求数据,然后调用底层service处理数据并生成结果

传统的书写servlet的方法

image-20220505003321287

从图片中看到,我们只是有两个类,一个用户类,一个任务类,而功能很是简单,登录注册、添加修改查询任务,而servlet的就已经是五个了,所以以后我们一个功能一个servlet,那就会非常冗余,并且用户和任务的servlet写在了一起,不好辨别什么是什么,加大了后期维护的难度。

优化思路

MVC三层架构

那我们能不能设计一个容易管理的方法,便于统一管理呢?

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

image-20220505004011774

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

image-20220505004138947

然后每一个模块中的功能都抽象为一个方法。(图为UserServlet中的方法)

image-20220507232843105

然后我们前端的请求路径这样写

image-20220509203523223

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) {
     //。。。
 }

\