能够知道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注解==