当前位置: 首页 > news >正文

【Spring Boot】SpringMVC入门

1.什么是springMVC

MVC就是把一个项目分成了三部分:

image-20240108192355814

MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变:

image-20240108192623557

当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以也就没有view层。所以view又有了一层解释:之前返回的是视图,现在返回的是视图所需要的数据。SpringWebMVC是⼀个Web框架

2. springMVC请求

2.1@RequestMapping 路由映射

可以修饰类也可以修饰方法,访问路径是:类路径+方法路径

@RestController
@RequestMapping("/say/springboot")
public class HelloController {@RequestMapping("/hi")public String sayHi(){return "springboot,hi";}
}

RequestMapping 支持get,post等请求,访问路径可以写多层,注意:/可以省略,建议企业开发的时候统一加上,前加后不加。

也可以指定请求传参:

@RequestMapping(value = "/hello",method = RequestMethod.POST)//只支持POST请求
public String sayHello(){return "springboot,hello";
}
@RequestMapping(value = "/hello",method = RequestMethod.GET)//只支持GET请求
public String sayHello(){return "springboot,hello";
}

2.2 传递单个参数

@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m1")public String m1(Integer num){return "接收到的参数num: " + num;}
}

开发中,建议加上类路径

  1. 避免重复
  2. 方便查找代码

发送的请求:http://localhost:8080/param/m1?num=10

发送请求的参数需要名称一样。底层逻辑:从请求的参数中,获取参数名为num的值,并给num赋值

需要注意的是,建议不要使用基本数据类型,要使用包装类,如果使用基本数据类型参数不传递就会报错:

@RequestMapping("/m2")
public String m2(int num){return "接收到的参数num: " + num;
}

使用包装类就是获取的数值为null,不会报错。开开发的时候建议使用包装类

2.3 传递多个参数

@RequestMapping("/m3")
public String m3(String username,String password){return "接收到的参数username: " + username + "  password: " + password;
}

发送的请求:http://localhost:8080/param/m3?username=“张三”&password=“123456”

参数的顺序可以调换。

2.4 后端参数重命名

使用@RequestMapping注解来进行重命名。如果进行了重命名,就必须要使用@RequestParam注解里的名字

@RequestMapping("/m4")
public String m4(@RequestParam("name") String username, String password){return "接收到的参数username: " + username + "  password: " + password;
}

发送的请求:http://localhost:8080/param/m4?name=“张三”&password=“123456”

使用@RequestMapping注解后默认是比传参数,可以改为非必传参数:

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

2.5 传递对象

创建一个User对象:

@Data
public class User {Integer id;String username;String password;
}

参数设置为对象:

@RequestMapping("/m5")
public String m5(User user){return "接收到的user参数:" + user.toString();
}

开发中,接口的参数通常定义为对象。需要注意的是,基本数据类型比如int,不传递参数的时候,不会报错会赋初始值,int类型则为0。

2.6 传递数组

@RequestMapping("/m6")
public String m6(String[] paramArray){return "接收到的paramArray参数:" + Arrays.toString(paramArray);
}

参数传递数组的方式:

http://localhost:8080/param/m6?paramArray=zhangsan,lisi,wangwu,zhaoliu

http://localhost:8080/param/m6?paramArray=zhangsan&paramArray=lisi&paramArray=wangwu&paramArray=zhaoliu

2.7 传递集合

传递集合需要使用@RequestParam注解,说明以集合的方式来接收。这个注解也可以进行参数重命名

@RequestMapping("/m7")
public String m7(@RequestParam List<String> paramList){return "接收到的paramList参数:" + paramList;
}

参数传递的方式和数组一样:

http://localhost:8080/param/m7?paramList=zhangsan,lisi,wangwu,zhaoliu

2.8 传递JSON

springmvc中使用@RequestBody注解,来使Json转化为对象,就算Json数据中只有一个键值对,也是转化成对象,后面添加进行修改的时候,可以对后端的对象进行添加字段,符合了开闭原则。

可以使用postman来进行发送数据

image-20240109231213798

传递JSON使用对象来接收:

@RequestMapping("/m8")
public String m8(@RequestBody User user){return "传递的Json数据:" + user;
}

传递JSON使用Map来接收:

@RequestMapping("/m8")
public String m8(@RequestBody Map<String,String> map){return "传递的Json数据:" + map;
}

2.9 获取URL中的参数

如果URL是:http://localhost:8080/param/m9/10。我们用之前的方法就没有办法获取参数10 。

要想解决上面的问题,我们得用@PathVariable注解:

@RequestMapping("/m9/{userId}")
public String m9(@PathVariable String userId){return "URL参数:userid:" + userId;
}

可以传递多个参数,但是注意顺序和个数必须和后端是对应的。请求格式必须和后端定义的URL格式匹配。

http://localhost:8080/param/m9/10/zhangsan

@RequestMapping("/m9/{userId}/{username}")
public String m9(@PathVariable String userId, @PathVariable String username){return "URL参数:userid:" + userId + " username:" + username;
}

还可以对参数重命名:

@RequestMapping("/m9/{userId}/{name}")
public String m9(@PathVariable String userId, @PathVariable("name") String username){return "URL参数:userid:" + userId + " username:" + username;
}

2.10 上传文件

用postman发送文件

image-20240109233313177

上传文件后端使用的是@RequestPart注解

@RequestMapping("/m10")
public String m10(@RequestPart MultipartFile file){System.out.println(file.getOriginalFilename());return "success";
}

2.11 获取cookie/session

网页模拟发送cookie

image-20240110113019844

springMVC获取cookie,我们有传统的servlet方式,这种方式可以获取全部cookie。

@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest req){Cookie[] cookies = req.getCookies();if (cookies != null){Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName() + " : " + cookie.getValue());});}return "获取cookies成功";
}

使用注解的方式获取,只能获取指定的cookie.

@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue(value = "name",required = false) String name){return "name : " + name;
}

springMVC获取session也有传统放入获取方式和注解的获取方式。但是在获取session之前先存储session

@RequestMapping("/setSession")
public String setSession(HttpServletRequest req){HttpSession session =  req.getSession();session.setAttribute("username","zhangsan");return "成功存储session" ;
}

用传统的方式去获取session:

@RequestMapping("/getSession")
public String getSession(HttpServletRequest req){HttpSession session =  req.getSession(false);if (session != null){String username = (String) session.getAttribute("username");return "登录用户的名称:" + username;}return "未获取session" ;
}

使用注解获取session

@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute String username){return "username: " + username ;
}

参数直接设施为:HttpSession。

@RequestMapping("/getSession3")
public String getSession3(HttpSession session){//等价于:HttpSession session =  req.getSession(true);return "username: " + session.getAttribute("username");
}

2.12 获取Header

我们以获取Header中的User-Agent字段为例:

使用传统方式:

@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){return "User-Agent: " + request.getHeader("User-Agent");
}

使用注解:

@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){return "User-Agent: " + userAgent;
}

3. spring MVC 响应

3.1 返回静态页面

编写一个index.html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>Spring MVC 返回的静态页面</h1>
</body>
</html>

用@Controller注解而不是用@RestController注解,是因为@Controller返回的就是试图,随着前后端分离,后端不处理页面,就返回页面所需要的数据使用@ResponseBody。@RestController注解 = @ResponseBody + @Controller

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

3.2 返回数据

返回数据使用的注解是:@ResponseBody。

可以修饰类,也可以修饰方法

  • 修饰类的时候,表示这个类下的所有方法,返回的均为数据
  • 修饰方法时,表示该方法返回的是数据
  • 如果一个类中的所以方法返回的都是数据,我们就把这个注解加在类上
@ResponseBody
@RequestMapping("/returnData")
public String returnData(){return  "返回视图所需要的数据";
}

3.3 返回HTML代码片段

返回HTML片段使用@ResponseBody注解就行了,会自动解析成HTML片段,如果想要返回正常的字符串,就需要给字符串中关于HTML标签部分加转义字符。

@ResponseBody
@RequestMapping("/returnHtml")
public String returnHtml(){return "<h1>返回的html片段</h1>";
}

3.4 返回JSON

使用@ResponseBody注解,返回的时候直接返回对象或者Map数据类型返回的就是Json数据格式。

@ResponseBody
@RequestMapping("/returnJson")
public User returnJson(){User user = new User();user.setId(1);user.setUsername("zhangsan");user.setPassword("123456");return user;
}

使用Map数据类型:

@ResponseBody
@RequestMapping("/returnMap")
public Map<String,String> returnMap(){Map<String,String> map = new HashMap<>();map.put("id","1");map.put("name","lisi");map.put("gender","男");return map;
}

3.5 设置状态码

设置状态码,不影响数据展示。

@ResponseBody
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response){response.setStatus(401);return "设置状态码成功";
}

3.6 设置Header(了解)

使用注解中的produces设置Content-Type字段。

produces:设置返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

@ResponseBody
//使用注解中的produces设置Content-Type字段
@RequestMapping(value = "/setHeader",produces = "application/json;charset=utf-8")
public String setHeader(HttpServletResponse response){response.setHeader("test111","test111");//设施header其他字段return "{'ok':1}";
}

相关文章:

  • 【测试发布】
  • C语言基础语法跟练
  • Linux网络配置与抓包工具介绍
  • Pytorch将标签转为One-Hot编码
  • 模型的权值平均的原理和Pytorch的实现
  • Spark与云存储的集成:S3、Azure Blob Storage
  • 基于JavaWeb+BS架构+SpringBoot+Vue协同过滤算法的体育商品推荐系统的设计和实现
  • 2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑦
  • 【Qt之Quick模块】8. Quick基础、布局管理、布局管理器
  • U-Boot学习(2):U-Boot编译和.config配置文件生成分析
  • 一、Mybatis 简介
  • C //练习 5-4 编写函数strend(s, t)。如果字符串t出现在字符串s的尾部,该函数返回1;否则返回0。
  • 微信小程序:发送小程序订阅消息
  • PostgreSQL 低级错误集锦 (不定时更新)
  • 10个提高 Python Web 开发效率的VS Code插件
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Angular数据绑定机制
  • Iterator 和 for...of 循环
  • JavaScript类型识别
  • js对象的深浅拷贝
  • laravel with 查询列表限制条数
  • Python中eval与exec的使用及区别
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring-boot 启动时碰到的错误
  • vuex 学习笔记 01
  • Webpack 4 学习01(基础配置)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 百度小程序遇到的问题
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 驱动程序原理
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 算法-插入排序
  • 提醒我喝水chrome插件开发指南
  • 小程序开发中的那些坑
  • 新书推荐|Windows黑客编程技术详解
  • 学习JavaScript数据结构与算法 — 树
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • FaaS 的简单实践
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ###项目技术发展史
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (03)光刻——半导体电路的绘制
  • (TOJ2804)Even? Odd?
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六)激光线扫描-三维重建
  • (论文阅读30/100)Convolutional Pose Machines
  • (全注解开发)学习Spring-MVC的第三天
  • (转)母版页和相对路径