问题
优秀的框架,开发人员不需要关心技术细节,只需实现框架开放出来的入口,实现业务逻辑。那么,一次http请求,后台是如何抽象Controller入口类呢?
大致抽象步骤
- 发送一次 Http 请求,首先要找到服务器并监听的端口的服务
- 根据请求路径找到对应的 Controller 入口代码处理业务并返回数据
根据上边的步骤,有个哥们造了一个简易版的轮子,有兴趣可以看一下
https://github.com/feifa168/mytomcat
Tomcat
一般我们会把开发好的项目打包成 WAR 包,然后放进 Tomat 容器里跑,SpringBoot 框架内置了 Tomcat,直接运行 JAR 包就可以跑项目,Tomcat 的作用就是使http服务和具体项目分离开来
下边看看 Tomcat 执行了哪些操作
- 当发起一次 Http 请求时,浏览器和相应服务器上的 Tomcat 建立 TCP 连接,
- 根据请求去找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 模型设计的
- C 是 Controller 控制器,是业务入口,负责链接 M 和 V
- M 是 Model 数据模型
- V 是 View 视图
不过现在前后端分离后,V 已经不用了,Controller 直接返回 Json 数据。前后端分离,对于开发人员又是一次抽象,抽象 View 给前端解决,后台 Java 只关注业务逻辑。这样层次的抽象,使后台开发人员关注核心功能,可解决更复杂的事情
下边看看 SpringMVC 框架的简略版流程图
- 浏览器发起请求,dispatcherServlet 收到进行转发
- 通过 HandlerMapping 路由找到 Controller 入口
- 执行完业务逻辑并返回 Model 数据模型
- ViewResolve 解析渲染数据,最终把数据返回浏览器
总结
到这里,我们看到在 SpringMVC 框架中,开发只需要关注入口 Controller 和业务开发,无需关注其它技术细节
越是优秀的框架,你越是感受不到它的存在,这就是层层抽象的魅力,如果你感觉代码很乱,很冗余,说明你的代码需要抽象了,这也是你成长的机会!
本文是基于自己理解写的,如果有错欢迎留言讨论