BaseServlet ——servlet的优化

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) {
	//。。。
}
posted @ 2022-05-09 22:18  stopyc  阅读(39)  评论(0编辑  收藏  举报