目录
一、建立连接(@ResquestMapping- 实现URL路由映射)
4、后端参数重命名(后端参数映射)(@RequestParam)
SpringWeb MVC是基于Servlet API构建的原始Web框架
Servlet是一种实现动态页面的技术,准确来讲Servlet是一套Java Web开发的规范,或者说是一套Java Web开发的技术标准
MVC,即Model View Controller,它是软件工程中的一种软件架构模式,他把软件系统分为模型、视图和控制器三个部分
Spring MVC框架:
一、建立连接(@ResquestMapping- 实现URL路由映射)
@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方法类型
@RestController
public class UserController {
@RequestMapping(value = "/getRequest",method= RequestMethod.POST)
public String sayHi(){
return "get request...";
}
}
二、发送请求
URL格式如下:
1、传递单个参数
@RequestMapping("/r1")
public String r1(String name){
return "接收到参数 name:"+name;
}
如果参数传递与后端不一致是获取不到参数的
关于参数传递错误的状态码情况
- 使用基本类型来接收参数时,参数必须传(除boolean类型外),否则会报500错误;
- 类型不匹配时会报400错误;
- 在企业开发中对于参数可能会空的数据,建议使用包装类型
2、传递多个参数
当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的
@RequestMapping("/r2")
public String r1(String name,int age){
return "姓名:"+name+"年龄:"+age;
}
3、传递对象
如果参数比较多时,方法声明就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明。不妨把这些参数封装为一个对象
Spring MVC可以自动实现参数的赋值,比如下面的Person对象:
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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
@RequestMapping("/r3")
public String r1(User user){
return user.toString();
}
4、后端参数重命名(后端参数映射)(@RequestParam)
Spring会根据参数名称自动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型赋值为初始值)
@RequestMapping("/r4")
public String r4(@RequestParam("name") String username){
return "接收到的参数 username:"+username;
}
5、非必传参数的设置(required = false)
在4中使用@RequestParam进行参数重命名后,此时的参数就为必传参数,若此时发送请求时再不进行传递则状态码会为400
可以设置required = false设置为非必传参数
@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
@RequestMapping("/r6")
public String r6(String[] arr){
return Arrays.toString(arr);
}
6、传递集合
集合参数和数组类似,同一个请求参数名有多个,且需要使用@RequestParam绑定参数关系
默认情况下,请求中参数名相同的多个值是封装到数组;如果要再封装到集合,则要使用@RequestParam来绑定参数关系
同样的使用@RequestParam进行参数重命名后,此时的参数就为必传参数;并且如果不传参还会导致空指针异常
@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本质是一个字符串,主要负责在不同语言中数据传递和交换
语法:
- 数据在键值对(Key/Value)中
- 数据由逗号分隔
- 对象由 { } 表示;数组由 [ ] 表示
- 值可以为对象,也可以为数组,数组中可以包含多个对象
两种结构
- 对象:大括号 { } 保存的对象是一个无序的键值对集合
- 数组:中括号 [ ] 保存的数组是值的有序集合
JSON字符串和Java对象互转
JSON本质上是一个字符串,通过文本来存储和描述数据
Spring MVC框架也集成了JSON的转换工具,我们可以直接使用来完成JSON字符串和Java对象的互转
使用ObjectMapper对象提供的两个方法,可以完成对象和JSON字符串的互转
- writeValueAsString:把对象转为JSON字符串
- readValue:把字符串转为对象
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper=new ObjectMapper();
User user=new User();
user.setName("张三");
user.setAge(18);
user.setSex("男");
//对象转JSON
String 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 )
@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)
@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
//获取所有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
@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
@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、返回静态页面
@RequestMapping("/return")
@Controller
public class ReturnController {
@RequestMapping("r1")
public String r1(){
return "/index.html";
}
}
2、返回数据
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody //返回数据 @RestController=@Controller+@ResponseBody
@RequestMapping("r2")
public String r2(){
return "hello,spring";
}
}
3、返回HTML片段
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody
@RequestMapping("r3")
public String r3(){
return "<h1>hello,spring</h1>";
}
}
4、返回JSON
@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;
}
}
@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;
}
}
@RequestMapping("/return")
@Controller
public class ReturnController {
@RequestMapping("/r6")
public String r6(){
return "/a.css";
}
}
@RequestMapping("/return")
@Controller
public class ReturnController {
@RequestMapping("/r7")
public String r7(){
return "/b.js";
}
}
可以看出Spring会根据我们返回的结果,动态设置response的Content-Type
5、设置状态码
状态码的设置不影响页面显示,所以即便状态码设置失败也不会影响页面
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody
@RequestMapping("/r8")
public String r8(HttpServletResponse response){
response.setStatus(401);
return "设置状态吗成功";
}
}
6、设置Content-Type
@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
@RequestMapping("/return")
@Controller
public class ReturnController {
@ResponseBody
@RequestMapping("/r10")
public String r10(HttpServletResponse response){
response.setHeader("myHeader","myHeaderValue");
return "设置Header成功";
}
}