Spring MVC 前端ajax传入多个参数(包含数组)后端controller的一次性接收

本文介绍如何在SpringMVC中优雅地处理前端通过AJAX发送过来的包含数组及普通属性的请求参数,包括自定义POJO类来统一接收参数,以及直接使用@RequestParam接收数组。

如上图,ajax中传入到后台的参数包含了数组和普通属性,那么在后端如何接收这些参数呢?

如果,采用request.getParamter("roleName");的方式,那么就要一个参数一个参数的取,这样不灵活。

Spring MVC 早就想到这种情况了,因此,可以自定义一个PO类或者VO类:

package com.paic.test.po;

import java.io.Serializable;
import java.util.List;

public class RoleResourcePO implements Serializable{
	private static final long serialVersionUID = 1L;
	private String roleName;
	private String roleIdentify;
	private String roleDesc;
	private List<Integer> menuIdArr;
	public String getRoleName() {
		return roleName;
	}
	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
	public String getRoleIdentify() {
		return roleIdentify;
	}
	public void setRoleIdentify(String roleIdentify) {
		this.roleIdentify = roleIdentify;
	}
	public String getRoleDesc() {
		return roleDesc;
	}
	public void setRoleDesc(String roleDesc) {
		this.roleDesc = roleDesc;
	}
	public List<Integer> getMenuIdArr() {
		return menuIdArr;
	}
	public void setMenuIdArr(List<Integer> menuIdArr) {
		this.menuIdArr = menuIdArr;
	}
}
controller中可以这样处理:

	@RequestMapping(value = "/role/addRole/submit",method = RequestMethod.POST)
	public @ResponseBody Map<String,Object> submitAddRole(RoleResourcePO roleResourcePO,HttpServletRequest request){
		Map<String,Object> repMap = new HashMap<String,Object>();
		try{
			xxxService.addRole(roleResourcePO);
			//.............
		}catch(Exception e){
			
		}
		return repMap;
	}

这样参数roleResourcePO就能一次性全部拿到前端的参数了。

(注:上图中的menuIdArr数组作为参数传到后端的时候,需要用toString处理,否则报错,而且不能使用JSON.stringify(menuIdArr),否则在后端controller中的List中会得到这样奇怪的值:第一个值[1,最后一个为3] 带了中括号,这个问题上一篇有解释了。)

最后,如果前端只传一个数组,那么可以使用

@RequestParam 这个注解:

下面介绍一下URL中传递数组参数方法:

使用ajax方式传递:

code
1
2
3
4
5
6
7
8
9
10
varparam = {titles:['col1','col2','col3']}; 
$.ajax({url:"dd.php", type:"post", data:param, async:false, dataType:"json", cache:false, error:function(data) { 
        rtnObj = data.responseText; 
    }, beforeSend:function(XMLHttpRequest) { 
        //ajaxStart(); 
    }, complete:function(XMLHttpRequest, textStatus) { 
        //ajaxComplete(); 
    }, success:function(data) { 
        rtnObj = data; 
    }});

在springMVC中controller类接收数组参数的方法:

code
1
2
3
4
5
6
@RequestMapping(value="/save", method = RequestMethod.POST) 
@ResponseBody 
publicString save(@RequestParam(value = "titles") String[] titles){ 
    System.out.println(titles); 
    returnnull
}

 


<think>首先,用户的问题是:"我想在Spring Boot应用中,如何从前端传入参数USER_NAME被后端用username变量接收。 请问Spring Boot中如何将前端传入参数名USER_NAME映射到后端接收变量username"。这是一个关于Spring Boot参数映射的问题。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但这里没有数学表达式,所以不需要。 - 独立公式必须使用$$...$$格式并单独成段,但这里没有公式。 - LaTeX语法正确:同样,不涉及数学。 - 使用中文回答:必须用中文。 - 生成相关问题:在回答结束后,生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 回答结构要清晰,帮助用户逐步解决问题,并保证真实可靠。参考提供的引用: - 引用[1]:关于URL映射和@PathVariable。 - 引用[2]:关于Spring Boot配置分页属性。 - 引用[3]:关于Spring MVC入口。 - 引用[4]:关于请求和响应拦截器。 用户的问题是关于参数映射的,所以引用[1]最相关,因为它提到了@GetMapping和@PathVariable。 核心问题:如何将前端传入参数USER_NAME映射到后端的username变量。在Spring Boot中,这可以通过多种方式实现: 1. 使用@RequestParam注解。 2. 使用@PathVariable如果参数在URL路径中。 3. 使用对象绑定。 4. 使用自定义映射。 用户指定了参数名是USER_NAME,后端变量是username,所以需要映射不同的名称。 在Spring中,可以使用@RequestParam的value属性来指定前端参数名。 例如: - 在Controller方法中:public String getUser(@RequestParam("USER_NAME") String username) { ... } 这样,前端传入USER_NAME参数,会被绑定到username变量。 如果参数在URL路径中,使用@PathVariable: - @GetMapping("/user/{USER_NAME}") - public String getUser(@PathVariable("USER_NAME") String username) { ... } 用户没有指定参数递方式(查询参数或路径参数),所以我应该覆盖常见情况。 步骤: 1. 解释使用@RequestParam进行查询参数映射。 2. 解释使用@PathVariable进行路径参数映射。 3. 提到其他方式如对象绑定或自定义转换器。 引用相关引用:引用[1]提到了@GetMapping和@PathVariable,所以我可以自然地引用它。 回答结构: - 先介绍问题。 - 然后逐步解释解决方案。 - 提供代码示例。 - 最后总结。 生成相关问题:在回答结束后,添加相关问题。 相关问题应该基于主题,比如: 1. 如何在后端处理参数验证? 2. Spring Boot中如何配置全局参数映射? 3. 如何处理多个参数的情况? 4. 如何自定义参数解析器? 确保回答真实可靠:基于Spring Boot文档或常见实践。 最终回答: - 使用中文。 - 清晰步骤。 - 代码示例。 - 引用标识。 - 相关问题。</think>### Spring Boot中前端参数名USER_NAME映射到后端username变量的方法 在Spring Boot应用中,前端传入参数名(如`USER_NAME`)需要映射到后端接收变量(如`username`),这通常涉及参数绑定的过程。Spring Boot提供了多种注解来实现这种映射,核心是`@RequestParam`或`@PathVariable`注解。下面我将逐步解释实现方法,确保结构清晰易懂。 #### 步骤1: 理解参数递方式 - **前端参数来源**:参数可能通过URL查询字符串(如`/user?USER_NAME=Tom`)或URL路径(如`/user/Tom`)递。 - **后端映射需求**:Spring Boot默认要求参数名与变量名一致,但若名称不同(如`USER_NAME`映射到`username`),需显式指定映射关系。 - **推荐注解**: - `@RequestParam`:用于URL查询参数或表单数据。 - `@PathVariable`:用于URL路径中的参数(如RESTful风格)。 - 如果涉及复杂对象,可结合`@ModelAttribute`,但本问题聚焦简单变量映射。 #### 步骤2: 使用@RequestParam实现映射(适用于查询参数) 如果参数通过URL查询字符串递(例如`http://localhost:8080/user?USER_NAME=Tom`),在Controller方法中使用`@RequestParam`注解的`value`属性指定前端参数名。 - **代码示例**: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { // 映射查询参数 USER_NAME 到后端变量 username @GetMapping("/user") public String getUser(@RequestParam(value = "USER_NAME", required = false) String username) { System.out.println("接收到的用户名: " + username); // 输出验证 return "用户名: " + username; } } ``` - **说明**: - `@RequestParam(value = "USER_NAME")`:将前端参数`USER_NAME`绑定到变量`username`。 - `required = false`:表示参数可选(如果必填,设为`true`)。 - 前端调用:`GET /user?USER_NAME=Tom`,后端`username`变量值为`"Tom"`。 #### 步骤3: 使用@PathVariable实现映射(适用于URL路径参数) 如果参数嵌入在URL路径中(例如`http://localhost:8080/user/Tom`),使用`@PathVariable`注解,并确保URL模板定义匹配。 - **代码示例**(参考引用[1]中URL映射的类似实现[^1]): ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { // 映射路径参数 {USER_NAME} 到后端变量 username @GetMapping("/user/{USER_NAME}") public String getUser(@PathVariable(value = "USER_NAME") String username) { System.out.println("接收到的用户名: " + username); // 输出验证 return "用户名: " + username; } } ``` - **说明**: - `@PathVariable(value = "USER_NAME")`:将URL中的`{USER_NAME}`占位符绑定到变量`username`。 - 前端调用:`GET /user/Tom`,后端`username`变量值为`"Tom"`。 - 路径参数常用于RESTful API设计,如引用[1]中的示例[^1]。 #### 步骤4: 其他注意事项 - **默认值与校验**:可添加默认值或简单校验。 ```java @GetMapping("/user") public String getUser( @RequestParam(value = "USER_NAME", defaultValue = "Guest") String username) { // 如果未USER_NAME,username默认为"Guest" } ``` - **全局配置(可选)**:如果多个参数需统一重命名,可自定义`HandlerMethodArgumentResolver`,但会增加复杂度。通常推荐直接在Controller中显式映射。 - **前端一致性**:确保前端发送参数时使用`USER_NAME`(如Ajax请求或表单提交),避免大小写敏感问题(HTTP参数通常不区分大小写,但Spring默认不敏感)。 - **常见错误**: - 未添加注解导致绑定失败:Spring无法自动映射不同名的参数。 - URL路径不匹配:使用`@PathVariable`时,URL模板必须包含`{USER_NAME}`。 #### 总结 - **推荐方法**:优先使用`@RequestParam`(查询参数)或`@PathVariable`(路径参数),并通过`value`属性指定前端参数名。 - **优势**:Spring Boot自动处理类型转换(如String到其他类型),无需额外配置。 - **适用场景**:适用于简单参数映射,如用户查询、筛选操作等。如果涉及分页或复杂对象,可参考引用[2]中的配置思路[^2]。 通过以上步骤,您可以轻松实现`USER_NAME`到`username`的映射。如果有更多场景需求,如拦截器处理(类似引用[4]中的请求拦截[^4]),可进一步扩展。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值