Spring MVC的Controller接收请求参数的方式有多种,本节主要介绍Spring MVC下的HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON参数传递方式,同时解决POST请求中文乱码问题。
1. HttpServletRequest参数传递
"/param") (publicclassParamController { /*** 通过HttpServletRequest接收参数*/"/servlet") (publicvoidservlet(HttpServletRequestrequest, HttpServletResponseresponse) throwsIOException { Stringname=request.getParameter("name"); System.out.println("name="+name); PrintWriterwriter=response.getWriter(); writer.print("hello "+name); writer.flush(); writer.close(); } }
2. 基本数据类型参数传递
基本数据类型以及他们的包装类。
"/param") (publicclassParamController { /*** 使用基本数据类型和String类型*/"/simple") (publicStringsimple(intid, Stringname) throwsIOException { Stringstr="id = "+id+",name = "+name; System.out.println(str); returnstr; } }
3. Java Bean参数传递
"/param") (publicclassParamController { /*** JavaBean传递参数*/value="/bean", (produces="text/plain;charset=UTF-8", method=RequestMethod.POST) publicStringparamBean(Studentstudent){ System.out.println(student); returnstudent.toString(); } }
4. 数组参数传递
"/param") (publicclassParamController { /*** 数组参数*/value="/array",method=RequestMethod.POST) (publicStringarray(String[] hobbies){ for(Stringhobby : hobbies){ System.out.println(hobby); } return"success"; } }
5. List参数传递
"/param") (publicclassParamController { /*** List参数*/value="/list",method=RequestMethod.POST) (publicStringlist(List<String>hobbyList){ hobbyList.forEach(hobby->System.out.println(hobby)); return"success"; } }
6. Map参数传递
"/param") (publicclassParamController { /*** Map参数*/value="/map",method=RequestMethod.POST) (publicStringmap(Map<String,Object>map){ System.out.println(map); return"success"; } }
7. JSON参数传递
JSON格式采用键值对的方式来表示数据,由花括号 {} 包含对象,由方括号 [] 包含数组,可通过JSON在线解析工具进行校验/格式化,具体格式如下:
- 对象
对象是一个无序的键/值对集合,每个键后面需要添加一个冒号(:),键/值对之间使用逗号(,)分隔。
{ "id": "1", "name": "zhangsan", "age":20 }
- 数组
数组可以包含多个元素,每个元素之间使用逗号(,)分隔,可以包含简单值、对象或者其他数组。
[ { "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。
"/json") (publicclassJsonController { /*** json bean*/value="/bean",method=RequestMethod.POST) (publicObjectbean(Studentstudent){ System.out.println(student); Map<String,Object>map=newHashMap<String,Object>(); map.put("code",200); map.put("msg","success"); map.put("data",student.toString()); returnmap; } /*** json map*/value="/map",method=RequestMethod.POST) (publicObjectmap(Map<String,Object>jsonMap){ System.out.println(jsonMap); Map<String,Object>map=newHashMap<String,Object>(); map.put("code",200); map.put("msg","success"); map.put("data",jsonMap); returnmap; } /*** json list*/"/list") (publicObjectlist(List<Student>studentList){ System.out.println(studentList); Map<String,Object>map=newHashMap<String,Object>(); map.put("code",200); map.put("msg","success"); map.put("data",studentList); returnmap; } }
8. Spring MVC解决POST请求中文乱码问题
Spring提供了CharacterEncodingFilter解决POST请求中的中文乱码问题,在web.xml中配置CharacterEncodingFilter。
<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参数传递案例