spring boot 基础学习 - 请求参数映射与参数j校验

本文介绍了Spring Boot如何处理不同类型的请求参数映射,包括简单数据、复杂对象、数组和集合、JSON字符串以及RESTful请求的参数封装。通过示例代码详细讲解了@RequestParam、@PathVariable和@RequestBody等注解的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring boot 支持多种类型的请求参数映射

1.简单数据的映射

简单数据我们只需要给handler添加相应的形参,保证形参名称和页面请求参数的名称一致,spring 就会回自动的帮我们将请求参数进行格式装换并封装到形参中:

handler代码:

@RequestMapping("paramstest")
	public String simpleparam(Integer id,String username,Boolean signin) {
		System.out.println("id   --->   " + id);
		System.out.println("username   --->   " + username);
		System.out.println("signin   --->   " + signin);
		return "paramstest";
	}
jsp代码:
<form action="./paramstest.action" method="GET">
		String类型:<input type="text" name="username" /><br />
		int类型:<input type="text" name="id" ><br />
		布尔类型:<input type="text" name="signin" /><br />
		<input type="submit" value="提交" /><br />
	</form>
浏览器提交后控制台结果:

上面这种方法和struts参数映射一样,要求页面提交的参数名称个形参名称完全一样,才能真确封装,但是有时候为了业务需求或其他的原因我们没办法保证两者一致,那该怎么办呢?这个时候我们可以使用@RequestPrarm注解来实现,如下,jsp页面不改变,但是形参名称改变:

@RequestMapping("paramstest")
public String simpleparam(@RequestParam("id") Integer uid,@RequestParam("username") String name,@RequestParam("signin") Boolean in) {
		System.out.println("id   --->   " + uid);
		System.out.println("username   --->   " + name);
		System.out.println("signin   --->   " + in);
		return "paramstest";
	}
当页面提交时,后台任然能够正确的获取到请求参数:


2.复杂类型参数的映射:

上面的参数映射方式有个很明显的弊端,那就是一旦提交参数变多,handler代码就变得非常难看,参数处理起来也比较费事,在spring中我们也可以使用简单对象(pojo类)来对参数进行封装,

我们只需要定义一个pojo类,该类中定义字段名与提交的参数名一致并提供相应的getter,spring 一样可以对参数进行正确的封装,当然,你也可以在handler同时使用简单参数和pojo对参数进行封装,这个时候,当pojo中有属性与形参属性名一致时,spring 会同时对这两个位置进行相同的封装,当然,除了特殊需要,个人不建议这么做。

jsp页面不变,pojo代码如下:

// pojo代码
public class PrarmsPojo {
	private Integer id;
	private String username;
	private Boolean signin;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Boolean getSignin() {
		return signin;
	}
	public void setSignin(Boolean signin) {
		this.signin = signin;
	}
}
handler代码
@RequestMapping("paramstest")
	public String simpleparam(ParamsPojo pojo) {
		System.out.println("id   --->   " + pojo.getId());
		System.out.println("username   --->   " + pojo.getUsername());
		System.out.println("signin   --->   " + pojo.getSignin());
		return "paramstest";
	}
结果:


对象也可以封装了,那么接下来我们看看数组和list集合类型的封装。

3.通过形参直接接受数组或者集合:

首先我们在jsp中添加一段代码:

list数据类型:<br />
吃:<input type="checkbox" name="hobby" value="吃">  
喝:<input type="checkbox" name="hobby" value="喝">  
玩:<input type="checkbox" name="hobby" value="玩">  
乐:<input type="checkbox" name="hobby" value="乐">  
敲代码:<input type="checkbox" name="hobby" value="敲代码"><br />

这里要想直接通过形参接受数组或者list的话,无论前台提交的参数名称与形参名称是否一致都必须使用@RequestParam注解,并且设置value值为页面参数名称。佛则就会报错!不知道为什么百度好多结果都说不能直接封装...还需要在页面修改是什么的...

// handler代码
@RequestMapping("paramstest")
public String paramstest(@RequestParam("hobby") Integer[] hobby) {
	System.out.println(Arrays.toString(hobby));
	return "index";
}
结果:

List也是一样的操作!

4,将页面数组参数疯转到pojo对象:

这个就更简单了,直接在pojo中添加成员变量,添加setter即可:

// handler代码
@RequestMapping("paramstest")
public String paramstest(PrarmsPojo pojo) {
	System.out.println(pojo.gethobby());
	return "index";
}

5,将json格式的字符串封装到对象中

通常我们发送ajax请求都会使用$.post,或者$.get,但是如果我们要使用spring boot来解析提交的json数据就不能用这两种方式,而必须采用$.ajax,应为前面两种方式提交数据时,数据的contenttype为:application/x-www-form-urlencoded,而是spring并不会将这种类型的数据当成json数据解析,而是只会把contentType为application/json;charset=utf-8的数据当做json数据来解析,所以只能用$.ajax方式,在提交时手动指定ContentType;

而后台handler,默认将数据当做application/x-www-form-urlencoded 来解析,所以要想让spring将数据已json格式解析,需要在用于接收数据的形参前面加上一个注解:@RequestBody,当spring发现这个注解时,就会将对应的数据使用json解析器转换并封装.

// jsp部分代码
function jsonTest() {
	$.ajax({
		url : "./paramstest.action",
		type : "POST",
		contentType:"application/json;charset=utf-8",
		data : '{"hobby":["吃","喝","玩"],"id":1,"username":"bug4j的博客"}',
		success : function(data) {
			alert("成功");
		},
		error : function() {
			alert("失败");
		}
	});
}
// handler 代码
@RequestMapping("paramstest")
public String simpleparam(@RequestBody ParamsPojo pojo) {
	System.out.println(pojo.getHobby());
	return "paramstest";
}
结果:

6.RestFul请求参数的封装

近几年,restFul风格也慢慢的流行起来了,RestFUL最大的特点就是,对于不同的Http请求方式定义了不同的业务功能,而且url层级分明,直观的表达了请求的目的!参数也比较特别:有些参数是单独的出想在url,而不像传统的参数以键值对的形式提交,接收这种形式的参数主要用到一个注解:@PathVariable,代码如下:

// handler 代码
@RequestMapping("/paramstest/{id}/{name}")
	public String simpleparam(@PathVariable(value="id") Integer id,@PathVariable(value="name") String name) {
		System.out.println(id);
		System.out.println(name);
		return "paramstest";
	}
请求路径:http://localhost:9020/start//paramstest/11/bug4j

结果:

当然,我们还可以在@requestMapping中指定handler接收的请求方式,下回专门写篇关于spring boot 的restFul风格编程


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值