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写法如下:

javascript 复制代码
           	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,比如:

java 复制代码
	@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写法如下:

javascript 复制代码
           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

javascript 复制代码
	@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是整体作为一个流传入到后台的

希望对你有所帮助!

相关推荐
JinSo9 分钟前
pnpm monorepo 联调:告别 --global 参数
前端·github·代码规范
程序员码歌16 分钟前
豆包Seedream4.0深度体验:p图美化与文生图创作
android·前端·后端
urhero19 分钟前
工作事项管理小工具——HTML版
前端·html·实用工具·工作事项跟踪·任务跟踪小工具·本地小程序
二十雨辰21 分钟前
eduAi-智能体创意平台
前端·vue.js
golang学习记30 分钟前
从0死磕全栈之Next.js connection() 函数详解:强制动态渲染的正确姿势(附实战案例)
前端
郝学胜-神的一滴36 分钟前
Three.js光照技术详解:为3D场景注入灵魂
开发语言·前端·javascript·3d·web3·webgl
m0dw40 分钟前
vue懒加载
前端·javascript·vue.js·typescript
国家不保护废物1 小时前
手写 Vue Router,揭秘路由背后的魔法!🔮
前端·vue.js
菜鸟‍1 小时前
【前端学习】仿Deepseek官网AI聊天网站React
前端·学习·react.js
小光学长2 小时前
基于Vue的保护动物信息管理系统r7zl6b88 (程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js