Spring MVC的Controller接收请求参数的方式有多种,本节主要介绍Spring MVC下的HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON参数传递方式,同时解决POST请求中文乱码问题。
1. HttpServletRequest参数传递
java
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 通过HttpServletRequest接收参数
*/
@RequestMapping("/servlet")
public void servlet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String name = request.getParameter("name");
System.out.println("name=" + name);
PrintWriter writer = response.getWriter();
writer.print("hello " + name);
writer.flush();
writer.close();
}
}
2. 基本数据类型参数传递
基本数据类型以及他们的包装类。
java
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 使用基本数据类型和String类型
*/
@RequestMapping("/simple")
@ResponseBody
public String simple(int id, String name) throws IOException {
String str = "id = " + id + ",name = " + name;
System.out.println(str);
return str;
}
}
3. Java Bean参数传递
java
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* JavaBean传递参数
*/
@RequestMapping(value = "/bean",
produces = "text/plain;charset=UTF-8",
method = RequestMethod.POST)
@ResponseBody
public String paramBean(Student student){
System.out.println(student);
return student.toString();
}
}
4. 数组参数传递
java
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 数组参数
*/
@RequestMapping(value = "/array",method = RequestMethod.POST)
@ResponseBody
public String array(String[] hobbies){
for(String hobby : hobbies){
System.out.println(hobby);
}
return "success";
}
}
5. List参数传递
java
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* List参数
*/
@RequestMapping(value = "/list",method = RequestMethod.POST)
@ResponseBody
public String list(@RequestParam List<String> hobbyList){
hobbyList.forEach(hobby -> System.out.println(hobby));
return "success";
}
}
6. Map参数传递
java
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* Map参数
*/
@RequestMapping(value = "/map",method = RequestMethod.POST)
@ResponseBody
public String map(@RequestParam Map<String,Object> map){
System.out.println(map);
return "success";
}
}
7. JSON参数传递
JSON格式采用键值对的方式来表示数据,由花括号 {} 包含对象,由方括号 [] 包含数组,可通过JSON在线解析工具进行校验/格式化,具体格式如下:
- 对象
对象是一个无序的键/值对集合,每个键后面需要添加一个冒号(:),键/值对之间使用逗号(,)分隔。
java
{
"id": "1",
"name": "zhangsan",
"age":20
}
- 数组
数组可以包含多个元素,每个元素之间使用逗号(,)分隔,可以包含简单值、对象或者其他数组。
java
[
{
"id": "1",
"name": "zhangsan"
},
{
"id": "2",
"name": "zhangsan"
}
]
Spring MVC可以使用Jackson框架作为JSON的转换器。
通过@RequestBody可以将前端的JSON参数转成Java Bean、Map、List等引用类型。
通过@ResponseBody可以将后端的Java Bean、Map、List等引用类型转成JSON结果输出。
使用Jackson时需要三个jar包jackson-databind.jar、jackson-core.jar、jackson-annotations.jar。如果Spring MVC创建的是Maven项目,仅需要依赖jackson-databind,因为它传递依赖了jackson-core和jackson-annotations。
java
@Controller
@RequestMapping("/json")
public class JsonController {
/**
* json bean
*/
@RequestMapping(value = "/bean",method = RequestMethod.POST)
@ResponseBody
public Object bean(@RequestBody Student student){
System.out.println(student);
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",200);
map.put("msg","success");
map.put("data",student.toString());
return map;
}
/**
* json map
*/
@RequestMapping(value = "/map",method = RequestMethod.POST)
@ResponseBody
public Object map(@RequestBody Map<String,Object> jsonMap){
System.out.println(jsonMap);
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",200);
map.put("msg","success");
map.put("data",jsonMap);
return map;
}
/**
* json list
*/
@RequestMapping("/list")
@ResponseBody
public Object list(@RequestBody List<Student> studentList){
System.out.println(studentList);
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",200);
map.put("msg","success");
map.put("data",studentList);
return map;
}
}
8. Spring MVC解决POST请求中文乱码问题
Spring提供了CharacterEncodingFilter解决POST请求中的中文乱码问题,在web.xml中配置CharacterEncodingFilter。
XML
<web-app>
<!--解决POST中文乱码问题 过滤器-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
9. Spring MVC参数传递案例
基于Spring MVC实现HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON方式的参数传递。
案例实现详见链接:案例13 Spring MVC参数传递案例