FrameWork:Spring MVC

Spring MVC

MVC是什么?

分层设计思想

一种套路或设计模式

是Model(业务逻辑对象),View(显示逻辑对象),Controller(控制逻辑对象)单词的缩写

Spring MVC概述

Spring MVC是MVC设计思想在Spring框架中的一种实现,基于这样的思想,Spring框架设计了一些相关对象,用于更好的基于MVC架构处理请求和响应,简易架构如图:

1.png

核心组件:

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")一般应用于更新数据的请求方式定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值