一次http请求,后台如何抽象Controller使开发只关注业务实现

问题

优秀的框架,开发人员不需要关心技术细节,只需实现框架开放出来的入口,实现业务逻辑。那么,一次http请求,后台是如何抽象Controller入口类呢?

大致抽象步骤

  1. 发送一次 Http 请求,首先要找到服务器并监听的端口的服务
  2. 根据请求路径找到对应的 Controller 入口代码处理业务并返回数据

根据上边的步骤,有个哥们造了一个简易版的轮子,有兴趣可以看一下
https://github.com/feifa168/mytomcat

Tomcat

一般我们会把开发好的项目打包成 WAR 包,然后放进 Tomat 容器里跑,SpringBoot 框架内置了 Tomcat,直接运行 JAR 包就可以跑项目,Tomcat 的作用就是使http服务和具体项目分离开来

下边看看 Tomcat 执行了哪些操作

  1. 当发起一次 Http 请求时,浏览器和相应服务器上的 Tomcat 建立 TCP 连接,
  2. 根据请求去找Servlet容器里的servlet业务入口点并执行返回

其中,Servlet 是 Java 的一个规范,在一般的开发中,它用来连接 Servlet 容器和业务入口

下边我们看看代码的简单实现

public class MyServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response){
        PrintWriter pw = response.getWriter();
        pw.println("Hello World");
    }
}

service() 就是我们项目对于一个请求的入口,它是通过 Tomcat 去调用的。开发可以根据自己的需要在里面写代码,不过很快就会发现,该入口很臃肿冗余,例如,写完代码得到数据模型后,需要手动拼写数据和视图的绑定,而这些基本上其它接口都需要的。开发开始关注了很多跟业务无关的技术了,说明有待改进!

SpringMVC

这个时候 SpringMVC 该出场了,顾名思义,它是在 Spring 框架下基于 MVC 模型设计的

  1. C 是 Controller 控制器,是业务入口,负责链接 M 和 V
  2. M 是 Model 数据模型
  3. V 是 View 视图

不过现在前后端分离后,V 已经不用了,Controller 直接返回 Json 数据。前后端分离,对于开发人员又是一次抽象,抽象 View 给前端解决,后台 Java 只关注业务逻辑。这样层次的抽象,使后台开发人员关注核心功能,可解决更复杂的事情

下边看看 SpringMVC 框架的简略版流程图


image.png
  1. 浏览器发起请求,dispatcherServlet 收到进行转发
  2. 通过 HandlerMapping 路由找到 Controller 入口
  3. 执行完业务逻辑并返回 Model 数据模型
  4. ViewResolve 解析渲染数据,最终把数据返回浏览器

总结

到这里,我们看到在 SpringMVC 框架中,开发只需要关注入口 Controller 和业务开发,无需关注其它技术细节

越是优秀的框架,你越是感受不到它的存在,这就是层层抽象的魅力,如果你感觉代码很乱,很冗余,说明你的代码需要抽象了,这也是你成长的机会!


本文是基于自己理解写的,如果有错欢迎留言讨论

你可能感兴趣的:(一次http请求,后台如何抽象Controller使开发只关注业务实现)