SpringMVC实验(四)——前后端分离下的数据交互

【知识要点】

  1. 前后端分离概念
    前端开发不依赖与后端,二者均可独立发展。二者责任与分工明确,前端负责人机交互操作,后者负责仅提供数据服务,不再参与前端页面的跳转的控制。随着前端设备的多元化,前后端分离开发已经成为当前开发的主流模式。
  2. 请求参数接收
    后端对请求参数可以通过传统的HttpServletRequest对象,传递的数据、session、cookie等数据的接收;通过正常变量,如:String、Integer、实体对象进行接收、通过JSON接收数据。其中通过JSON接收数据时,需要使用springmvc提供的注解符@RequestBody,通过JSON传递多个参数已经成为当前主流模式。
  3. 注解符@RequestParam
    前后端参数传值时,要求请求数据的变量名称和后端方法的行参名完全一致,这是一种紧耦合的方式。双方名称不一致时,使用这个注解符建立映射关系。
  4. restful风格的参数
    在restful风格编程中,要求使用路径占位传参,在get请求中所传参数只有值没有名称,需要使用@PathVariable完成路径占位传参
  5. 控制器方法的返回值
    控制器方法返回值包括ModelAndView、String、Void和JSON四种类型,其中ModelAndView、String涉及页面跳转,不符合前后端分离的要求,Void使用传统的HttpServletRespone返回数据,不是主流的返回方式;使用JSON返回数据是当前主流模式,这种返回模式,需要在方法上使用注解符@ResponseBody,如果整个控制器所有的方法均返回JSON格式的数据,则可以简化为在控制器类上加@RestController注解。

【实验目的】

  1. 掌握请求数据的接收
  2. 掌握控制器方法的返回值

【实验内容】

  1. 请求参数的接收
  2. 返回JSON格式数据

【实验步骤】

1. 实验环境搭建

1). 使用maven创建web工程demo4

2). 由于项目需要使用JSON格式的数据,需要添加依赖包坐标如下所示:

xml 复制代码
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-core</artifactId>  
    <version>2.11.2</version>  
</dependency>  
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-databind</artifactId>  
    <version>2.11.2</version>  
</dependency>

2. 参数绑定

1) 使用HttpServletRequest对象接收参数,代码如下:

java 复制代码
@RequestBody
@RequestMapping("verify1")  
public String handle1(HttpServletRequest request){  
  Map<String,String> dataMap = new HashMap<>();  
  dataMap.put("method",request.getMethod());  
  dataMap.put("queryString",request.getQueryString());  
  dataMap.put("url",request.getRequestURL().toString());  
  dataMap.put("params",request.getParameter("dataNo"));  
       
  return dataMap
}  

在request对象中还可以获取Cookie读取,http请求字段等信息。

2). 使用变量接收数据,请求参数名与方法中行参名一致,代码如下:

java 复制代码
@RequestMapping("verify2")  
public void handle2(String name,Integer age) {  
   System.out.println("参数name为:"+name+",年龄为"+age);  
}  

3). 使用实体传参,要求前端传递的Content-Type为"application/x-www-form-urlencoded"时可用实体类型接收参数,要求请求中key与实体的属性名一致,代码如下:

java 复制代码
@RequestMapping("verify3")  
public void handle2(UserVO user) {  
   System.out.println("参数name为:"+user.getName()+",年龄为"+user.getAge());  
}  

4) 传递简单数据类型数组,使用get方法,params的参数名与方法中行参名一致,代码如下:

java 复制代码
@RequestMapping("verify6")  
public void handle6(Integer[] ids){  
    String strIds="[";  
    for (Integer id:ids) {  
        strIds = strIds + id.toString()+",";  
    }  
   strIds = strIds.substring(0,strIds.length()-1) + "]";  
   System.out.println(strIds); 
} 

5)@RequestParam注解符使用,请求参数名与方法中的行参名不一致时,这个注解符标注在参数前面,建立请求参数名与方法形参的映射关系。如:前端传递的参数为userName,控制器方法行参名为name,代码如下:

java 复制代码
@RequestMapping("verify5")  
public void handle5(@RequestParam("userName") String name, Integer age){  
   System.out.println("参数name为:"+name+",年龄为"+age);  
} 

6)使用json传参,要求前端传递的Content-Type为"application/json"时可用实体类型接收参数,要求请求中key与实体的属性名一致,此种传参数方式是传参的主流方式,代码如下:

java 复制代码
@RequestMapping("verify4")  
public void handle4(@RequestBody UserVO user) {  
   System.out.println("参数name为:"+user.getName()+",年龄为"+user.getAge());   
}  

7) 路径占位传参,Restful风格传递参数时,使用{}占位符和@PathVariable注解符。

java 复制代码
/** 路径占位接收参数,名称相同 */  
@GetMapping("/user/{id}")  
public String index(@PathVariable Integer id) {  
    System.out.println(id);  
    return "index";  
}  
  
/** 路径占位接收参数,名称不同 */  
@GetMapping("/user/{id}")  
public String index(@PathVariable("id") Long userId) {  
    System.out.println(userId);  
    return "index";  
} 

返回值

1)注解符@ResponseBody使用在方法上,表示此方法返回json格式的数据,代码如下:

java 复制代码
@ResponseBody  
@RequestMapping("test06")  
public UserVO handle6(){  
    UserVO user = new UserVO();  
    user.setName("张小凡");  
    user.setAge(18);  
  
    return user;  
} 

2)注解符@RestController注解类上,表示此控制器中所有的方法均返回json格式的数据,方法上不再使用@ResponseBody,代码如下:

java 复制代码
@RestController  
@RequestMapping("restful")  
public class RestfulController {  
    @GetMapping("/user/{id}")  
    public String index(@PathVariable Integer id) {  
        System.out.println(id);  
        return "index";  
    }  
} 
相关推荐
爱学习的白杨树4 分钟前
Spring Cloud Gateway 介绍
java·运维·开发语言
androidwork6 分钟前
Android 中 OkHttp 的自定义 Interceptor 实现统一请求头添加
android·java·okhttp·kotlin
bing_15832 分钟前
Spring Data MongoDB 提供了哪些核心组件?
java·mongodb·spring
知秋丶37 分钟前
Spring-rabbit重试消费源码分析
java·后端·spring
hello早上好40 分钟前
Spring Bean后处理器
java·架构
沉豆1 小时前
Jmeter调用jar包中的方法,并使用返回值当请求参数
java·jmeter·jar
天天摸鱼的java工程师1 小时前
synchronized 与 ReentrantLock 区别?公平锁、非公平锁、可重入锁、自旋锁的原理与应用?
java·后端
一只白鸭子1 小时前
从实践到思考:Spring Boot + MyBatis关系查询小分享
java
天天摸鱼的java工程师1 小时前
详解 Spring Boot 的 RedisAutoConfiguration 配置:从自动装配到自定义扩展
java·后端
Dcs1 小时前
Java 新手指南:类和对象到底是啥?
java