Spring MVC
MVC是什么?
分层设计思想
一种套路或设计模式
是Model(业务逻辑对象),View(显示逻辑对象),Controller(控制逻辑对象)单词的缩写
Spring MVC概述
Spring MVC是MVC设计思想在Spring框架中的一种实现,基于这样的思想,Spring框架设计了一些相关对象,用于更好的基于MVC架构处理请求和响应,简易架构如图:
核心组件:
DispatcherServlet(Spring MVC中核心控制器-Controller)
RequestMapping(封装的求情映射–>url到具体handler及方法之间的映射)
Handler(请求处理器–>负责处理Controller获取请求–>可以将其理解为model)
ModelAndView(封装了业务数据和视图信息的对象)
ViewResolver(负责模板视图解析的对象–>View)
Spring Web模块请求的处理过程
1、基于域名获取ip地址
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等相关信息进行封装,然后交给视图解析器进行解析
11、ViewResolver视图解析器对view name添加前缀,后缀,并将model中数据填充到view中
12、DispatcherServlet将摄图解析器解析的结果封装到response对象,并将其响应到客户端
SpringBoot工程中响应数据的处理
响应的数据都有什么?(
静态资源数据-html/css/js/images;动态数据-业务数据)
响应数据的封装(ModelAndView)
通过model封装业务数据
通过view对象封装html页面
响应数据转换为JSON格式写到客户端
什么是JSON?
答:一种数据格式:{“key1”:“Value1”,“Key2”:“Value2”}
为什么要转换为json字符串?
答:跨平台-跨端,解析方便
将方法返回值map,pojo对象抓换为json写到客户端
@ResponseBody//当使用这个注解描述控制层的handler方法时,假如此方法的返回值为map或者pojo这样对象时,系统底层会将这样的对象转换为json格式字符,然后响应到客户端
public Map<String,Object> doConvertToJson(){
Map<String,Object> map = new HashMap<>();
map.put("state", 1);
map.put("message","ok");
return map;
}
SpringBoot工程web请求参数的处理
直接量方式(八种基本数据类型或者封装类,字符串类型,日期类型,数组)
@RequestMapping("doParam01")
public String doMethodParam(HttpServletRequest request){
String idStr = request.getParameter("id");
int id = Integer.parseInt(idStr);
return "request params id's value is"+id;
}
@RequestMapping("doParam02")
public String doMethodParam(Integer id){
return "request params id's value is"+id;
}
@RequestMapping("doParam03")
public String doMethodParam(Integer[] id){
return "request params id's value is"+ Arrays.toString(id);
}
@RequestMapping("doParam04")
public String doMethodParam(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){
return "request params date's value is"+ date;
}
//http://localhost/doParam05?name=zhangsan&age=18
//加入在方法参数中需要指定某个参数的值必须在请求参数中有传递
//@RequestParam注解用于描述方法参数,用于定义参数规则
//1)方法参数变量的值,来自哪个请求参数
//2)方法参数变量是否可以不传值
@RequestMapping("doParam05")
public String doMethodParam(@RequestParam("username") String name,@RequestParam(required = true) Integer age){
return "request params param's value is "+ name+":"+age;
}
pojo对象方式(要求pojo对象中提供与请求参数匹配的set方法)
//当使用pojo对象封装请求参数信息时,请求中的参数名应与方法参数pojo对象中的set相关方法相匹配
@GetMapping("/doParam06")
public String doMethodParam( RequestParameter param){
return "request params param's value is "+ param.toString();
}
//http://localhost/doParam07?name=tony&ids=1,2,3
//@GetMapping("/doParam07")
@PostMapping("/doParam07")//http://localhost/doParam07
public String doMethodParam( RequestParameter param,Integer[] ids){
return "request params param's value is "+ param.toString()+","+Arrays.toString(ids);
}
map对象方式(需要使用指定注解方法中map类型参数进行描述)
//http://localhost/doParam08&code=1&message=ok 假如以这样方式直接在游览器地址栏访问会报405异常
//post请求可以借助postman工具进行访问
//使用map作为方法参数封装请求数据,默认是不可以,因为默认底层会认为用于封装响应数
//可以借助@RequestParam对map进行描述,来接收请求参数
@PostMapping("/doParam08")
public String doMethodParam(@RequestParam Map<String,Object> map){
return "request params param's value is "+ map.toString();
}
@PostMapping("/doParam09")
public String doMethodDoMapParam(@RequestBody Map<String,Object> map){
return "request params param's value is "+ map.toString();
}
Rest风格的url中的参数
//rest风格:软件架构编码风格(跨平台)
//rest风格url的敌不过一:/path/{var1}/{var2}。这里的{}括起来的为变量
//@PathVariable注解描述方法参数变量时,表示这个参数的值来自url{}表达式给定值
@GetMapping("doParam10/{id}/{name}")
public String doMethodResturParam(@PathVariable Integer id,@PathVariable String name){
return "request param's value is "+id +",name"+name;
}
常见问题
1.templates目录存储什么文件?
答:html模板文件
2.templates目录的html页面可以在游览器直接访问吗?
答:不可以
3.static目录下一般可以放什么资源?
答:html/css/js/images
4.templates目录和static目录下放的html有什么不同?
答:
static目录下的html可以直接在游览器访问但不能被spring中视图解析器进行解析
templates目录的html页面不可以在游览器直接访问但可以被spring的视图解析器进行解析,从而为html赋予更多的能力(例如thymeleaf表达式,分支语句,循环语句,…)
5.thymeleaf是什么?
答:是一个以html作为模板的模板引擎,次引擎为html元素添加额外属性并进行解析,然后对其进行赋能。springboot工程中对thymeleaf做了默认的支持与配置
6.Springboot工程中thymeleaf默认的前缀和后缀配置分别是什么?
答:
前缀:spring.thymeleaf.prefix=classpath:/templates/
后缀:spring.thymeleaf.suffix=.html
7.SpringBoot工程中的static和templates目录中的html,默认对其内容修改以后,不重启服务,然后刷新访问地址,可以看到修改的内容吗?
答:不可以(想看到,需要修改idea和springboot的配置文件)
假如是static目录,则需要让项目支持自动编译(build)和运行时编译(compoler.automake.allow.when.app.running)
假如是templates目录,则需要在以上两个步骤的基础上,添加一个缓存配置(spring.thymeleaf.cache=false)
8.ModelAndView是什么?
答:Spring MVC模块中默认提供一个封装响应数据的对象
9.ModelAndView一般应用在什么场景?
答:响应数据既包含view又包含model
10.JSON是什么?
答:就是一种支持跨端需求的轻量级数据格式而已
11.SpringBoot工程中默认是如何将pojo,map等类似对象转换为json格式字符串?
答:借助jackson
12.@ReponseBody注解的作用是什么?
答:描述Handler中的方法,用于告诉底层应该如何对方法的返回值进行处理,例如此诸结描述的方法,其返回值肯定不是view,同时告诉底层方法返回值的转换结果最重要写到响应体,然后传输到客户端
13.@RestController注解的作用是什么?
答:描述Handler类型,用于定义此类是一个Controller请求处理对象,同时类中所有方法都默认添加@ResponseBody注解
14.Spring MVC控制层方法中的参数值都来自于哪个对象?
答:request
15.Spring MVC控制层方法参数中常用注解?
答:@RequestParam(定义参数规则,例如参数是否可选,指定获取那个参数的值)
@DateTimeFormat(定义可以获取的日期的日期格式)
@RequestBody(表示参数可以接收客户端post请求提交的json原生数据)
@PathVariable(表示参数的值来自url中{}表达式中的数据)
16.Spring MVC控制方法上定义请求方式,请求url的注解?
答:@RequestMapping(value=“doGet”,method=RequestMethod.GET)
@GetMapping("/path")一般应用于查询数据的请求方式定义
@PostMapping("/path")一般应用于添加数据的请求方式定义
@DeleteMapping("/path")一般应用于删除数据的请求方式定义
@PutMapping("/path")一般应用于更新数据的请求方式定义