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

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是整体作为一个流传入到后台的

希望对你有所帮助!

相关文章:

  • Scala集合操作与WordCount案例实战总结
  • Linux命令-iostat
  • w~嵌入式C语言~合集6
  • Spring中生成Bean的方式总结-笔记
  • 颠覆传统微商!开源AI智能名片链动2+1模式S2B2C商城小程序:重构社交电商的“降维打击”革命
  • 基于Playwright的浏览器自动化MCP服务
  • Go 语言 核心知识点
  • golang goroutine(协程)和 channel(管道) 案例解析
  • go语言八股文(四)
  • Apache Sqoop数据采集问题
  • 【Spring Boot】Maven中引入 springboot 相关依赖的方式
  • 大模型——Suna集成浏览器操作与数据分析的智能代理
  • [Vulfocus解题系列]Apache HugeGraph JWT Token硬编码导致权限绕过(CVE-2024-43441)
  • Apache Tomcat 漏洞(CVE-2025-24813)导致服务器面临 RCE 风险
  • vue项目页面适配
  • 数据结构【堆和链式结构】
  • PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell
  • 耳机,三段式, 四段式,录音,播放
  • C++修炼:list模拟实现
  • spark学习总结
  • 上海“生育友好岗”已让4000余人受益,今年将推产假社保补贴政策
  • 在差异中建共鸣,《20世纪美国文学思想研究》丛书出版
  • 高璞任中国第一汽车集团有限公司党委常委、副总经理
  • 三杀皇马剑指四冠,硬扛到底的巴萨,赢球又赢人
  • 戴昕谈隐私、数据、声誉与法律现实主义
  • 体坛联播|巴萨“三杀”皇马夺国王杯,陈妤颉破亚洲少年纪录