Spring MVC上篇

在这里插入图片描述

🍌 一.什么是Spring MVC

Spring Web MVC是基于Servlet API构建的原始Web框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。前面学习了Spring Boot,其是为了快速开发Spring而创建的框架,其本质也是spring,所以现在大部分Java项目都是基于Spring(或 Spring Boot)的,而Spring的核心就是Spring MVC,也就是说Spring MVC 是Spring框架的核心模块,那么MVC代表什么呢?
MVC是Model View Controller的缩写,这其实是一种设计模式,这种设计模式将软件(项目)分成三部分:模型,视图和控制器,下面是一个项目和用户的具体交互过程:

在这里插入图片描述
通过这样的MVC设计模式就可以实现一个web项目,那么MVC和Spring MVC又有什么关系:MVC是一种设计思想,而Spring MVC是具体的实现框架!
总结一下:Spring MVC其实就是一个基于MVC设计模式和Servlet API实现的web项目,同时Spring MVC又是Spring框架中的一个Web模块,它是随着Spring的诞生而存在的一个框架!


🍌 二.Spring MVC 创建和连接

Spring MVC项目的创建和Spring Boot项目的创建其实是差不多的,在创建项目的时候,选择了Spring Web就相当于创建了Spring MVC项目!

🍓 1.实现用户和程序的映射

🍉 1.1.使用注解@RequestMapping

@Controller
@ResponseBody
public class UserController {

    @RequestMapping("/func")
    public String func(){
        return "Hello,world!";
    }
}

这里是需要加上@ResponseBody的,否则就会认为你返回的是一个静态页面,就会去查找到底有没有这个页面,如果没有的话就会404了,因此这里是需要加上这个注解的,这样才能访问到这个页面,这其实是一个遗留的问题。
在这里插入图片描述在这里插入图片描述
而通过抓包工具可以发现这个是一个get请求(使用浏览器直接访问的一般都是get请求),那有没有办法构造post请求呢?答案是肯定的!


@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    @RequestMapping(value = "/func",method = RequestMethod.POST)
    public String func(){
        return "Hello,world!";
    }
}

通过这样的参数设计就可以将请求设置为post请求了,其他类型的请求也是可以进行设置的,下面可以通过postman来看一下这个到底是不是post请求:
在这里插入图片描述
在这里插入图片描述
可以发现这个请求已经是post请求了

🍉 1.2.使用注解@PostMapping

@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    @PostMapping("/func2")
    public String func2(){
        return "我是post请求!";
    }


}

在这里插入图片描述
在这里插入图片描述
这样构造出来的一定是post请求

🍉 1.3使用注解@GetMapping

@Controller
@ResponseBody //返回一个非静态页面
public class UserController {

    @GetMapping("/func3")
    public String func3(){
        return "我是get请求!";
    }
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

🍓 2.服务器端得到用户的请求参数

🍉 2.1.获取单个参数

这里在参数里面传一个id值,

@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    @RequestMapping("/getuserbyid")
    public User getUserById(Integer id){  //这里一定使用包装类,可以避免为空的异常
        //这里不查询数据库,直接返回
        User user = new User();
        user.setId(id);
        user.setUsername("张三");
        user.setPassword("123");
        user.setAge(19);
        return user;

    }
}

在这里插入图片描述
在这里插入图片描述
抓包工具里面也可以发现其响应结果正是这样的数据,另外这里传递的参数一定是要和前端传递的参数一致的,否则就无法进行参数的传递!

🍉 2.2.获取多个参数

这里也是可以传递多个参数的:

@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    @RequestMapping("/login")
    public String login(String username,String password){
        return "username: " + username + " | password: " + password;
    }
}

在这里插入图片描述
在这里插入图片描述
但是当参数过多的话,在使用这样的方式来进行传递,每次增加的参数,都需要再参数列表里面进行传递,这显然是不合适的,那么有什么更好的方法嘛?当然这里也是可以传递一个对象的!

🍉 2.3.获取对象


@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    
    @RequestMapping("/reg")
    public String reg(User user){
        return "用户信息: " + user; 
    }
}

在这里插入图片描述
在这里插入图片描述
这里就可以发现传递一个对象也是可以的,而Spring内部会根据返回的信息来自己设置返回类型,这也是Spring非常厉害的一个地方吗,另外通过form表单参数传递/传递多个参数也是可以的,这里就不详细介绍了!

🍉 2.4.后端参数重命名

如果前端传递过来的参数,不符合后端的需要,后端也是可以对前端传递过来的参数进行重名的!这里使用一个@RequestParam就可以解决了:

@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    //RequestParam里面放着前端传递的参数,后面是后端要重命名的参数
    @RequestMapping("/set")
    public String set(@RequestParam("name") String username){
        return username;
    }

在这里插入图片描述
在这里插入图片描述

前端传递的参数是name,但是在后端可以使用username,这样就可以进行了重命名!
而当使用了@RequestParam之后,传递过来的参数就不能是空的了,如果是空的话就会直接报错了,想要让其可以传递空的参数的话,可以将@RequestParam里面的属性required = false就可以传递空的参数了!

🍉 2.5.获取JSON对象

此时就不能再使用接收普通对象来接收了,此时就需要使用@RequestBody注解了,@RequestBody表示从前端接收过来的数据是JSON形式的

@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    @RequestMapping("/getjson")
    public String getJson(@RequestBody User user){
        return "用户信息:" + user;
    }
}

在这里插入图片描述
在这里插入图片描述

可以发现是获取到了这个对象了!

🍉 2.6.获取URL中的参数

想要从url里面获取参数,就需要使用到@PathVariable注解了,而前面的获取url的参数是从?后面的参数中获取的,但这里可以从url地址(?前面)来进行获取,下面一起来看一下:

@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
    @RequestMapping("/geturl/{username}/{password}")
    public String getUrl(@PathVariable String username,@PathVariable String password){
        return "用户名: " + username + " | 密码: " + password;
    }
}

在@RequestMapping里面也是要根据顺序来进行编写的
在这里插入图片描述
在这里插入图片描述

发现信息也是可以获取到的!

🍉 2.7.上传文件

这里也是可以进行上传文件操作的,使用@RequestPart注解就可以实现:

@Slf4j
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {

    //上传文件
    @RequestMapping("/upimg")
    public boolean upImg(Integer id, @RequestPart("img")MultipartFile file){
        boolean result = false;

        //保存文件到本地目录
        try {
            file.transferTo(new File("E:\\Web\\img.png"));
            result = true;
        } catch (IOException e) {
            log.error("上传图片失败"  + e.getMessage());
        }
        return result;

    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图片也是上传成功了!


在这里插入图片描述

  • 41
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栋zzzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值