4 springmvc参数绑定

当项目中引入springmvc框架后,所有的请求流转将由springmvc进行控制,
当客户端发送的请求中包含数据(也就是请求参数)时,那么该如何在controller层获取这些参数呢?

springmvc会自动的将请求中包含的参数和方法的参数进行匹配,也就是说只要保证,
请求中的参数名称和方法中的参数名称相对应(另,参数的格式也要正确),
在方法中就可以使用这些参数—即请求中的参数。

4.1基本类型参数绑定

当需要获取客户端发送过来的少量数据时,可以在Controller中声明的方法上,
通过声明方法参数对这些参数一个一个进行接收,具体示例如下:

需求:
通过浏览器发请求访问Controller,
并在请求中携带name、age数据访问服务器,在服务器端的 Controller中获取这些数据。

1、创建com.tedu.controller.ParamController类

2、在ParamController类中添加param1方法,用于接收基本类型的参数,代码实现如下:

package com.tedu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller /* 这个注解表示当前类是属于控制层 */
public class ParamController {
	/* 测试:接收基本类型的类型的参数 */
	@RequestMapping("param1")
	public String param1(String name, Integer age){
		System.out.println("name="+name);
		System.out.println("age="+age);
		return "home";
	}
}

3、访问ParamController中的param1方法,在访问时,注意将name和age参数一起发送给服务器:

控制台输出结果为:

4.2包装类型参数绑定

当需要获取客户端发送过来的多个数据时,可以在Controller中声明的方法上,通过声明方法参数对这些数据一个一个进行接收较麻烦,可以在方法上声明对象类型的参数,通过对这些数据统一进行接受,springmvc会自动将接收过来的参数封装在对象中,具体示例如下:

1、在ParamController类中添加param2方法,用于接收对象类型的参数,代码实现如下:

package com.tedu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller /* 这个注解表示当前类是属于控制层 */
public class ParamController {
	/* 测试:接收对象类型的参数 */
	@RequestMapping("param2")
	public String param2(User user){
		System.out.println("user="+user);
		return "home";
	}
	
	@RequestMapping("param1")
	public String param1(String name, Integer age){
		System.out.println("name="+name);
		System.out.println("age="+age);
		return "home";
	}
}

3、创建User类,声明name和age属性,提供对应的set和get方法,并重写toString方法

package com.tedu.controller;

public class User {
	/* 声明name、age属性 */
	private String name;
	private Integer age;
	
	/* 声明name、age属性对应的set和get方法 */
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	/* 重写toString方法 */
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}

4、访问ParamController中的param2方法,在访问时,注意将name和age参数一起发送给服务器:

控制台输出结果为:

4.3 日期类型参数绑定

1、在ParamController类中添加param3方法,代码实现如下:

package com.tedu.controller;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller /* 这个注解表示当前类是属于控制层 */
public class ParamController {
	/* 测试:接收日期类型的参数 */
	@RequestMapping("param3")
	public String param3(Date date){
		System.out.println("date="+date.toLocaleString());
		return "home";
	}
	
	@RequestMapping("param2")
	public String param2(User user){
		System.out.println("user="+user);
		return "home";
	}
	
	@RequestMapping("param1")
	public String param1(String name, Integer age){
		System.out.println("name="+name);
		System.out.println("age="+age);
		return "home";
	}
}

2、访问ParamController中的param3方法,在访问时,注意将date参数一起发送给服务器:


控制台输出结果为:


常见问题:

1、当访问ParamController中的param3方法,如果传递给服务器的日期数据是如下格式:

从图中可以看出,如果日期参数是 yyyy-MM-dd 格式就会出现400错误,其实是因为参数格式匹配错误,由于springmvc默认的日期格式是yyyy/MM/dd,因此如果日期参数不是 yyyy/MM/dd 格式,就会出现400错误!!
2、解决方案:
在springmvc中,提供了@InitBinder注解,用于指定自定义的日期转换格式,因此,我们只需要在Controller类中添加下面的代码即可,在接受日期类型的参数时,会自动按照自定义的日期格式进行转换。

public class ParamController {
	
	@RequestMapping("param3")
	public String param3(Date date){
		System.out.println("date="+date.toLocaleString());
		return "home";
	}
	
	/* 自定义日期转换格式 */
	@InitBinder
	public void InitBinder (ServletRequestDataBinder binder){
		binder.registerCustomEditor(java.util.Date.class, 
			new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)
		);
	}
	...
	...
}

3、再次测试:

控制台输出结果为: