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

SpringMVC 通过ajax 前后端数据交互

在前端的开发过程中,经常在html页面通过ajax进行前后端数据的交互,SpringMVC的controller进行数据的接收,但是有的时候后端会出现数据无法接收到的情况,这个是因为我们的参数和前端ajax的contentType参数 类型不对应的情景,或者说contentType和后台controller 方法参数到底存在什么样的关系

普通的参数我们传递的时候往往是这样的两种情况:

contentType: "application/x-www-form-urlencoded",
contentType: "application/json",

这样的两种方式有什么样的区别,

第一种方式:application/x-www-form-urlencoded 参数会解析为参数表,比如:

  • name=John+Doe&age=30&city=New+York
    

 通过ajax 传递,ajax写法如下:

           	let params={"username":"张三","password":"123456",}$.ajax({url: "dologin4",contentType: "application/x-www-form-urlencoded",headers: {  'Authorization': "****",'Access-Control-Allow-Origin':'*'},type: 'post',data: params,success: function(result) {console.log(result)},error: function(data) {console.log('接口不通');}});

这样的形式,后台接受的时候,使用:request.getParameter()@RequestParam,比如:

	@RequestMapping("/dologin")public ModelAndView dologin(@RequestParam String username,@RequestParam String password) throws Exception {System.out.println(username);System.out.println(password);ModelAndView mav = new ModelAndView();mav.addObject("info", "欢迎你");mav.setViewName("success");return mav;}@ResponseBody@RequestMapping("/dologin2")public Map<String,Object> dologin2(HttpServletRequest request,HttpServletResponse response) throws Exception {String username=request.getParameter("username");System.out.println(username);Map<String,Object> map=new HashMap<>();map.put("aa", "1111");return map;}

 

适合 x-www-form-urlencoded 的情况:

  • 传统HTML表单提交

  • 简单的键值对数据

  • 需要向后兼容老系统

  • 文件上传(结合multipart/form-data

第二种方式:contentType: "application/json", 整个body作为单一数据流处理,比如:

{"name": "John Doe","age": 30,"city": "New York","hobbies": ["reading", "swimming"]
}

通过ajax 传递,ajax写法如下:

           function dologin(){let params={"username":"张三","password":"123456",}$.ajax({url: "dologin4",contentType: "application/json",headers: {  'Authorization': "****",'Access-Control-Allow-Origin':'*'},type: 'post',data: JSON.stringify(params),success: function(result) {console.log(result)},error: function(data) {console.log('接口不通');}});}

Java后台接受前台传入参数的代码如下:@RequestBody

	@ResponseBody@RequestMapping("/dologin4")public Map<String,Object> dologin4(HttpServletRequest request,HttpServletResponse response) throws Exception {String uu=request.getParameter("username");System.out.println(uu);StringBuilder jsonBuilder = new StringBuilder();try (BufferedReader reader = request.getReader()) {String line;while ((line = reader.readLine()) != null) {jsonBuilder.append(line);}}String jsonString = jsonBuilder.toString();ObjectMapper mapper = new ObjectMapper();Map<String, Object> jsonMap = mapper.readValue(jsonString, Map.class);  String username = (String) jsonMap.get("username");System.out.println(username);Map<String,Object> map=new HashMap<>();map.put("aa", "1111");return map;   }@ResponseBody@RequestMapping("/dologin3")public Map<String,Object> dologin3(@RequestBody Map<String,Object> reqMap) throws Exception {String username=reqMap.get("username").toString();System.out.println(username);Map<String,Object> map=new HashMap<>();map.put("aa", "1111");return map;}

适合 application/json 的情况:

  • RESTful API通信

  • 复杂数据结构

  • 需要明确数据类型

  • 前后端分离架构

  • 移动应用与服务器通信

两种情景是不一样的,如果你前端传入的是json格式,那么后端你用:

    String uu=request.getParameter("username");
    System.out.println(uu);

这样是无法接收到数据的,接收到的参数一直为null,因为json是整体作为一个流传入到后台的

希望对你有所帮助!

http://www.xdnf.cn/news/2415.html

相关文章:

  • 空间矩阵的思考
  • SpringMVC框架
  • 二、Web服务常用的I/O操作
  • HTML5 新特性详解:语义化标签、表单与音视频嵌入
  • pytorch写张量pt文件,libtorch读张量pt文件
  • 网络基础概念
  • HCIP知识点总结思维导图
  • Redis远程链接应用案例
  • 【计算机网络物理层】从信号传输到介质选型的核心技术解析
  • Web服务器技术选型指南:主流方案、核心对比与策略选择
  • 数据可视化 —— 饼图
  • 《MySQL 技术内幕-innoDB 存储引擎》笔记
  • 简述删除一个Pod流程?
  • HTTP:十二.HTTPS
  • UE 新建一个自带光照的场景
  • Git常用命令简明教程
  • 【每日随笔】文化属性 ① ( 天机 | 强势文化与弱势文化 | 文化属性的形成与改变 | 强势文化 具备的特点 )
  • 有源晶振输出匹配电阻选择与作用详解
  • AUTOSAR_Feature_Model_Analysis
  • 近期有哪些断链危机?如何提升供应链风险管理能力?
  • 头歌实训之游标触发器
  • 【Jupyter 启动时如何指定目录】
  • Android开机动画资源包制作(测试使用)
  • 数据库3,
  • 使用wavesurferJs实现录音音波效果
  • 突破常规:探索无 get 方法类设计的独特魅力
  • 1、Linux操作系统下,ubuntu22.04版本切换中英文界面
  • Spring security详细上手教学(三)密码管理
  • 基于STM32、HAL库的HX710A模数转换器ADC驱动程序设计
  • 【PyCharm- Python- ArcGIS】:安装一个和 ArcGIS 不冲突的独立 Python让PyCharm 使用 (解决全过程记录)