SpringMVC入门指南:从零掌握核心要点
一、初步认识Spring Web MVC
MVC定义:
MVC是Model(模型)、 View(视图)、 Controller(控制器)的缩写
二、正式开始Spring MVC之旅
2.1 了解究竟要干嘛
Spring MVC重点就是如何通过浏览器和用户程序进行交互,主要为以下三个方面:
- 建立连接:将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的Spring程序。
- 请求:用户请求时会带一些参数,在程序中要想办法获取到参数,所以请求主要目的是获取参数。
- 响应:执行了业务逻辑之后,要把程序执行的结果返回给用户,就是响应。
2.2 建立链接
在Spring MVC中使用@RequestMapping来实现URL路由映射(链接程序的作用)
具体代码实现:
接下来在浏览器中输入:http://127.0.0.1:8080/hello/v1。
2.2.1 @RequestMapping注解介绍
@RequestMapping是 Spring MVC 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。表示服务收到请求时, 路径为/hello/v1的请求就会调用/hello/v1这个方法的代码.但需注意:这里需要加入@RestController⼀个项目中, 会有很多类, 每个类可能有很多的方法, Spring程序怎么知道要执行哪个方法呢?Spring会对所有的类进行扫描, 如果类加了注解@RestController, Spring才会去看这个类里面的方法有没有加 @RequestMapping这个注解, 当然他的作用还有很多,后面再详细介绍
路由映射: 当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射.
2.2.2 @RequestMapping使用
2.2.3 @RequestMapping的请求模式
@RequestMapping 既支持Get请求, 又支持Post请求.如不指定method 属性,该接口会同时支持 GET、POST、PUT、DELETE 等所有 HTTP 请求方式
指定GET/POST方法类型,具体操作:
三、认识Postman
访问不同的路径,就是前端给后端发送不同的请求,再发送请求时,可能会带有一些参数,所以了解Spring的请求,需要借助Postman来模拟传参过程。
下面通过具体的例子,来看看到底怎么使用吧:
3.1 传递单个参数
@RequestMapping("h1") public String v1(String name){ return "名字是"+name; }【使用postman传递】传递前:
传递后:
【直接通过浏览器发送请求并传参】:http://127.0.0.1:8080?name=hhh
参数类型详解:int 与 Integer 的区别
在 Spring MVC 中接收单个参数时,参数类型的选择会影响程序:
- 基本类型 int:值类型,不能为 null。如果前端没有传递对应的参数,Spring 会尝试使用默认值(0),但如果参数是必须的且未传递,可能会导致类型转换异常,最终返回 500 错误。
- 包装类型 Integer:引用类型,可以为 null。适合可选参数场景,前端不传时接收到的值为 null,程序可以更灵活地处理。
示例对比:
// 使用 int 类型 - 必须传参 @RequestMapping("/intDemo") public String intDemo(int id) { return "ID: " + id; // 前端不传 id 会报错 } // 使用 Integer 类型 - 可选参数 @RequestMapping("/integerDemo") public String integerDemo(Integer id) { if (id == null) { return "ID 未提供"; } return "ID: " + id; }- 对于必填参数,可以使用 int 类型,但最好配合 @RequestParam(required = true) 明确要求。
- 对于可选参数,推荐使用 Integer 等包装类型,避免因前端遗漏参数导致程序崩溃。
- 使用包装类型时,注意在方法内部进行 null 值判断,确保逻辑正确性。
其他注意事项:
参数名匹配:Spring MVC 默认通过参数名进行匹配。前端传递的参数名必须与方法参数名一致(区分大小写)。例如,方法参数为String userName,则前端必须传递userName参数。
使用 @RequestParam 注解:可以通过@RequestParam注解更精确地控制参数绑定:
@RequestParam("name") String userName:将前端传递的name参数绑定到userName变量。@RequestParam(required = false) Integer age:将age参数设为可选,未传递时值为null。@RequestParam(defaultValue = "18") int age:设置默认值,当参数未传递时使用默认值 18。
- 参数类型转换:Spring MVC 会自动进行基本类型转换(如 String 转 int、long、boolean 等)。如果转换失败(例如传递 "abc" 给 int 类型),会抛出
TypeMismatchException并返回 400 错误。 - 中文参数处理:如果传递中文参数出现乱码,需要在配置中设置字符编码过滤器(如
CharacterEncodingFilter),或在请求头中指定Content-Type: application/x-www-form-urlencoded; charset=UTF-8。 - GET vs POST:GET 请求的参数通过 URL 传递(如
?name=value),POST 请求的参数通常在请求体中。Spring MVC 对两种方式都支持,但需要注意 POST 请求的Content-Type。 - 参数验证:对于重要参数,建议使用校验注解(如
@NotNull、@Size、@Min、@Max)配合@Valid进行参数校验,确保数据合法性。
3.2 传递多个参数
@RequestMapping("h2") public String v2(String name,Integer age){ return "名字是"+name+"今年"+age; }对比两个图可以发现,前后端进行参数匹配时,参数的位置不影前后端获取参数结果
3.3 传递对象
public class Student { private int id; private String name; private String password; public Student(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }3.4 后端参数重命名
@RequestMapping("/h4") public Object h(@RequestParam("age") String userage) { return "接收到的参数userage是"+userage; }RequestMapping("/h5") public Object h1(@RequestParam(value="age", required = false) String userage) { return "接收到的参数userage是"+userage; }3.5 传递数组
@RequestMapping("/h6") public String h6(String[] array) { return Arrays.toString(array); }3.6 传递集合
集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使用@RequestParam绑定参数关系
@RequestMapping("/h7") public String h7(@RequestParam List<String> list) { return "list:"+list+" size: "+list.size(); }3.7 传递JSON数据
JSON是一种在客户端和服务端进行交互的轻量级的数据交互格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换。
JSON字符串和Java对象互转:
Spring MVC框架也集成了JSON的转换工具, 我们可以直接使用, 来完成JSON字符串和Java对象的互转本质上是jackson-databind提供的功能, Spring MVC框架中已经把该工具包引⼊了进来, 可直接使用, 但如果脱离Spring MVC使⽤, 需要引⼊相关依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.5</version> </dependency>传递JSON对象:接受JSON对象,需要使用 @RequestBody 注解
RequestBody: 请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须在写在请求正文中
@RequestMapping("/h8") public Object h8(@RequestBody Student s) { return s.toString(); }3.8 获取URL中的参数@PathVariable
这个注解主要作用在请求URL路径上的数据绑定默认传递参数写在URL上,SpringMVC就可以获取到
@RequestMapping("/h9/{id}/{name}") public String method8(@PathVariable Integer id, @PathVariable("name") String userName) { return "解析参数id:"+id+",name:"+userName; }- 如果方法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不用给@PathVariable的属性赋值, 如上述例子中的id变量
- 如果方法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值, 如上述例子中的userName变量.
3.9 上传文件 @RequestPart
@RequestMapping("/h10") public String getfile(@RequestPart("file") MultipartFile file) throws IOException { //获取⽂件名称 String fileName = file.getOriginalFilename(); //⽂件上传到指定路径 file.transferTo(new File("D:/code/" + file.getOriginalFilename())); return "接收到⽂件名称为: "+fileName; }检查是否传递成功:
四、小结
谁敢信,我最近一天不吃手抓饼都不行,哈哈哈哈哈。这一节学的时候有点迷迷糊糊的,但是写博客的时候感觉还好,其实spring boot配置也应该写,但是我实在是懒得在创建一遍慢慢截图了,后面在创建项目时在更新吧。请大家动动发财的小手给我点点赞哦
