MVC架构模式
在C层的发展
控制器的核心代码
1. 接受 client 的请求
2. 调用业务对象(Service)
3. 跳转处理(流程控制,页面跳转)
- servlet
我们发现这样的servlet是存在问题的:每个请求 uri 都需要有一个servlet来处理,并且要配置servletMapping,如果工程较大,就会很麻烦(虽然我们可以进行一定的封装)
- SpringMVC
SpringMVC就是一个Spring容器,其中存放的是controller对象
SpringMVC 只用配置一个DispatcherServlet,其他请求会经过DispatcherServlet进行处理,流程图如下:
SpringMVC请求中怎么找到正确的Controller和方法的?
- XmlWebApplicationContext.refresh()执行过程中,annotation-driven元素匹配的解析器AnnotationDrivenBeanDefinitionParser会注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter的bean定义;
- RequestMappingHandlerMapping的懒加载对象实例化后,调用了afterPropertiesSet()方法,最终在afterPropertiesSet()方法执行完毕后将带有@RequestMapping注解的java类的相关信息设置到实例化之后的RequestMappingHandlerMapping对象中。也就是说相关请求对应的Controller类和方法的匹配条件在bean被加载完成后就已准备好。
- 所以结合DispatcherServlet处理请求的执行逻辑(doDispatch的执行流程),可以知道在获取Handle对象时确定了具体的Controller类和方法。
在V层的发展
模板引擎
-
JSP
引入了 JSTL标签库 和 EL表达式使得不需要在JSP代码中写Java代码,从一定程度上解耦
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSP 不能静态预览
-
thymeleaf
Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。可以用于Web与非Web应用.相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。
<html xmlns:th="http://www.thymeleaf.org">
springboot直接引入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
非springboot项目使用如下依赖:
<dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>2.1.4</version> </dependency>
静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调。springboot官方推荐。
# 我们可以发现上面的模板引擎,前端写好页面后,还是需要后端进一步的在页面中添加数据渲染视图。
一般传统上的开发协作模式有两种:
- 一种是前端先写一个静态页面,写好后,让后端去套模板。静态页面可以 本地开发,也无需考虑业务逻辑只需要实现View即可。不足是还需要后端套模板,这些前端代码后端需要浏览一遍,以免出错。
- 另一种协作模式是,前端直接去写模板,这样做的问题在于,前端编写过程中很依赖与后端环境,如果当后端没写完的情况下,前端几乎没法干活。
前后端分离
# 为了解决上面前后端耦合带来的种种不便,前后端分离的开发模式慢慢开始兴起
-
客户端渲染
单页模式
单页模式是前后端分离的一种应用。而单页应用最主要的特点就是`局部刷新`,这通过前端`控制路由调用AJAX`,后台提供接口便可以实现,而且这样的方式用户体验更加友好,网页加载更加快速,开发和维护成本也降低了不少,效率明显提升。
整个WEB项目只有一个页面,使用路由机制进行组件之间的切换
优点:客户端渲染、数据传输量少、减少服务器的压力
缺点:对 SEO 不友好、不利于搜索引擎收录快照
-
服务端渲染
将组件或页面通过服务器端生成HTML字符串,再发送给浏览器
优点:对SEO友好
缺点:数据传输量大,服务器压力大
# 看项目的要求,如果项目需要SEO友好,我们就使用SSR(可以用NUXT.js框架,基于VUE的SSR技术),对项目的性能要求高、页面加载速度快、不需要SEO,我们就是用SPA(VUE)
在M层的发展
我们在M层主要看持久层的发展
# 我们知道持久层是和数据库(这里主要指关系型数据库)来打交道的,每种数据库的实现都是有差异的,所以如果要用 Java来访问数据库,每种数据库都要实现自己的Java操作代码供开发人员使用。显然这样的学习成本以及维护成本是很 高的,SUN公司最终实现了一系列接口,要求各个数据库公司来实现这个接口,写Java访问自己数据库的解决方案。
- JDBC
-
连接池 + SpringJDBC
# 对原始JDBC的操作进行了简化,使得开发者将更多的注意力放在了SQL语句上
-
MyBatis
# 进一步封装,使得在开发大型项目的时候更加方便,提高了开发效率