SpringBoot工程下Spring MVC技术分析

在大型软件系统设计时,业务一般会相对复杂,假如所有业务实现的代码都纠缠在一起,会出现逻辑不清晰、可读性差,维护困难,改动一处就牵一发而动全身等问题。生活和实际项目中对类似问题的解决方案往往“分而治之”的思想,以降低业务的复杂度,提高其可维护性。这就用到了分层架构设计,MVC设计思想诞生。


MVC:

1.分层设计思想
2.一种套路或设计模式
3.model view controller的缩写
3.1 model(业务逻辑对象)
3.2 view(显示逻辑对象)
3.3 controller(控制逻辑对象)


Spring中Web模块基于MVC设计思想做了落地的实现,其核心组件有:

1.DipatcherServlet(sprign mvc核心控制器)
2.RequestMapping(封装的请求映射->url到具体的handler及方法之间的映射)
3.Handler(请求处理器->负责处理Controller获取请求->可以将其理解为model)
4.ModelAndView(封装业务数据和视图信息的对象;一个handler方法就算没有Model,底层也会将view存储到ModelAndView中)
5.ViewResolver(负责视图模板解析的对象->View)


url请求的简易处理过程:

1.基于域名获取ip地址(127.0.0.1)
2.基于ip找到网络中的计算机(ip地址是网络中计算机的唯一标识)
3.基于端口找到tomcat服务(port是计算机中应用的唯一标识)
4.tomcat服务会基于thread并借助io读取网络http协议中请求数据
5.tomcat内部会创建请求(request)和响应(response)对象,用于封装请求和响应信息
6.tomcat会调用Filter对象对request数据进行过滤
7.Filter对request过滤以后,会将请求交给DispatcherServlet进行处理
8.DispatcherServlet读取请求中的url,并基于url从requestMapping中找到对应的handler以及方法
9.DispatcherServlet基于反射技术调用handler方法
10.DispatcherServlet会将handler方法返回的view等信息进行封装,然后交给视图解析器(ViewResolver)进行解析
11.视图解析器会为view添加前缀(templates)和后缀(.html),并将model中数据填充到view中
12.DispatcherServlet将视图解析器(ViewResolver)解析的结果封装到respones对象并将其响应到客户端

static 目录分析

1.可以存储内容:html,css,image
2.可以通过浏览器直接访问,但不能被spring中视图解析器进行解析
3.SpringBoot底层默认指定static目录,在访问时不需要在url路径中加上static目录


templates 目录分析

1.不能被网页之间访问,必须通过handler方法
2.html放在此目录,可以赋予html更多的功能(例如EL表达式,if分支语句,for循环语句)
3.相同url,此目录的优先级更高
4.存储html模板文件

SpringBoot工程中的static和templates目录中的html,默认对其内容修改后,不重启服务,只刷新网页是看不到修改的内容的。如果想修改后不用重启服务就能看到内容需要做如下操作:
1.修改idea默认配置,允许自动编译,如图所示:

2.如果是templates目录下的还需要在SpringBoot工程的配置文件中配置:

响应数据的处理

响应的数据有静态数据-html/css/js/images,动态数据-业务数据。这些数据一般封装到ModelAndView中,通过model封装业务数据,通过view封装html页面。

Model

存储了View中需要呈现的数据的对象,model底层是Map

thymeleaf

是一个以html为模板的模板引擎,此引擎为htmk元素添加额外属性并进行解析,然后对其进行赋能。SpringBoot工程中对thymeleaf做了默认的支持与配置。SpringBoot工程中thymeleaf默认的前后缀分别是:
1.前缀spring.thymeleaf.prefix=classpath:/templates/
2.后缀spring.thymeleaf.suffix=.html

响应的业务数据转换为Json格式字符串写到客户端

Json是一种支持跨端需求的轻量级数据格式(例如{"key":Value1;"Key2":"Value2"});
转换为Json格式是为了跨端,为了解析更方便;
SpringBoot工程默认使用的是jackson这一组api将响应的业务数据转换为Json格式的,这组依赖是在添加了Spring Web依赖之后自动引入的。
这个Json格式的字符串会写到http协议的响应体中,然后响应到客户端

若业务数据是pojo对象,那么在转换为Json格式的时候会默认调用pojo对象的get方法,会使用get方法名中get单词后面的名字作为key(首字母小写),get方法的返回值作为value,拼接json格式字符串,如果pojo对象中没有提供get方法,就会报异常。方法要用@ResponseBody描述。

若业务数据是map时,那么在转换为Json格式的时候也是用了jackson这组api,objectMapper.writeValueAsString(map);转换为字符串。方法要用@ResponseBody描述。

请求参数的处理

传统的java web应用,在servlet中获取请求数据,我们是用HttpServletRequest对象获取请求中的utl,参数等相关信息(request.getParameter("...")),当我们获取到这些参数后或许还要进行参数的解析和转换等操作。请求参数的获取,解析,封装这样的过程,在我们的程序中可能会反复出现。

在SpringBoot工程中Web请求参数的处理:
1.在控制逻辑方法参数中基于直接量(String,8种封装类,Date)接收请求数据
1.1直接量的方式方法的参数的变量必须和url请求的参数名一致
1.2假如方法要接收日期格式对象可以通过@DateTimeFormat注解指定可以接收的日期格式,默认格式为yyyy/MM/dd
1.3假如在方法中需要指定这个参数的值必须在请求参数中有传递
@RequestParam注解用于描述方法参数,用于定义参数规则
a.方法参数变量的值,来自哪个请求参数
b.方法参数变量是否可以不传值,例如@RequestParam(required=true)

为什么方法的参数的变量url请求的参数名一致,也用@RequestParam注解来描述?
因为早期JDK中根本就拿不到方法中参数变量的名字,即使方法的参数的变量url请求的参数名一致。

如果处理请求的方法的参数变量有两个,得在@RequestParam注解的括号中添加value=,指定是给哪个变量赋值的

2.在控制逻辑方法参数中基于POJO对象接收请求数据
2.1当使用pojo对象封装请求参数信息时,请求中的参数名应与方法参数pojo对象中的set相关方法相匹配

3.在控制逻辑方法参数中基于Map对象接收请求数据
3.1使用map作为方法参数封装请求数据,默认是不可以的,数据是获取不到的,因为默认是封装响应数据的,可以借助@RequestParam对map进行描述

4.rest风格url中的参数
rest风格:软件架构编码风格(跨平台)
rest风格url的定义:/path/{var1}/{var2},这里的{}括起来的为变量
@PathVariable注解描述方法的参数变量时,表示这个参数的变量的值来自url中{}表达式给定的值

你可能感兴趣的