• 【Spring】SpringWebMVC入门


    什么是SpringWebMVC

    Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"SpringMVC".

    MVC定义

    MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分

    在这里插入图片描述
    • View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
    • Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
    • Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型
    来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型

    什么是SpringMVC

    MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外,SpringMVC还是⼀个Web框架.总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.

    不过Spring在实现MVC时, 也结合⾃⾝项⽬的特点, 做了⼀些改变, 相对⽽⾔, 下⾯这个图或许更加合适⼀些.

    在这里插入图片描述

    学习SpringMVC

    既然是 Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应.

    建立连接

    在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤

    
    
    • 1

    @RequestMapping注解

    @RequestMapping 是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的
    路由映射的.表⽰服务收到请求时, 路径为 /sayHi 的请求就会调⽤ sayHi 这个⽅法的代码

    路由映射: 当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射

    @RequestMapping使用

    @RequestMapping 即可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅
    法路径

    @RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
    @RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息

    @RequestMapping 既⽀持Get请求, ⼜⽀持Post请求. 同理, 也⽀持其他的请求⽅式.

    请求

    访问不同的路径,就是发送不同的请求,可能会带有一些参数,这里主要学习如何传递参数到后端以及后端是如何接收

    传递单个参数

    @RequestMapping("/m1")
        public String m1(String name){
            return "接收到的参数name:"+name;
        }
    
    • 1
    • 2
    • 3
    • 4

    使用基本类型来接收参数时,参数必须传递(除了boolean)类型,否则会报500错误
    类型不匹配时会报400错误

    对应于包装类型,如果不传对应参数,Spring接收到的数据则为null 所以对于参数可能为空的数据,建议使用包装类型

    传递多个参数

    和接收单个参数一样,直接使用方法的参数接收即可,使用多个形参

    @RequestMapping("/m2")
    public String m2(String name, Integer age){
        return "接收到的参数name:"+name + ",age:"+age;
    }
    
    • 1
    • 2
    • 3
    • 4

    当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此番薯的位置是不影响后端获取参数的结果的

    传递对象

    如果参数比较多时,声明方法就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明,我们不妨把这些参数封装为一个对象

    SpringMVC 也可以自动实现对象参数的赋值,比如一个Person对象

    public class Person {
        Integer id;
        String name;
        Integer age;
    
        @Override
        public String toString() {
            return "Person{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    传递对象代码

    public String m4(Person person){
        return "接收到的参数person:"+person.toString();
    }
    
    • 1
    • 2
    • 3

    Sprng会根据参数名称自动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值默认初始值)

    后端参数重命名

    某些特殊情况下,前端传递的参数key和我们后端接收的key可以不一致,比如前端传递了一个name给后端,而后端是使用username字段来接受的,这样就会出现参数接收不到的情况,此时就可以使用@RequestParam来重命名前后端的参数值

    @RequestMapping("/m5")
    public String m5(@RequestParam(value = "name", required = false) String username){
        return "接收到的参数name:"+username;
    }
    
    • 1
    • 2
    • 3
    • 4

    传递数组

    @RequestMapping("/m6")
    public String m6(String[] arrayParam){
        return "接收到的参数arrayParam:" + Arrays.toString(arrayParam)+"长度:" + arrayParam.length;
    }
    
    • 1
    • 2
    • 3
    • 4

    请求参数名与形参数组名称相同,且请求为多个,后端定义数组类型即可接收参数

    传递集合

    和数组类似,同一个请求参数名有为多个,且需要@RequestParam绑定参数关系

    //传递集合
    //默认是字符串数组,加@RequestParam注解 即可接受为list
    @RequestMapping("/m7")
    public String m7(@RequestParam(required = false) List<String> listParam){
        return "接收到的参数listParam:" + listParam + "长度:" + listParam.size();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    传递JSON

    JSON本质上是一个字符串,通过文本来存储和描述数据

    springmvc框架也集成了JSON的转换工具,我们可以直接使用,来完成JSON字符串和Java对象的互转

    //接受json字符串
    //加@RequestBody注解
    @RequestMapping("/m8")
    public String m8(@RequestBody Person person){
        return "接收的数据person:" + person.toString();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    获取URL中参数@pathVariable

    pathVariable:路径变量 主要作用在请求URL路径上的数据绑定

    //获取url中的参数
    //参数前加@PathVariable注解
    @RequestMapping("/m9/{userId}/{name}")
    public String m9(@PathVariable Integer userId,@PathVariable("name") String usernam
        return "url中的参数userId:" + userId + "username:" + username;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上传文件@RequestPart

    //上传图片
    @RequestMapping("/m10")
    public String m10(@RequestPart("file") MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("D:\\"+file.getOriginalFilename()));
        return "success";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    获取Cookie/Session

    获取Cookie
    传统方式

    使用servlet原生api

    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
          for (Cookie cookie : cookies) {
              System.out.println(cookie.getName() + ":" + cookie.getValue());
          }
        Arrays.stream(cookies).forEach(cookie -> {
            System.out.println(cookie.getName() + ":" + cookie.getValue());
        });
        return "success";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    springmvc注解方式
    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue String username, @CookieValue Integer age){
        System.out.println(username);
        System.out.println(age);
        return "success";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    获取Session
    传统方式
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        //true 如果不存在 则创建session
        //false 不创建session
        //默认为true
        session.setAttribute("username","zhangsan");
        return "success";
    }
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        HttpSession session = request.getSession(false);
        if(session != null){
            String username = (String) session.getAttribute("username");
            return "用户:"+username;
        }
        return "session为空";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    @SessionAttribute注解获取
    @RequestMapping("/getSession2")
    public String getSession2(@SessionAttribute(required = false) String username){
        return "username:" + username;
    
    
    • 1
    • 2
    • 3
    • 4
    springmvc内置对象
    @RequestMapping("/getSession3")
    //等同于HttpSession session = request.getSession(true);
    //会创建一个session
    public String getSession3(HttpSession session){
        session.setAttribute("password",123);
        String username = (String) session.getAttribute("username");
        Integer password = (Integer) session.getAttribute("password");
        return "用户:"+username + "password:" + password ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    获取header

    使用servlet原生api
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        String userAgent = request.getHeader("user-Agent");
        return "user-Agent:" + userAgent;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    使用springmvc
    @RequestMapping("getHeader2")
        public String getHeader2(@RequestHeader("user-Agent") String userAgent){
            return "userAgent" + userAgent;
        }
    
    • 1
    • 2
    • 3
    • 4

    响应

    返回静态页面

    此时要将RestController换成Controller

    @RequestMapping("/index")
    public String returnIndex(){
        return "/index.html";
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    返回数据@ResponseBody

    //返回视图所需要的数据
    @ResponseBody
    //RestController = ResponseBody + Controller
    @RequestMapping("/returnData")
    public String returnData(){
        return "返回视图所需要的数据";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    @ResponseBody 既是类注解, ⼜是⽅法注解
    如果作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 如果作⽤在⽅法上, 表⽰该⽅法返回的是数据

    返回HTML代码片段

    后端返回数据时,如果数据中有HTML代码,也会被浏览器解析

    //返回HTML代码片段
    @ResponseBody
    @RequestMapping("/returnHtml")
    public String returnHtml(){
        return "

    返回html片段

    "; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    返回JSON

    后端方法返回结果为对象

     //返回json
     //当我们的接口返回的是String时 content-type是text/html
     //当我们的接口返回的是对象和map时,content-type自动设置为application/json
     @ResponseBody
     @RequestMapping("/returnJson")
     public Person returnJson(){
         Person person = new Person();
         person.setId(1);
         person.setAge(18);
         person.setName("zhangsan");
         return person;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    设置状态码

    //设置状态码
    @ResponseBody
    @RequestMapping("/setStatus")
    public String setStatus(HttpServletResponse response){
        response.setStatus(401);
        return "设置状态码";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    设置header

    //设置body
    @ResponseBody
    @RequestMapping(value = "/r1" , produces = "application/json;charset=utf-8")
    public String r1(HttpServletResponse response){
        //设置header
        response.setHeader("myhead","myhead");
        return "{'OK' : 1}";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Doris入门了解
    微信小程序数据绑定和条件渲染
    uniapp h5 端 router.base设置history后仍有#号
    当遇到第一个不满足条件的元素后返回这个元素及之后的各元素itertools.dropwhile()
    RabbitMQ之集群方案原理
    C++ STL(十) --------- 位图模拟实现
    2022年中高级Android面试知识点记录
    中秋发祝福?一套程序让你成为【相亲相爱一家人】群里最靓的仔
    抽象类和接口(Abstract and Interface)精湛细节
    ElasticSearch - 分词器
  • 原文地址:https://blog.csdn.net/m0_72670269/article/details/134190567