Spring Web MVC入门

server/2024/10/22 16:50:21/

目录

一、建立连接(@ResquestMapping- 实现URL路由映射)

二、发送请求

1、传递单个参数

2、传递多个参数

3、传递对象

4、后端参数重命名(后端参数映射)(@RequestParam)

 5、非必传参数的设置(required = false)

5、传递数组

6、传递集合

7、传递JSON数据

JSON是什么

语法:

两种结构

JSON字符串和Java对象互转

JSON优点

后端实现(@RequestBody )

8、获取URL中参数(@PathVariable)

9、上传文件(@RequestPart)

10、获取Cookie/Session

获取Cookie

获取Session 

11、获取Header

三、响应

1、返回静态页面

2、返回数据

3、返回HTML片段

4、返回JSON

​编辑

5、设置状态码

6、设置Content-Type

7、设置Header


SpringWeb MVC是基于Servlet API构建的原始Web框架

Servlet是一种实现动态页面的技术,准确来讲Servlet是一套Java Web开发的规范,或者说是一套Java Web开发的技术标准

MVC,即Model View Controller,它是软件工程中的一种软件架构模式,他把软件系统分为模型、视图和控制器三个部分

Spring MVC框架:

一、建立连接(@ResquestMapping- 实现URL路由映射)

java">@RestController
public class HelloController {@RequestMapping("/hello")public String hello(){return "hello,SpringBoot";}
}

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

@ResquestMapping既可以修饰类,也可以修饰方法

  • 标识一个类:设置映射请求路径的初始信息
  • 标识一个方法:设置映射请求的请求路径的具体信息
  • 修饰类和方法:访问的地址是类路径+方法路径

        @ResquestMapping 的URL路径最前面加不加 / 都可以,Spring程序启动时,会进行判断,如果前面没有加 / ,Spring会拼接上一个 / 。通常情况下,我们加上 /;

        @ResquestMapping的URL路径也可以是多层路径,最终访问时,依然是类路径+方法路径;

        @ResquestMapping既支持GET请求,又支持POST请求,同理也支持其他请求方式;

        浏览器发送的请求类型默认为GET

        路由映射:当用户访问一个URL时,将用户的请求对应到程序中的某个类的某个方法的过程

  • 可以显式指定@ResquestMapping来指定GET/POST方法类型
java">@RestController
public class UserController {@RequestMapping(value = "/getRequest",method= RequestMethod.POST)public String sayHi(){return "get request...";}
}

二、发送请求

URL格式如下:

1、传递单个参数

java"> @RequestMapping("/r1")public String r1(String name){return "接收到参数 name:"+name;}

如果参数传递与后端不一致是获取不到参数的

关于参数传递错误的状态码情况

  • 使用基本类型来接收参数时,参数必须传(除boolean类型外),否则会报500错误;
  • 类型不匹配时会报400错误;
  • 在企业开发中对于参数可能会空的数据,建议使用包装类型

2、传递多个参数

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的

java">@RequestMapping("/r2")public String r1(String name,int age){return "姓名:"+name+"年龄:"+age;}

3、传递对象

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

Spring MVC可以自动实现参数的赋值,比如下面的Person对象:

java">public class User {private String name;private int age;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}
}
java">  @RequestMapping("/r3")public String r1(User user){return user.toString();}

4、后端参数重命名(后端参数映射)(@RequestParam)

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

java"> @RequestMapping("/r4")public String r4(@RequestParam("name") String username){return "接收到的参数 username:"+username;}

 5、非必传参数的设置(required = false)

在4中使用@RequestParam进行参数重命名后,此时的参数就为必传参数,若此时发送请求时再不进行传递则状态码会为400

可以设置required = false设置为非必传参数

java"> @RequestMapping("/r5")public String r5(@RequestParam(value = "name",required = false) String username){return "接收到的参数 username:"+username;}

5、传递数组

一般URL格式:

  • 127.0.0.1:8080/r6?arr=1,2,3
  • 127.0.0.1:8080/r6?arr=1&arr=2&arr=3
  • 127.0.0.1:8080/r6?arr=1%2c2%2c3

java"> @RequestMapping("/r6")public String r6(String[] arr){return Arrays.toString(arr);}

6、传递集合

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

默认情况下,请求中参数名相同的多个值是封装到数组;如果要再封装到集合,则要使用@RequestParam来绑定参数关系

同样的使用@RequestParam进行参数重命名后,此时的参数就为必传参数;并且如果不传参还会导致空指针异常

java"> @RequestMapping("/r7")public String r7(@RequestParam(value = "list",required = false) List<String> list){if (list==null){//若未传递参数list,还会报空指针异常return "list为空";}return list.toString()+"size:"+list.size();}

7、传递JSON数据

JSON是什么

JSON,JavaScript Object Notation(JavaScript对象表示法),但二者没有关系

JSON采用一种轻量级的数据交互格式,基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据

简单来说,JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是一个字符串,主要负责在不同语言中数据传递和交换

JSON在线解析及格式化验证

语法:
  • 数据在键值对(Key/Value)中
  • 数据由逗号分隔
  • 对象由 { } 表示;数组由 [ ] 表示
  • 值可以为对象,也可以为数组,数组中可以包含多个对象
两种结构
  • 对象:大括号 { } 保存的对象是一个无序的键值对集合
  • 数组:中括号 [ ] 保存的数组是值的有序集合

JSON字符串和Java对象互转

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

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

使用ObjectMapper对象提供的两个方法,可以完成对象和JSON字符串的互转

  • writeValueAsString:把对象转为JSON字符串
  • readValue:把字符串转为对象
java"> public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper=new ObjectMapper();User user=new User();user.setName("张三");user.setAge(18);user.setSex("男");//对象转JSONString s=objectMapper.writeValueAsString(user);System.out.println(s);//{"name":"张三","age":18,"sex":"男"}//JSON字符串转Java对象User user1=objectMapper.readValue(s,User.class);System.out.println(user1);//User{name='张三', age=18, sex='男'}}
JSON优点
  • 简单易用:语法简单,易于理解和编写,可以快速进行数据交换
  • 跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输
  • 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用宽带较小,可以提高传输速度
  • 易于扩展:JSON的数据结构 灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
  • 安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性

基于以上特点,JSON在Web应用程序中被广泛使用,如前后端数据交互、API接口数据传输等

接收JSON对象,需要使用 @RequestBody 注解

后端实现(@RequestBody )
java"> @RequestMapping("/r8")public String r8(@RequestBody User user){return user.toString();}

为了确保JSON对象能够正确反序列化为Java对象,提供一个无参构造方法是非常重要的。

若你已提供了一个有参的构造方法,记得再加上无参构造方法(有了有参后就不会再默认调用无参)

8、获取URL中参数(@PathVariable)

path variable 即路径变量,这个注解主要作用在请求URL路径上的数据绑定

  • 如果方法参数名称和需要绑定的URL中的变量名称不一致则需要@PathVariable的属性value赋值(重命名)
  • 利用@PathVariable传参是必传参数

参数对应关系如下:

9、上传文件(@RequestPart)

java">@RequestMapping("/r11")public String r11(@RequestPart("file")MultipartFile file) throws IOException {//获取文件名称String fileName= file.getOriginalFilename();//文件上传到指定路径file.transferTo(new File("E:/temp1/"+fileName));return "接收到的文件名称为:"+fileName;}

10、获取Cookie/Session

Session默认是保存在内存中的,如果重启服务器则Session数据就会丢失

Cookie和Session的区别:

  • Cookie是客户端保存用户信息的一种机制,Session是服务器保存用户信息的一种机制
  • Cookie和Session之间主要是通过SessionId关联起来的,Session是Cookie和Session之间的桥梁
  • Cookie和Session经常会在一起配合使用,但是不是必须配合。完全可以用Cookie来保存一些数据在客户端,这些数据在客户端,这些数据不一定是用户身份信息,也不一定是SessionId;Session中的sessionId也不需要非得通过Cookie/Set-Cookie传递,比如通过URL传递 
获取Cookie

java">//获取所有Cookie @RequestMapping("/getCookie")public String getCookie(HttpServletRequest request){//获取所有Cookie信息Cookie[] cookies=request.getCookies();//打印所有Cookie信息if (cookies!=null){Arrays.stream(cookies).forEach(x-> System.out.println(x.getName()+":"+x.getValue()));return "获取Cookie成功";}/*for (Cookie c:cookies) {System.out.println(c.getName()+":"+c.getValue());}*/return "Cookie为空";}//获取指定名称的Cookie@RequestMapping("/getCookie2")public String getCookie2(@CookieValue("bite") String bite){return "bite:"+bite;}

获取Session 
java"> @RequestMapping("/setSession")public String SetSession(HttpServletRequest request){HttpSession session=request.getSession();session.setAttribute("username","颤三");return "设置Session成功";}@RequestMapping("/getSession")public String GetSession(HttpServletRequest request){HttpSession session=request.getSession();String username=(String)session.getAttribute("username");return "用户名字:"+username;}@RequestMapping("/getSession1")public String GetSession1(HttpSession session){String username=(String)session.getAttribute("username");return "用户名字:"+username;}@RequestMapping("/getSession2")public String GetSession2(@SessionAttribute(value = "username",required = false) String username){return "用户名字:"+username;}

11、获取Header

java"> @RequestMapping("/getHeader")public String GetHeader(HttpServletRequest request){String userAgent=request.getHeader("User-Agent");return  "userAgent"+userAgent;}@RequestMapping("/getHeade2")public String GetHeader2(@RequestHeader("User-Agent") String userAgent){return  "userAgent"+userAgent;}

三、响应

1、返回静态页面

java">@RequestMapping("/return")
@Controller
public class ReturnController {@RequestMapping("r1")public String r1(){return "/index.html";}
}

2、返回数据

java">@RequestMapping("/return")
@Controller
public class ReturnController {@ResponseBody //返回数据 @RestController=@Controller+@ResponseBody@RequestMapping("r2")public String r2(){return "hello,spring";}
}

3、返回HTML片段

java">@RequestMapping("/return")
@Controller
public class ReturnController {@ResponseBody@RequestMapping("r3")public String r3(){return "<h1>hello,spring</h1>";}
}

4、返回JSON

java">@RequestMapping("/return")
@Controller
public class ReturnController {@ResponseBody@RequestMapping("r4")public User r4(){User user=new User();user.setName("张三");user.setAge(17);user.setSex("女");return user;}
}

java">@RequestMapping("/return")
@Controller
public class ReturnController {@ResponseBody@RequestMapping("/r5")public Map<String,String> r5(){HashMap map=new HashMap();map.put("k1","v1");map.put("k2","v2");return map;}
}

java">@RequestMapping("/return")
@Controller
public class ReturnController {@RequestMapping("/r6")public String r6(){return "/a.css";}
}

java">@RequestMapping("/return")
@Controller
public class ReturnController {@RequestMapping("/r7")public String r7(){return "/b.js";}
}

可以看出Spring会根据我们返回的结果,动态设置response的Content-Type

5、设置状态码

状态码的设置不影响页面显示,所以即便状态码设置失败也不会影响页面

java">@RequestMapping("/return")
@Controller
public class ReturnController {@ResponseBody@RequestMapping("/r8")public String r8(HttpServletResponse response){response.setStatus(401);return "设置状态吗成功";}
}

6、设置Content-Type

java">@RequestMapping("/return")
@Controller
public class ReturnController {@ResponseBody@RequestMapping("/r9",produces = "application/json")
// @RequestMapping("/r9",produces = "application/json;charset=utf8") 也可以同步设置编码public String r9(){return "OK:1";}
}

7、设置Header

java">@RequestMapping("/return")
@Controller
public class ReturnController {@ResponseBody@RequestMapping("/r10")public String r10(HttpServletResponse response){response.setHeader("myHeader","myHeaderValue");return "设置Header成功";}
}


http://www.ppmy.cn/server/107127.html

相关文章

前端Html5/Css3—div盒子模型

文章目录 第六章 盒子模型6.1 border边框6.2 border-width粗细6.3 border-style边框样式6.4 border简写6.5 margin外边距6.6 padding内边距6.7 盒子模型尺寸6.8 box-sizing6.9 border-radius圆角边框6.9.1 制作圆形6.9.2 半圆6.9.3 四分之一圆 6.10 box-shadow盒子阴影 第六章 …

掀起社交娱乐新浪潮!AI如何应用到短视频APP?

随着人工智能技术的迅速发展和全球社交媒体用户的增长&#xff0c;AI视频生成应用正逐渐成为短视频社交媒体中的关键工具。AI工具不仅可以提高内容的创造效率&#xff0c;还能为用户带来全新的互动体验。 人工智能&#xff08;AI&#xff09;已经成为我们日常生活和工作中不可或…

K8S持久化存储数据volumeMountsvolumes

环境&#xff1a; Ubuntu-1:192.168.114.110作为主 Ubuntu-2:192.168.114.120作为从1&#xff0c;node节点1 Ubuntu-3:192.168.114.130作为从2&#xff0c;node节点2 持久化volumeMounts pod里面&#xff1a;emptyDir和hostPath。存储在node&#xff0c;NFS...&#xff0c;Clo…

力扣经典题目之->相同的树(递归判断两颗二叉树是否相同)

一&#xff1a;题目 二&#xff1a;代码 三&#xff1a;递归展开 第一种模型&#xff1a; 递归展开图&#xff1a; 左&#xff1a; 右&#xff1a; 第二种模型及其递归展开图&#xff1a; 解释&#xff1a; 递归思路即&#xff1a;根相同&#xff0c;左子树相同&#xff0c;…

以太网PHY驱动调试笔记(KSZ8081)

PHY驱动调试笔记 准备知识MAC、RMII、PHY以太网类型100BASE-TX10BASE-5 准备知识 MAC、RMII、PHY 此基本概念可参考一下两篇优秀博文&#xff1a; Ethernet&#xff08;以太网&#xff09;之一 详解 MAC、MII、PHY以太网详解&#xff08;一&#xff09;-MAC/PHY/MII/RMII/GMI…

面向对象编程:深入PHP的封装、继承和多态性!

文章目录 面向对象OOP的核心概念定义类、创建对象构造函数和析构函数访问修饰符继承方法重写接口和抽象类静态方法和属性魔术方法 错误处理错误处理概述错误级别异常处理自定义异常设置错误处理忽略错误错误日志断言 总结 面向对象编程&#xff08;OOP&#xff09;是一种编程范…

k8s POD控制器

POD控制器 Pod控制器&#xff0c;又称为工作负载&#xff08;workload&#xff09;&#xff0c;是Kubernetes中用于实现管理Pod的中间层&#xff0c;它确保Pod资源符合预期的状态。当Pod资源出现故障时&#xff0c;Pod控制器会尝试进行重启&#xff0c;若根据重启策略无效&…

OpenAI神秘“草莓”项目 计划最早今年秋季推出

据科技媒体The Information报道&#xff0c;OpenAI神秘“草莓”项目&#xff0c;计划最早今年秋季推出&#xff01;上个月&#xff0c;OpenAI的内部团队被曝出正开发的“草莓”&#xff08;Strawberry&#xff09;项目&#xff0c;目的是增强OpenAI的模型的推理能力&#xff0c…