
一、初步认识Spring Web MVCSpring Web MVC 是基于 Servlet API 构建的原始 Web 框架从一开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc)但它通常被称为SpringMVC。简而言之Spring Web MVC是一个Web框架后续简称为Spring MVC什么是ServletServlet 是⼀种实现动态页面的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范或者说是⼀套Java Web 开发的技术标准. 只有规范并不能做任何事情必须要有人去实现它. 所谓实现 Servlet 规范就是真正编写代码去实现 Servlet 规范提到的各种功能包括类、⽅法、属性等. Servlet 规范是开放的除了 Sun 公司其它公司也可以实现 Servlet 规范目前常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等它们都被称为Servlet 容器. Servlet 容器用来管理程序员编写的 Servlet 类.MVC定义MVC是Model模型、 View视图、 Controller控制器的缩写View(视图)指在应用程序中专门用来与浏览器进行交互展示数据的资源.Model(模型)是应用程序的主体部分用来处理程序中数据逻辑的部分.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使用RequestMapping既可修饰类也可以修饰方法。当修饰类和方法时访问的地址是类路径 方法路径注RequestMapping的URL路径前加不加 “/” 都行但为了规范还是加上比较好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?namehhh参数类型详解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; charsetUTF-8。GET vs POSTGET 请求的参数通过 URL 传递如?namevaluePOST 请求的参数通常在请求体中。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 后端参数重命名某些特殊的情况下前端传递的参数 key 和我们后端接收的 key 可以不⼀致比如前端传递了⼀个age给后端而后端是使用 userage 字段来接收的这样就会出现参数接收不到的情况如果出现这种情况我们就可以使用 RequestParam来重命名前后端的参数值.RequestMapping(/h4) public Object h(RequestParam(age) String userage) { return 接收到的参数userage是userage; }可以得出结论:1.使用RequestParam进行参数重命名时, 请求参数只能和RequestParam声明的名称⼀致, 才能进行参数绑定和赋值.2.使用RequestParam进行参数重命名时, 参数就变成了必传参数.非必传参数设置RequestMapping(/h5) public Object h1(RequestParam(valueage, 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 ListString list) { return list:list size: list.size(); }3.7 传递JSON数据JSON是一种在客户端和服务端进行交互的轻量级的数据交互格式有自己的格式和语法使用文本表示一个对象或数组的信息因此JSON本质是字符串主要负责在不同的语言中数据传递和交换。JSON的语法:1.数据在键值对(Key/Value)中2.数据由逗号,分隔3.对象用{}表示4.数组用[]表示5.值可以为对象, 也可以为数组, 数组中可以包含多个对象JSON的两种结构1.对象: 大括号{}保存的对象是⼀个无序的键值对集合. ⼀个对象以左括号{开始 右括号}结束。每个键后跟⼀个冒号:键值对使用逗号,分隔2.数组: 中括号[]保存的数组是值value的有序集合. ⼀个数组以左中括号[开始 右中括号]结束值之间使用逗号,分隔。JSON优点1.简单易用:语法简单易于理解和编写可以快速地进行数据交换2.跨平台支持: JSON可以被多种编程语言解析和生成, 可以在不同的平台和语言之间进行数据交换和传输3.轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占用带宽较小, 可以提高数据传输速度4.易于扩展: JSON的数据结构灵活支持嵌套对象和数组等复杂的数据结构便于扩展和使用5.安全性: JSON数据格式是⼀种纯⽂本格式不包含可执行代码, 不会执行恶意代码因此具有较高的安全性JSON字符串和Java对象互转Spring MVC框架也集成了JSON的转换工具, 我们可以直接使用, 来完成JSON字符串和Java对象的互转本质上是jackson-databind提供的功能, Spring MVC框架中已经把该工具包引⼊了进来, 可直接使用, 但如果脱离Spring MVC使⽤, 需要引⼊相关依赖dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.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 上传文件 RequestPartRequestMapping(/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配置也应该写但是我实在是懒得在创建一遍慢慢截图了后面在创建项目时在更新吧。请大家动动发财的小手给我点点赞哦