在大型软件系统的设计中,业务一般都比较复杂。如果所有业务实现的代码都纠缠在一起,会导致逻辑不清,可读性差,维护困难。仅仅一根头发就可以移动整个身体和其他问题。生活和实际项目中类似问题的解决方案往往采用“分而治之”的思想来降低业务的复杂度,提高其可维护性。这就采用了分层架构设计,MVC设计思想由此诞生。MVC:1.分层设计思想2.一种例程或设计模式3.模型视图控制器的缩写3.1模型(业务逻辑对象)3.2视图(显示逻辑对象)3.3控制器(控制逻辑对象)Spring中的Web模块都是基于MVC的设计思路已经落地实现,其核心组件有:1.DipatcherServlet(sprinmvc核心控制器)2.RequestMapping(封装请求映射->url到具体的handler和方法映射)3.Handler(请求处理器->负责处理Controller获取请求->可以理解为model)4.ModelAndView(封装业务数据和view信息的对象;即使handler方法没有Model,底层也会将view存放在ModelAndView中)5.ViewResolver(负责view模板解析的对象->View)url请求的简单处理过程:1.根据域名获取ip地址(127.0.0.1)2.根据ip查找网络中的电脑(theip地址是计算机在网络中的唯一标识)3.根据端口找到tomcat服务(端口是应用程序在计算机中的唯一标识)4.tomcat服务会读取网络http中的请求数据protocolbasedonthreadandhelpofio5.tomcat内部会创建请求(request)和响应(response)对象,用于封装请求和响应信息6.tomcat会调用Filter对象过滤请求data7.Filter过滤请求后,将请求交给DispatcherServlet处理8.DispatcherServlet读取请求中的url,根据url从requestMapping中找到对应的handler和方法9.DispatcherServlet根据调用handler方法关于反射技术10.DispatcherServlet封装了handler方法返回的视图等信息,然后交给视图解析器(ViewResolver)进行解析11.视图解析器会添加前缀(模板)和后缀(.html)视图,模型中的数据将填充到视图中。12、DispatcherServlet将视图解析器(ViewResolver)解析出来的结果封装成response对象和响应客户端静态目录解析1.可以存放内容:html,css,image2.可以直接通过浏览器访问,但是不能被spring中的视图解析器解析3.SpringBoot底层指定静态directory默认,在访问目录时不需要在url路径中添加静态目录模板分析1.网页之间不能访问,必须通过handler方法访问2.HTML放在这个目录下,这可以给html更多的功能(比如EL表达式,ifBranch语句,for循环语句)3.同样的url,这个目录优先级更高4.在SpringBoot项目的static和templates目录下存放html模板文件。默认修改内容后,不重启服务,只刷新网页上看不到修改的内容。修改后如果想不重启服务就能看到内容,需要做以下操作:1.修改idea默认配置允许自动编译,如图:2.如果是在templates目录下就可以了还需要在SpringBoot项目的配置文件中配置:响应数据处理响应数据包括静态数据-html/css/js/images,动态数据-业务数据。这些数据一般封装成ModelAndView,业务数据通过model封装,html页面通过view封装。Model存储了需要在View中呈现的数据对象。模型底层是Mapthymeleaf是一个以html为模板的模板引擎。该引擎向htmk元素添加附加属性,对其进行解析,然后对其进行授权。Thymeleaf在SpringBoot项目中是默认支持和配置的。thymeleaf在SpringBoot项目中默认的前缀和后缀是:1.前缀spring.thymeleaf.prefix=classpath:/templates/2。后缀spring.thymeleaf.suffix=.html如果想在html文件中使用thymeleaf标签,可以使用<也可以在html里面加上xmlns:th="https://www.thymeleaf.org">标签没有添加它。添加的目的是将响应迅速的业务数据转换成Json格式的字符串写入客户端。Json是一种支持跨端需求的轻量级数据格式(如{"key":Value1;"Key2":"Value2"});转成Json格式是为了跨端,更方便解析;SpringBoot项目默认使用jackson一套API将响应业务数据转换为Json格式。这组依赖是在添加SpringWeb依赖后自动引入的。这个Json格式的字符串会被写入到http协议的响应体中,然后响应给客户端。如果业务数据是pojo对象,转换为Json格式时会默认调用pojo对象的get方法,并使用get方法名get单词后面的名字作为key(首字母为小写),get方法的返回值作为value,拼接json格式字符串。如果pojo对象中没有提供get方法,就会报异常。该方法应使用@ResponseBody进行描述。如果业务数据是map,转成Json格式时也用到jacksonAPI,objectMapper.writeValueAsString(map);被转换为字符串。该方法应使用@ResponseBody进行描述。请求参数的处理传统的javaweb应用在servlet中获取请求数据。我们使用HttpServletRequest对象获取请求中的utl、参数等相关信息(request.getParameter("..."))。当我们获取到这些参数后,可能会进行参数解析、转换等操作。获取、解析、封装请求参数的过程在我们的程序中可能会反复出现。SpringBoot项目中Web请求参数的处理:1、控制逻辑方法参数中根据直接量(String、8个封装类、Date)接收请求数据1.1直接量法参数的变量必须与theurlrequest的参数名称相同//http://localhost/doParam02?id=100//当使用方法参数直接获取请求数据时,方法参数名称必须与请求相同parametername@RequestMapping("/doParam02")@ResponseBodypublicStringdoMethodParam(Integerid){//框架强度return"reuqestparamsid'svalueis"+id;}1.2如果方法要接收日期格式对象,可以通过@DateTimeFormat注解指定可接受的日期格式,默认格式为yyyy/MM/dd。如果方法参数是一个pojo对象,那么应用@DateTimeFormat注解来描述pojo对象中的set方法。//http://localhost/doParam04?startTime=2020/12/31//如果方法要接收日期格式对象,可以通过@DateTimeFormat注解指定可接受的日期格式//默认格式为yyyy/MM/dd@RequestMapping("/doParam04")@ResponseBodypublicStringdoMethodParam(@DateTimeFormat(pattern="yyyy-MM-dd")DatestartTime){//强度框架返回"reuqestparamsvalueis"+startTime;}1.3如果在方法中需要指定该参数的值必须在请求参数中传递,@RequestParam注解用于描述方法参数并定义参数规则:a.方法参数变量的值,它来自于哪个请求参数b。方法参数变量是否可以不传值,例如@RequestParam(required=true)/http://localhost/doParam05?name=tony&page=2//如果需要在方法中指定这个参数的值,必须传入请求参数//@RequestParam注解用于描述方法参数,用于定义参数规则//1.方法参数变量的值,从中请求参数//2。方法参数变量是否可以不传值,例如@RequestParam(required=true)//@RequestMapping(value="/doParam05",method=RequestMethod.GET)@GetMapping(value="/doParam05")@ResponseBodypublicStringdoMethodParam(Stringname,@RequestParamIntegerpage){//框架强度return"reuqestparamsvalueis"+name+";"+页面;}为什么方法参数的变量urlrequest的参数名是一致的,也是用@RequestParam注解描述的?因为方法中的参数变量名在早期的JDK中是没有的,即使方法中的参数变量url请求的参数名相同如果请求处理方法中有两个参数变量,必须在@RequestParam注解的括号中加上value=,指定给哪个变量赋值。2.控制逻辑方法参数中基于POJO对象接收请求数据2.1当使用pojo对象时封装请求参数信息时,请求中的参数名要与方法参数pojo对象中设置的相关方法匹配//================pojo对象方法===============================================================//http://localhost/doParam06?name=tony//当pojo对象是用于封装请求参数信息,请求中的参数名要与方法参数中设置的相关方法相匹配"+parameter.toString();}//@GetMapping("/doParam07")http://localhost/doParam07?name=tony&ids=1,99@PostMapping("/doParam07")@ResponseBodypublicStringdoMethodParam(RequestParameterparameter,Integer[]ids){return"reuqestparamsvalueis"+parameter.toString()+","+Arrays.toString(ids);}@PostMapping("/doParam010")@ResponseBodypublicStringdoMethodJsonParam(@RequestBodyRequestParameterparameter){return"reuqestparamsvalueis"+parameter.toString();}3.控制逻辑方法参数中基于Map对象接收请求数据3.1使用map作为方法参数封装请求数据,默认是不允许的,data是获取不到的,因为默认是封装响应数据的,你可以使用@RequestParam来描述mapData//================map对象方法=====================================================================//http://localhost/doParam08?code=1&message=ok//默认不允许使用map作为方法参数封装请求数据,获取不到数据,因为默认是封装响应数据的//你可以使用@RequestParam来描述map@PostMapping("/doParam08")@ResponseBodypublicStringdoMethodParam(@RequestParamMap
