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格式的数据,需要添加依赖包坐标如下所示:

<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对象接收参数,代码如下:

@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). 使用变量接收数据,请求参数名与方法中行参名一致,代码如下:

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

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

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

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

@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,代码如下:

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

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

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

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

/** 路径占位接收参数,名称相同 */  
@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格式的数据,代码如下:

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

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

@RestController  
@RequestMapping("restful")  
public class RestfulController {  @GetMapping("/user/{id}")  public String index(@PathVariable Integer id) {  System.out.println(id);  return "index";  }  
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVM实现component之间transaction级别的通信

my_model是从i_agt中得到my_transaction&#xff0c;并把 my_transaction传递给my_scoreboard。在UVM中&#xff0c;通常使用TLM&#xff08;Transaction Level Modeling&#xff09;实现component之间transaction级别 的通信。 在UVM的transaction级别的通信 中&#xff0c;数…

在Word中移动页面主要靠导航窗格,有了它,移动页面就事半功倍

本文包括有关在Microsoft Word 2019、2016和Office 365中使用导航窗格移动页面以及复制和粘贴页面的说明。 如何设置导航窗格以重新排列页面 Microsoft Word并不将文档视为单独页面的集合,而是将其视为一个长页面。正因为如此,重新排列Word文档可能会很复杂。在Word中移动页…

【精选】ATKCK红队评估实战靶场二 (超详细过程思路)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【ATK&CK红队评估实战靶场】 【VulnHub靶场复现】【面试分析】 &#x1f…

【.NET Core】Linq查询运算符(一)

【.NET Core】Linq查询运算符&#xff08;一&#xff09; 文章目录 【.NET Core】Linq查询运算符&#xff08;一&#xff09;一、概述二、筛选数据三、投影运算3.1 Select 3.2 SelectMany3.3 Zip3.4 Select 与 SelectMany 四、Set&#xff08;设置&#xff09;运算4.1 Distinct…

智能优化算法应用:基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.堆优化算法4.实验参数设定5.算法结果6.参考文献7.…

Verilog if语句阻断z状态传播

一、测试代码 设置两组输入输出&#xff0c;对比使用assign赋值语句与always if语句。 if_assign_test.v timescale 1ns / 1ps // // Engineer: wkk // Module Name: if_assign_test // module if_assign_test(input if_a_in,input if_b_in,input if_c_in,input if_d_in…

在线网页视频提取工具哪个好用?建议收藏!

随着短视频的崛起&#xff0c;很多人都喜欢将视频下载到手机中慢慢观看&#xff0c;这样可以避免在线播放的卡顿问题&#xff0c;但是会遇到一个问题就是在线网页视频提取工具哪个好用&#xff0c;有的可以提取但是画质太差模糊&#xff0c;有的自带水印飞来飞去。今天小编给大…

同旺科技 USB TO SPI / I2C --- 调试W5500_读写网关地址

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 这里的网关地址设置为192.168.1.1 先将网关地址写入寄存器&#xff0c;然后再读取出来&#xff1a;

关于神舟-战神TA5NS系统重装问题

加装固态卡在log处无法开机问题 下面是我的步骤 1.按f7选择pe安装系统&#xff0c;然后发现卡在战神log处不转动 2.下载驱动 TA5NS驱动地址 下载RAID驱动&#xff08;如果没有私信我&#xff0c;我网盘里有&#xff09;&#xff0c;拷到u盘中&#xff0c;然后进入pe系统里面…

Educational Codeforces Round 159 (Rated for Div. 2) 之 A - E 题

目录 [A. Binary Imbalance](https://codeforces.com/contest/1902/problem/A)DescriptionSolutionCode [B. Getting Points](https://codeforces.com/contest/1902/problem/B)DescriptionSolutionCode [C. Insert and Equalize](https://codeforces.com/contest/1902/problem/…

分享126个图片JS特效,总有一款适合您

分享126个图片JS特效&#xff0c;总有一款适合您 126个图片JS特效下载链接&#xff1a;https://pan.baidu.com/s/1sOKHo4RciQXwQX9vhLIm3g?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

【Maven】更新依赖索引

有时候给idea配置完maven仓库信息后&#xff0c;在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了&#xff0c;具体做法如下&#xff1a; 打开设置----搜索maven----Repositories----选中本地仓库-…

【C++】友元函数

文章目录 一、友元二、友元函数三、友元类 一、友元 友元分为&#xff1a;友元函数和友元类 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以友元不宜多用。 二、友元函数 友元可以是一个函数&#…

Javafx实现浏览器

浏览器是一种计算机程序&#xff0c;主要用于显示互联网上的网页。通过浏览器&#xff0c;用户可以访问各种网站、搜索引擎、在线应用程序、社交媒体等。常见的浏览器包括Google Chrome、Mozilla Firefox、Safari、Microsoft Edge、Opera等。浏览器的功能不仅限于浏览网页&…

shell编程

1、开发内存监测脚本 功能描述 监测linux剩余可用的内存&#xff0c;当可用内存小于100M时&#xff0c;就发邮件给我&#xff1b;并且将该脚本加入crontab&#xff0c;每3分钟检查一次内存知识点 获取当前内存的命令&#xff1a;free -m # 以兆的形式显示代码 #! /bin/bashf…

15、pytest的fixture调用fixture

官方实例 # content of test_append.py import pytest# Arrange pytest.fixture def first_entry():return "a"# Arrange pytest.fixture def order(first_entry):return [first_entry]def test_string(order):# Actorder.append("b")# Assertassert orde…

Python中检查字符串是否仅包含字母的多种方法:深入探究

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 随着Python在数据处理和字符串操作方面的广泛应用&#xff0c;经常需要对字符串进行验证&#xff0c;确认其是否仅包含字母。本文将探讨Python中的多种方法来检查字符串是否只由字母组成&#xff0c;以及它们的应…

springboot的配置文件加载总结

优先级 在同一级目录下&#xff0c;会先比较前缀bootstrap、application&#xff0c;其中bootstrap比application的优先级高&#xff0c;其次再去比较后缀.properties、.yml&#xff0c;其中.properties比.yml优先级高 所以它们的执行顺序如下&#xff1a; bootstrap.propert…

自助POS收银机-亿发互联网收银解决方案助力零售业迎接数字经济挑战

零售业作为中国经济的主动脉&#xff0c;扮演着至关重要的角色。最新发布的《中国线下零售小店数字化转型报告》揭示了当前线下零售小店所面临的多重痛点&#xff0c;经营方式传统、滞后的内部管理和营销模式&#xff0c;以及缺乏消费数据等问题&#xff0c;这些痛点都指明&…

项目经理是干出来的,不是教出来的

大家好&#xff0c;我是老原。 有不少新手项目经理&#xff0c;在通过了PMP认证考试&#xff0c;拿到PMP证书后&#xff0c;对之前无序的项目管理状态感觉有了一丝通透的感觉&#xff0c;对接受新项目更是信心满满。 然后就有不少没有项目管理经验&#xff0c;且刚刚考取PMP证…