文章目录
- 一、SpringMVC简介
- 1.1 概述
- 1.2 入门案例
- 1.3 bean的加载控制
- 1.4 PostMan插件
- 二、请求【页面向后台发送数据】
- 2.1 请求映射路径
- 2.2 请求方式
- 2.3 解决中文乱码
- 2.4 请求参数
- 2.4.1 五种常见参数种类
- 2.4.2 JSON数据
- 2.4.3 @RequestParam与@RequestBody的区别
- 2.4.4 日期类型
- 三、响应【后台向页面发送数据】
- 3.1 响应页面
- 3.2 响应数据
- 四、REST风格
- 4.1 概述
- 4.2 入门案例
- 4.3 @RequestParam、@RequestBody与@PathVariable的应用
- 4.4 简化开发【@RestController与@Get/Post/Put/DeleteMapping】
- 4.5 对静态资源路径放行
一、SpringMVC简介
1.1 概述
1.2 入门案例
- 导入springmvc和servlet坐标
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>springmvc_01_quickstart</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>springmvc_01_quickstart Maven Webapp</name><url>http://maven.apache.org</url><!-- 阿里镜像云 --><repositories><repository><id>alimaven</id><url>https://maven.aliyun.com/repository/public</url></repository></repositories><pluginRepositories><pluginRepository><id>alimaven</id><url>https://maven.aliyun.com/repository/public</url></pluginRepository></pluginRepositories><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- 1.导入servlet和springmvc坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies><build><finalName>springmvc_01_quickstart</finalName><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>6</source><target>6</target></configuration></plugin></plugins></build>
</project>
- 创建springmvc的控制器类(等同于servlet功能)
// 2 定义controller
// 2.1 使用@controller定义bean
@Controller
public class UserController {// 2.2 设置当前操作的访问路径@RequestMapping("/save")// 2.3 设置当前操作的返回值类型@ResponseBodypublic String save(){System.out.println("springmvc...");return "{'ss':'ss'}";}
}
- 初始化springmvc的环境,设置springmvc加载对应的bean
// 3. 创建SpringMVC的配置文件,加载controller的bean
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
- 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
// 4. 定义一个Servlet容器启动的配置类,并在里面加载springmvc的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {// 加载springmvc的配置protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext acwac = new AnnotationConfigWebApplicationContext();acwac.register(SpringMvcConfig.class);return acwac;}// 设置哪些请求归属springmvc处理protected String[] getServletMappings() {return new String[]{"/"};}// 加载spring的配置protected WebApplicationContext createRootApplicationContext() {return null;}
}
AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类,AbstractDispatcherServletInitializer提供三个接口方法供用户实现:
(1)createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
(2)createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围
(3)getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
(4)createServletApplicationContext用来加载SpringMVC环境
(5)createRootApplicationContext用来加载Spring环境
- 配置Tomcat环境
1.3 bean的加载控制
(1)要保证SpringMVC控制的是controller的bean,Spring控制其他bean(Service、Dao等),需要在Spring的配置类要扫描的bean中排除SpringMVC控制的bean
(2)这里演示方式一:
(3)在1.2中的Servlet容器配置类中只加载了SpringMVC的配置类【SpringMvcConfig,注意要去掉@Configuration】,这里还需要加载Spring的配置类【SpringConfig】
(4)为了简化开发,我们通常使用AbstractAnnotationConfigDispatcherServletInitializer类(AbstractDispatcherServletInitializer的子类)去简化书写
1.4 PostMan插件
二、请求【页面向后台发送数据】
2.1 请求映射路径
2.2 请求方式
2.3 解决中文乱码
在配置类中覆盖父类乱码处理方法protected Filter[] getServletFilters(){}
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}// 乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("UTF-8");return new Filter[]{characterEncodingFilter};}
}
2.4 请求参数
2.4.1 五种常见参数种类
- 普通参数
- POJO参数
- 嵌套POJO参数
- 数组类型参数
- 集合类型参数:一定要使用
@RequestParam
注意:请求参数名与形参名对应不上使用@RequestParam注解
2.4.2 JSON数据
- JSON数组
- JSON对象(POJO)
- JSON数组(POJO)
首先要在pom.xml中导入JSON坐标
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency>
其次,在springmvc的配置类中开启json转化成对象的功能,使用@EnableWebMvc注解
@ComponentScan("com.itheima.controller")
// 功能之一:开启json转化成对象的功能
@EnableWebMvc
public class SpringMvcConfig {
}
然后,设置发送json数据格式
,并且请求方法的形参前加上@RequestBody注解
//集合参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据// 发送json数据的格式["","",""]@RequestMapping("/listParamForJson")@ResponseBodypublic String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list ==> "+likes);return "{'module':'list common for json param'}";}//POJO参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应// 发送json数据的格式{ "":"","":""}@RequestMapping("/pojoParamForJson")@ResponseBodypublic String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user ==> "+user);return "{'module':'pojo for json param'}";}//集合参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应// 发送json数据的格式[ { "":"","":""},{ "":"","":""} ]@RequestMapping("/listPojoParamForJson")@ResponseBodypublic String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list ==> "+list);return "{'module':'list pojo for json param'}";}
2.4.3 @RequestParam与@RequestBody的区别
2.4.4 日期类型
三、响应【后台向页面发送数据】
3.1 响应页面
//响应页面/跳转页面//返回值为String类型,设置返回值为页面名称,即可实现页面跳转@RequestMapping("/toJumpPage")public String toJumpPage(){System.out.println("跳转页面");return "page.jsp";}
3.2 响应数据
响应页面不加@ResponseBody,但是响应数据必须加上@ResponseBody
数据类型分成:
- 文本数据
- POJO对象
- POJO对象集合
//响应文本数据//返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解@RequestMapping("/toText")@ResponseBodypublic String toText(){System.out.println("返回纯文本数据");return "response text";}//响应POJO对象//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解@RequestMapping("/toJsonPOJO")@ResponseBodypublic User toJsonPOJO(){System.out.println("返回json对象数据");User user = new User();user.setName("itcast");user.setAge(15);return user;}//响应POJO集合对象//返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解@RequestMapping("/toJsonList")@ResponseBodypublic 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;}
四、REST风格
4.1 概述
4.2 入门案例
4.3 @RequestParam、@RequestBody与@PathVariable的应用
4.4 简化开发【@RestController与@Get/Post/Put/DeleteMapping】
在4.3中每个函数前都要写@ResponseBody,可以把它提前到类前面,与@Controller合成@RestController
在4.3中每个函数前都写@RequestMapping(value = “”,method=RequestMethod.**),可以简化成以下注解
//@Controller
//@ResponseBody配置在类上可以简化配置,表示设置当前每个方法的返回值都作为响应体
//@ResponseBody
@RestController //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@RequestMapping("/books")
public class BookController {// @RequestMapping( method = RequestMethod.POST)@PostMapping //使用@PostMapping简化Post请求方法对应的映射配置public String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}// @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)@DeleteMapping("/{id}") //使用@DeleteMapping简化DELETE请求方法对应的映射配置public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}// @RequestMapping(method = RequestMethod.PUT)@PutMapping //使用@PutMapping简化Put请求方法对应的映射配置public String update(@RequestBody Book book){System.out.println("book update..."+book);return "{'module':'book update'}";}// @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)@GetMapping("/{id}") //使用@GetMapping简化GET请求方法对应的映射配置public String getById(@PathVariable Integer id){System.out.println("book getById..."+id);return "{'module':'book getById'}";}// @RequestMapping(method = RequestMethod.GET)@GetMapping //使用@GetMapping简化GET请求方法对应的映射配置public String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}
}
4.5 对静态资源路径放行
因为AbstractAnnotationConfigDispatcherServletInitializer类的getServletMappings()方法拦截所有为"/"的路径,之后交给SpringMVC处理,因此当需要访问静态资源时,需要放行【实现WebMvcConfigurationSupport类的addResourceHandlers方法】。
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//当访问路径为/pages/????时候,应该从/pages目录下查找内容registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");registry.addResourceHandler("/css/**").addResourceLocations("/css/");registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");}
}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[]{"/"};}//乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {
}