在大型软件系统设计时,业务个别会绝对简单,如果所有业务实现的代码都纠缠在一起,会呈现逻辑不清晰、可读性差,保护艰难,改变一处就牵一发而动全身等问题。生存和理论我的项目中对相似问题的解决方案往往“分而治之”的思维,以升高业务的复杂度,进步其可维护性。这就用到了分层架构设计,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中{}表达式给定的值