网站域名年龄查询,关键词推广哪家好,wordpress边栏显示头像,网站方案设计大家好我是小帅#xff0c;今天我们来学习Spring Web MVC框架#xff08;入门级#xff09; 文章目录 1. 什么是 Spring Web MVC#xff1f;1.1 MVC 定义1.2 什么是Spring MVC ? 2. 学习Spring MVC2.1 建⽴连接第一个spring MVC程序 3. web开发注解的解释3.1RestControlle…
大家好我是小帅今天我们来学习Spring Web MVC框架入门级 文章目录 1. 什么是 Spring Web MVC1.1 MVC 定义1.2 什么是Spring MVC ? 2. 学习Spring MVC2.1 建⽴连接第一个spring MVC程序 3. web开发注解的解释3.1RestController3.2RequestMapping3.3 RequestMapping 是 GET 还是 POST 3.3.1 指定GET/POST⽅法类型3.3.2 指定GET/POST⽅法类型 GetMapping PostMapping 3.4 RequestParam3.4.1 ⾮必传参数设置 3.5 PathVariable用法 4.请求4.1 传递单个参数4.2 传递多个参数4.3 后端参数重命名后端参数映射4.4 传递数组4.5 传递集合4.6 传递JSON对象数据4.6.1 JSON概念4.6.2 JSON的使用 1. 什么是 Spring Web MVC
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)但它通常被称为Spring MVC.
什么是Servlet呢? Servlet 是⼀种实现动态⻚⾯的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范或者说是⼀套Java Web 开发的技术标准. 只有规范并不能做任何事情必须要有⼈去实现它. 所谓实现 Servlet 规范就是真正编写代码去实现 Servlet 规范提到的各种功能包括类、⽅法、属性等. Servlet 规范是开放的除了 Sun 公司其它公司也可以实现 Servlet 规范⽬前常⻅的实现了Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等它们都被称为Servlet 容器. Servlet 容器⽤来管理程序员编写的 Servlet 类. 1.1 MVC 定义
MVC 是 Model View Controller 的缩写它是软件⼯程中的⼀种软件架构设计模式它把软件系统分为模型、视图和控制器三个基本部分.
原生MVC交互图解
View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互展⽰数据的资源.Model(模型) 是应⽤程序的主体部分⽤来处理程序中数据逻辑的部分.Controller控制器可以理解为⼀个分发器⽤来决定对于视图发来的请求需要⽤哪⼀个模型来处理以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型。
1.2 什么是Spring MVC ?
MVC 是⼀种架构设计模式, 也是⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外,Spring MVC还是⼀个Web框架.
Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.
其实, Spring MVC 我们在前⾯已经⽤过了, 在创建 Spring Boot 项⽬时我们勾选的 Spring Web 框架其实就是 Spring MVC 框架:
Spring Boot 只是实现Spring MVC的其中⼀种⽅式⽽已.
Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring WebMVC框架, 来实现web功能.
不过Spring在实现MVC时, 也结合⾃⾝项⽬的特点, 做了⼀些改变, 相对⽽⾔, 下⾯这个图或许更加合适⼀些
2. 学习Spring MVC
既然是 Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应.
咱们学习Spring MVC, 重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互.
主要分以下三个⽅⾯:
建⽴连接将⽤⼾浏览器和 Java 程序连接起来也就是访问⼀个地址能够调⽤到我们的Spring 程序。请求: ⽤⼾请求的时候会带⼀些参数在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.响应: 执⾏了业务逻辑之后要把程序执⾏的结果返回给⽤⼾, 也就是响应.
2.1 建⽴连接第一个spring MVC程序
创建⼀个 UserController 类实现⽤⼾通过浏览器和程序的交互具体实现代码如下
3. web开发注解的解释
3.1RestController
⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法, Spring程序怎么知道要执⾏哪个⽅法呢?
Spring会对所有的类进⾏扫描, 如果类加了注解RestController, Spring才会去看这个类⾥⾯的⽅法有没有加 RequestMapping 这个注解, 当然他的作⽤不⽌这⼀点, 咱们先⽤, 后⾯再详细讲 3.2RequestMapping
RequestMapping 是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀它是⽤来注册接⼝的路由映射的.
表⽰服务收到请求时, 路径为 /sayHi 的请求就会调⽤ sayHi 这个⽅法的代码. 路由映射: 当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射.
RequestMapping 既可修饰类也可以修饰⽅法 当修饰类和⽅法时访问的地址是类路径 ⽅法路径.
就比如说什么的例子
3.3 RequestMapping 是 GET 还是 POST
答案是两个都是 我们通过postman第三方工具来测试一下
3.3.1 指定GET/POST⽅法类型
我们可以显⽰的指定RequestMapping 来接收POST的情况如下所⽰: 代码
RestController
RequestMapping(test)
public class UserController {RequestMapping(ayHi)public String sayHi() {return ayHi;}RequestMapping(value ayHi2,method RequestMethod.GET)public String sayHi2() {return RequestMethod.GET;}RequestMapping(value ayHi3 ,method RequestMethod.POST)public String sayHi3() {return ayHi;}}还有一种注解可以直接指定
3.3.2 指定GET/POST⽅法类型 GetMapping PostMapping 还可以这样写成数组的形式
3.4 RequestParam
前端传递的参数 key 和我们后端接收的 key 可以不⼀致⽐如前端传递了⼀个time 给后端⽽后端是使⽤ createtime 字段来接收的这样就会出现参数接收不到的情况如果出现这种情况我们就可以使⽤ RequestParam 来重命名前后端的参数值. 代码
package org.example.javaspringboot_2004_11_22;import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.*;RestController
RequestMapping(test)
public class UserController {RequestMapping(/m3)public Object method_4(RequestParam(time) String createtime) {return 接收到参数createtime: createtime;}
}使用浏览器发送请求效果 可以看到, Spring可以正确的把浏览器传递的参数time绑定到了后端参数caretetime参数上此时, 如果浏览器使⽤createtime进⾏参数传递呢?
效果 总结
使⽤ RequestParam 进⾏参数重命名时, 请求参数只能和 RequestParam 声明的名称⼀致, 才能进⾏参数绑定和赋值.使⽤ RequestParam 进⾏参数重命名时, 参数就变成了必传参数.
3.4.1 ⾮必传参数设置
如果我们的实际业务前端的参数是⼀个⾮必传的参数, 针对上述问题, 如何解决呢?先来了解下参数必传的原因, 我们查看 RequestParam 注解的实现细节就可以发现端倪注解实现如下 可以看到 required 的默认值为true, 表⽰含义就是: 该注解修饰的参数默认为必传既然如此, 我们可以通过设置 RequestParam 中的 requiredfalse 来避免不传递时报错具体实现如下 代码
RequestMapping(/m4)public Object method4(RequestParam(value time, required false) String createtime) {return 接收到参数createtime: createtime;}可以看到, 添加requiredfalse之后, time前⾯也加了key, 变成了 value “time” 注解属性赋值时, 没有指明key的话, 默认为value属性. 如果需要有多个属性进⾏赋值时, 需要写上key
同时输入createtime也可以访问time也可以
3.5 PathVariable用法
可以拿到访问路径上的变量
代码
GetMapping(ayHi6/{name}/{id})public String sayHi6(PathVariable(name) String name, PathParam(id) Integer id) {return name name \tid id;}效果
4.请求
访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收.
4.1 传递单个参数
接收单个参数, 在 Spring MVC 中直接⽤⽅法中的参数就可以⽐如以下代码
RestController
RequestMapping(test)
public class UserController {RequestMapping(/m1)public String method1(String name){return 接收到参数name: name;}}可以看到, 后端程序正确拿到了name参数的值.
注意 如果参数不⼀致, 是获取不到参数的
注意事项
使⽤基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误类型不匹配时, 会报400错误
案例
package org.example.javaspringboot_2004_11_22;import org.apache.coyote.Request;
import org.springframework.web.bind.annotation.*;RestController
RequestMapping(test)
public class UserController {RequestMapping(/int)public Object method1GetInt(int age){return 接收到参数age: age;}} 正常传参数 不传递age参数 观察日记解决 所以后端传参时尽量使用包装类接收 传递参数类型不匹配 总结 对于参数可能为空的数据建议使⽤包装类型
4.2 传递多个参数
和接收单个参数⼀样, 直接使⽤⽅法的参数接收即可. 使⽤多个形参. 可以看到, 后端程序正确拿到了name和password参数的值 当有多个参数时前后端进⾏参数匹配时是以参数的名称进⾏匹配的因此参数的位置是不影响后端获取参数的结果. 比如说 4.3 后端参数重命名后端参数映射
上面讲RequestParam已经分析完了
4.4 传递数组
Spring MVC 可以⾃动绑定数组参数的赋值
后端代码
RequestMapping(/m5)
public String method5(String[] arrayParam) {return Arrays.toString(arrayParam);
}使⽤浏览器发送请求并传参: 数组参数请求参数名与形参数组名称相同且请求参数为多个, 后端定义数组类型形参即可接收参数。
3种传参方法
http://127.0.0.1:8080/test/m5?arrayParamzhangsanarrayParamlisiarrayParamwangwuhttp://127.0.0.1:8080/test/m6?listParamzhangsan%2clisi%2cwangwuhttp://127.0.0.1:8080/test/m5?arrayParamzhangsan,lisi,wangwu %2c 是逗号的转义编码 或者使⽤Postman来发送请求
4.5 传递集合
集合参数和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤RequestParam 绑定参数关系 一定使⽤RequestParam 绑定参数关系不然无法从数组变成集合在里面是有一个隐藏的转换的。
代码
RequestMapping(/m6)
public String method6(RequestParam ListString listParam){return size:listParam.size() ,listParam:listParam;
}使用浏览器访问和数组一样 使用postman访问效果
4.6 传递JSON对象数据
4.6.1 JSON概念
JSONJavaScript Object Notation 【JavaScript 对象表⽰法】
JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个⼦集采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。 作用JSON就是⼀种数据格式, 有⾃⼰的格式和语法, 使⽤⽂本表⽰⼀个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换.
4.6.2 JSON的使用
JSON语法
JSON 是⼀个字符串其格式⾮常类似于 JavaScript 对象字⾯量的格式
数据在 键值对(Key/Value) 中数据由逗号 , 分隔对象⽤ {} 表⽰数组⽤ [] 表⽰值可以为对象, 也可以为数组, 数组中可以包含多个对象
JSON的两种结构
对象: ⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合. ⼀个对象以左括号 { 开始 右括号 }结束。每个键后跟⼀个冒号 : 键值对使⽤逗号 , 分隔数组: 中括号 [] 保存的数组是值value的有序集合. ⼀个数组以左中括号 [ 开始 右中括号 ] 结束值之间使⽤逗号 , 分隔。
我们来看一段josn代码
{
{squadName: Super hero squad,homeTown: Metro City,formed: 2016,secretBase: Super tower,active: true,members: [{name: Molecule Man,age: 29,secretIdentity: Dan Jukes,powers: [Radiation resistance,Turning tiny,Radiation blast]}]
}压缩后
{squadName:Super hero squad,homeTown:Metro City,formed:2016,secretBase:Super tower,active:true,members:[{name:Molecule Man,age:29,secretIdentity:Dan Jukes,powers:[Radiation resistance,Turning tiny,Radiation blast]}]}和上⾯描述的数据⼀样, 只不过上⾯的进⾏了格式化, 更易读 JSON字符串和Java对象互转
JSON本质上是⼀个字符串, 通过⽂本来存储和描述数据 Spring MVC框架也集成了JSON的转换⼯具, 我们可以直接使⽤, 来完成JSON字符串和Java对象的互转本质上是jackson-databind提供的功能, Spring MVC框架中已经把该⼯具包引⼊了进来, 咱们直接使⽤即可, 如果脱离Spring MVC使⽤, 需要引⼊相关依赖。
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.13.5/version
/dependencyJSON的转换⼯具包有很多, jackson-databind只是其中的⼀种. josn的转换案例
import com.fasterxml.jackson.databind.ObjectMapper;public class JSONUtils {private static ObjectMapper objectMapper new ObjectMapper();public static void main(String[] args) throws Exception {Person person new Person();person.setId(5);person.setName(zhangsan);person.setPassword(123456);// 对象转为JSON字符串String jsonStr objectMapper.writeValueAsString(person);System.out.println(JSON字符串为: jsonStr);// JSON字符串转为对象Person p objectMapper.readValue(jsonStr, Person.class);System.out.println(转换的对象 id: p.getId() , name: p.getName() , password: p.getPassword());}
}class Person {private int id;private String name;private String password;// Getters and Setterspublic 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;}
}代码解析
使⽤ObjectMapper 对象提供的两个⽅法, 可以完成对象和JSON字符串的互转writeValueAsString: 把对象转为JSON字符串readValue: 把字符串转为对象 JSON优点 4. 简单易⽤: 语法简单易于理解和编写可以快速地进⾏数据交换 5. 跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和传输 6. 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输速度 7. 易于扩展: JSON的数据结构灵活⽀持嵌套对象和数组等复杂的数据结构便于扩展和使⽤ 8. 安全性: JSON数据格式是⼀种纯⽂本格式不包含可执⾏代码, 不会执⾏恶意代码因此具有较⾼的安全性。
好了今天我们就到这里了感谢观看。