SpringMVC的请求参数传递

1,简单参数类型

单个参数

发送:

 http://localhost/commonParam?name=itcast

接收:

@Controller
public class UserController {
	@RequestMapping("/commonParam")
	@ResponseBody
	public String commonParam(String name){
		System.out.println("普通参数传递 name ==> "+name);
		return "{'module':'commonParam'}";
	}
}

多个参数

http://localhost/commonParam?name=itcast&age=15
@Controller
public class UserController {
	@RequestMapping("/commonParam")
	@ResponseBody
	public String commonParam(String name,int age){
		System.out.println("普通参数传递 name ==> "+name);
		System.out.println("普通参数传递 age ==> "+age);
		return "{'module':'commonParam'}";
	}
}

如果GET请求中文乱码
修改pom.xml来解决GET请求中文乱码问题

<build>
	<plugins>
		<plugin>
		<groupId>org.apache.tomcat.mavengroupId>
		<artifactId>tomcat7-maven-pluginartifactId>
		<version>2.1version>
		<configuration>
			<port>80port>
			<path>/path> 
			<uriEncoding>UTF-8uriEncoding>
		configuration>
		plugin>
	plugins>
build>

如果POST请求中文乱码
解决方案:配置过滤器

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
	protected Class<?>[] getRootConfigClasses() {
		return new Class[0];
	}
	protected Class<?>[] getServletConfigClasses() {
		return new Class[]{SpringMvcConfig.class};
	}
	protected String[] getServletMappings() {
		return new String[]{"/"};
	}
	//乱码处理
	@Override
	protected Filter[] getServletFilters() {
		CharacterEncodingFilter filter = new CharacterEncodingFilter();
		filter.setEncoding("UTF-8");
		return new Filter[]{filter};
	}
}

注意:CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。
如果形参与地址参数名不一致
解决方案:使用@RequestParam注解

发送:

http://localhost/commonParamDifferentName?name=张三&age=18

接收:

@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName , int age){
	System.out.println("普通参数传递 userName ==> "+userName);
	System.out.println("普通参数传递 age ==> "+age);
	return "{'module':'common param different name'}";
}

注意:写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能

2,POJO数据类型

简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候我们可以考虑使用POJO数据类型。

  • POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数

此时需要使用前面准备好的POJO类,先来看下User

public class User {
	private String name;
	private int age;
	//setter...getter...略
}

发送:

http://localhost/pojoParam?name=itcast&age=15

接收:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
	System.out.println("pojo参数传递 user ==> "+user);
	return "{'module':'pojo param'}";
}

注意:

  • POJO参数接收,前端GET和POST发送请求数据的方式不变。
  • 请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

3,嵌套POJO类型参数

如果POJO对象中嵌套了其他的POJO类,如:

public class Address {
	private String province;
	private String city;
	//setter...getter...略
}
public class User {
	private String name;
	private int age;
	private Address address;
	//setter...getter...略
}

嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

发送:

http://localhost/pojoParam?name=itcast&age=15&address.city=beijing&address.province=beijing

接收:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
	System.out.println("pojo参数传递 user ==> "+user);
	return "{'module':'pojo param'}";
}

注意:请求参数key的名称要和POJO中属性的名称一致,否则无法封装

4,数组类型参数

数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数

发送:

http://localhost/arrayParam?likes=game&likes=music&likes=travel

接收:

//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
	System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
	return "{'module':'array param'}";
}

5,集合类型参数

数组能接收多个值,那么集合是否也可以实现这个功能呢?

发送:

http://localhost/listParam?likes=game&likes=music&likes=travel

接收:

//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
	System.out.println("集合参数传递 likes ==> "+ likes);
	return "{'module':'list param'}";
}

不添加@RequestParam注解的话,SpringMVC会将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以会报错。
SpringMVC的请求参数传递_第1张图片

6,json数据参数

SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖

<dependency>
	<groupId>com.fasterxml.jackson.coregroupId>
	<artifactId>jackson-databindartifactId>
	<version>2.9.0version>
dependency>

在SpringMVC的配置类中开启SpringMVC的注解支持,这里面就包含了将JSON转换成对象的功能。

@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}

JSON普通数组

["game","music","travel"]
//使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
	System.out.println("list common(json)参数传递 list ==> "+likes);
	return "{'module':'list common for json param'}";
}

JSON对象数据

{
	"name":"itcast",
	"age":15
}
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
	System.out.println("pojo(json)参数传递 user ==> "+user);
	return "{'module':'pojo for json param'}";
}

JSON对象数组

[
	{"name":"itcast","age":15},
	{"name":"itheima","age":12}
]
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
	System.out.println("list pojo(json)参数传递 list ==> "+list);
	return "{'module':'list pojo for json param'}";
}

SpringMVC的请求参数传递_第2张图片
@RequestBody与@RequestParam区别
@RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
@RequestBody用于接收json数据【application/json】
后期开发中,发送json格式数据为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数

7,日期类型参数

发送:

http://localhost/dataParam?date=2088/08/08

接收:

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date)
	System.out.println("参数传递 date ==> "+date);
	return "{'module':'data param'}";
}

如果想要换一种格式发送:

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08

SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd ,如果传递的不符合其默认格式(如yyyy-MM-dd),SpringMVC就无法进行格式转换,所以报错。
解决方案也比较简单,需要使用@DateTimeFormat

接收:

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date, @DateTimeFormat(pattern="yyyy-MM-dd") Date date1)
	System.out.println("参数传递 date ==> "+date);
	System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
	return "{'module':'data param'}";
}

如果想要详细到时间怎么办呢?

发送:

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08&date2=2088/08/08 8:08:08

接收:

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date, @DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date
date2)
	System.out.println("参数传递 date ==> "+date);
	System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
	System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
	return "{'module':'data param'}";
}

SpringMVC的请求参数传递_第3张图片

你可能感兴趣的:(spring学习笔记,java,spring,servlet)