能够知道SpringMVC的优点
能够编写SpringMVC入门案例
能够使用PostMan发送请求
能够掌握普通类型参数传递
能够掌握POJO类型参数传递
能够掌握json数据参数传递
能够掌握响应json数据
能够掌握rest风格快速开发
能够完成基于restful页面数据交互案例
@RequestMapping注解注解可以写在哪?有什么作用?
xxxxxxxxxx
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径("/user")public class UserController { //请求路径映射 ("/save") //此时save方法的访问路径是:/user/save public String save(){ System.out.println("user save ..."); return "{'module':'user save'}"; }}
如何解决POST请求中文乱码问题?

xxxxxxxxxx
//普通参数:请求参数与形参名称对应即可完成参数传递("/commonParam")public String commonParam(String name ,int age){ System.out.println("普通参数传递 name ==> "+name); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param'}";}
xxxxxxxxxx
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port><!--tomcat端口号--> <path>/</path> <!--虚拟目录--> <uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集--> </configuration> </plugin> </plugins> </build>

xxxxxxxxxx
//普通参数:请求参数与形参名称对应即可完成参数传递("/commonParam")public String commonParam(String name ,int age){ System.out.println("普通参数传递 name ==> "+name); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param'}";}
问题:我们发现,POST请求传递的参数如果包含中文那么就会出现中文乱码问题,说明我们之前配置的tomcat插件uri路径编解码字符集无法解决POST请求中文乱码问题。那么如何解决呢?
在加载SpringMVC配置的配置类中指定字符过滤器。
xxxxxxxxxx
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[]{"/"}; } //乱码处理 protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; }}
当请求参数名与形参变量名不同,该如何接收请求参数?

xxxxxxxxxx
//普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系("/commonParamDifferentName")public String commonParamDifferentName(("name") String userName , int age){ System.out.println("普通参数传递 userName ==> "+userName); System.out.println("普通参数传递 age ==> "+age); return "{'module':'common param different name'}";}
名称:@RequestParam
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:绑定请求参数与处理器方法形参间的关系
参数:

xxxxxxxxxx
public class User { private String name; private int age; //同学们自己添加getter/setter/toString()方法}
xxxxxxxxxx
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递("/pojoParam")public String pojoParam(User user){ System.out.println("pojo参数传递 user ==> "+user); return "{'module':'pojo param'}";}
==注意事项:请求参数key的名称要和POJO中属性的名称一致,否则无法封装。==
xxxxxxxxxx
public class User { private String name; private int age; private Address address; //同学们自己添加getter/setter/toString()方法}public class Address { private String province; private String city; private Address address;}

xxxxxxxxxx
//嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递("/pojoContainPojoParam")public String pojoContainPojoParam(User user){ System.out.println("pojo嵌套pojo参数传递 user ==> "+user); return "{'module':'pojo contain pojo param'}";}
==注意事项:请求参数key的名称要和POJO中属性的名称一致,否则无法封装。==

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

xxxxxxxxxx
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据("/listParam")public String listParam( List<String> likes){ System.out.println("集合参数传递 likes ==> "+ likes); return "{'module':'list param'}";}
问题:@EnableWebMvc注解和@ResponseBody注解有什么用?
xxxxxxxxxx
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version></dependency>

xxxxxxxxxx
("com.itheima.controller")//开启json数据类型自动转换public class SpringMvcConfig {}
注意事项:
@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换
xxxxxxxxxx
//集合参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据("/listParamForJson")public String listParamForJson( List<String> likes){ System.out.println("list common(json)参数传递 list ==> "+likes); return "{'module':'list common for json param'}";}
xxxxxxxxxx
("com.itheima.controller")public class SpringMvcConfig {}
xxxxxxxxxx
("/listParamForJson")public String listParamForJson( List<String> likes){ System.out.println("list common(json)参数传递 list ==> "+likes); return "{'module':'list common for json param'}";}

xxxxxxxxxx
//POJO参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应("/pojoParamForJson")public String pojoParamForJson( User user){ System.out.println("pojo(json)参数传递 user ==> "+user); return "{'module':'pojo for json param'}";}

xxxxxxxxxx
//集合参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应("/listPojoParamForJson")public String listPojoParamForJson( List<User> list){ System.out.println("list pojo(json)参数传递 list ==> "+list); return "{'module':'list pojo for json param'}";}
@DateTimeFormat注解的作用是什么?

xxxxxxxxxx
//日期参数 http://localhost:80/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd("/dataParam")public String dataParam(Date date, (pattern="yyyy-MM-dd") Date date1, (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'}";}
xxxxxxxxxx
public interface Converter<S, T> { T convert(S var1);}
传递日期类型参数必须在配置类上使用@EnableWebMvc注解。其功能之一:根据类型匹配对应的类型转换器。
如何响应json数据?
xxxxxxxxxx
public class UserController { //响应页面/跳转页面 //返回值为String类型,设置返回值为页面名称,即可实现页面跳转 ("/toJumpPage") public String toJumpPage(){ System.out.println("跳转页面"); return "page.jsp"; }}
xxxxxxxxxx
<% page contentType="text/html;charset=UTF-8" language="java" %><html> <head> <title>Title</title> </head> <body> <h2>Hello Spring MVC!</h2> </body></html>
xxxxxxxxxx
//响应文本数据//返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解("/toText")public String toText(){ System.out.println("返回纯文本数据"); return "response text";}
xxxxxxxxxx
//响应POJO对象//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解("/toJsonPOJO")public User toJsonPOJO(){ System.out.println("返回json对象数据"); User user = new User(); user.setName("itcast"); user.setAge(15); return user;}
xxxxxxxxxx
//响应POJO集合对象//返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解("/toJsonList")public List<User> toJsonList(){ System.out.println("返回json集合数据"); User user1 = new User(); user1.setName("传智播客"); user1.setAge(15); User user2 = new User(); user2.setName("黑马程序员"); user2.setAge(12); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); return userList;}
==注意:需要添加jackson-databind依赖以及在SpringMvcConfig配置类上添加@EnableWebMvc注解==