SpringMVC绑定控制器类处理方法入参

当页面触发请求时,一般会把一些请求参数(key/value)带到后台来处理,SpringMVC中可以通过参数绑定来完成绑定,它支持将多种途径将传递的参数绑定到控制器类的处理方法的参数中。

1. 映射URL绑定的占位符到方法入参

使用@PathVariable注解可以把URL中的占位符绑定到方法入参。
代码如下:

@RequestMapping(value="/test1/{username}")
public String test1(@PathVariable("username")String username) {
	System.out.println(username);
	return "success";
}

URL:

http://localhost:8080/bind/user/test1/admin

URL中的占位符{username}通过注解@PathVariable(“username”)绑定到test1方法的参数username中。

2. 绑定请求参数到控制器方法参数

使用@RequestParam注解可以将请求参数传递给方法,value属性指定参数名;required属性指定参数是否必需,默认为true,不传值会报错;defaultValue属性指定参数的默认值,使用这个属性时,默认required属性是false,也就是非必需的,即你请求时不传值,它就传默认值。
代码如下:

	@RequestMapping(value="/test2")
public String test2(@RequestParam(value="username")String username,@RequestParam("password")String password) {
	System.out.println(username+"<==>"+password);
	return "success";
}

URL:

http://localhost:8080/bind/user/test2?username=admin&password=123456

页面:

<form action="../user/test2" method="get">
账号:<input name="username"/><br/>
密码:<input name="password"/><br/>
<button type="submit">提交</button>

value属性的值必需和页面中需要绑定的的对象的name值是相同的,否则会绑定失败报错。

@PathVariable的URL是使用“/”,获取的是请求路径中参数的值;而@RequestParam是从“?”开始,获取的是“?”后面的参数值。很显然前者首先比较安全,你即使看到传的值,你也不知道它具体的含义,而后者如果采用get请求时,URL就可以直接看到key=value的值和含义。

2.1 懒人写法(不推荐)

什么也不用添加,就直接写,但是参数名得和页面的对象的name值是相同的,否则获取的值为null。
代码如下:

@RequestMapping(value="/test2")
public String test2(String username,String password) {
	System.out.println(username+"<==>"+password);
	return "success";
}

它相当于用request对象来获取对象的值。比如下面的方法

username = request.getParameter("username");
password = request.getParameter("passowrd");

@RequestParam注解有个痛点,方法参数写起来特别的长,如果请求参数很多的话,那堪比万里长城。于是就有了下面这种方法。 #### 3. 将请求参数绑定到控制器的表单对象 SpringMVC会按照参数名和属性名进行自动匹配,自动为该对象填充属性值,并且支持级联。这也是我们经常用到的方法,当请求参数过多时,可以使用一个实体类来进行绑定。 实体类:
public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

(这里记得写属性的get/set方法,否则无法进行赋值,相应的字段值为null)

控制器方法:

@RequestMapping(value="/test3")
public String test3(User user) {
	System.out.println(user);
	return "success";
}
4. 将请求参数绑定到控制器方法的Map对象

创建实体类:

public class UserMap {
	private Map<String,User> map;

	public Map<String, User> getMap() {
		return map;
	}

	public void setMap(Map<String, User> map) {
		this.map = map;
	}
	
}

之所以创建实体类,是因为Map对象需要绑定到对象上,而不能直接写在controller方法参数中。

控制器:

@RequestMapping(value="/test4")
public String test3(UserMap map) {
	Set<String> keySet = map.getMap().keySet();
	for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
		String key = (String) iterator.next();
		User user = map.getMap().get(key);
		System.out.println(user);
		
	}

页面:

<form action="../user/test4" method="get">
1<br/>
账号:<input name="map['user1'].username"/><br/>
密码:<input name="map['user1'].password"/><br/>
2<br/>
账号:<input name="map['user2'].username"/><br/>
密码:<input name="map['user2'].password"/><br/>
<button type="submit">提交</button>
</form>
5. 将请求参数绑定到控制器方法的List对象

List和绑定Map的实现基本一样。

public class UserList {
	private List<User> list;

	public List<User> getList() {
		return list;
	}

	public void setList(List<User> list) {
		this.list = list;
	}
	
}
@RequestMapping(value="/test5")
public String test3(UserList list) {
	for (User user : list.getList()) {
		System.out.println(user);
	}
	return "success";
}
<form action="../user/test5" method="get">
1<br/>
账号:<input name="list[0].username"/><br/>
密码:<input name="list[0].password"/><br/>
2<br/>
账号:<input name="list[1].username"/><br/>
密码:<input name="list[1].password"/><br/>
<button type="submit">提交</button>
</form>
6. 将请求参数绑定到控制器方法的Set对象

Set绑定时,必须先在Set对象中add相应数量的模型对象。

public class UserSet {

	private Set<User> set = new HashSet<>();
	//因为我页面使用2个user对象,所以这里add2个
	public UserSet() {
		set.add(new User());
		set.add(new User());
	}
	public Set<User> getSet() {
		return set;
	}

	public void setSet(Set<User> set) {
		this.set = set;
	}
	
}
@RequestMapping(value="/test6")
public String test6(UserSet set) {
	for (User user : set.getSet()) {
		System.out.println(user);
	}
	return "success";
}
<form action="../user/test6" method="get">
1<br/>
账号:<input name="set[0].username"/><br/>
密码:<input name="set[0].password"/><br/>
2<br/>
账号:<input name="set[1].username"/><br/>
密码:<input name="set[1].password"/><br/>
<button type="submit">提交</button>
</form>

ps:如果最大下标大于set.size,会报错。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃鱼的ねこ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值