目录
1.1导入spring-webmvc和java.servlet-api坐标
1.2编写springMVC配置类,初始化springMVC环境(等同于spring配置类)
1.3创建SpringMVC控制器类(等同于Servlet功能)
1.4编写初始化servlet容器配置类,加载SpringMVC配置类,设置springMVC请求拦截路径
二、spring中的bean和spirngMVC中的bean分离管理
3.1.在controller类上面添加一个模块的请求访问路径前缀,便于区分管理不同的controller
一、入门案例
1.1导入spring-webmvc和java.servlet-api坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--导入springmvc坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
1.2编写springMVC配置类,初始化springMVC环境(等同于spring配置类)
1.添加@Configuration注解表名该类是springMVC配置类
@Configuration //相当于spring配置类
2.扫描所有的bean
@ComponentScan("com.xiaoyu") //扫描要管理的bean
配置类
package com.xiaoyu.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //相当于spring配置类
@ComponentScan("com.xiaoyu") //扫描要管理的bean
public class SpringMVCConfig {
}
1.3创建SpringMVC控制器类(等同于Servlet功能)
1.添加注解把该类的对象给ioc容器管理
@Controller
2.添加注解编写映射路径(等同于WebServlet注解)
@RequestMapping("/save") //注解映射路径
3.添加注解表示该方法的返回值为响应的数据
@ResponseBody
控制器类
package com.xiaoyu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@RequestMapping("/save") //注解映射路径
@ResponseBody
public String save(){
System.out.println("hello springMVC!");
return "{'username':'xiaoyu'}";
}
}
1.4编写初始化servlet容器配置类,加载SpringMVC配置类,设置springMVC请求拦截路径
1.继承AbstractDispatcherServletInitializer
extends AbstractDispatcherServletInitializer
2.重写方法
createServletAppLocationContext方法
创建AnnotationConfigWebAppLicationContext对象----》
//3.获取AnnotationConfigWebApplication对象
AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();
加载SpringMVC配置类---》
//4.加载SpringMVC配置类
annotationConfigWebApplicationContext.register(SpringMVCConfig.class);
返回AnnotationConfigWebAppLocationContext对象---》
//5.返回annotationConfigWebApplicationContext
return annotationConfigWebApplicationContext;
getServletMappings方法
设置springMVC请求拦截路径(任意请求都将转到SpringMVC管理)---》
//6.设置SpringMVC请求拦截的路径
return new String[]{"/"};
二、spring中的bean和spirngMVC中的bean分离管理
2.1方式一:直接排除sprinMVC扫描的bean
//Spring配置文件扫描除了SpringMVC管理以外的bean
@ComponentScan(value = "com.itheima",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
2.2方式二:精准扫描springMVC以外的bean
@ComponentScan("com.itheima.service")
2.3Controller加载控制和业务bean加载控制
原始方式继承AbstractConfigDispatcherServletInitializer实现方法
package com.itheima.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//1.继承抽象类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
//2.加载容器
AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext=new AnnotationConfigWebApplicationContext();
//3.注册springMVC配置文件(加载springMVC配置文件)
annotationConfigWebApplicationContext.register(SpringMvcConfig.class);
//4.返回容器对象
return annotationConfigWebApplicationContext;
}
protected String[] getServletMappings() {
//5.设置springMVC请求拦截路径(请求交给springMVC管理)
return new String[] {"/"};
}
protected WebApplicationContext createRootApplicationContext() {
//6.加载容器
AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext=new AnnotationConfigWebApplicationContext();
//7.注册springMVC配置文件(加载spring配置文件)
annotationConfigWebApplicationContext.register(SpringConfig.class);
//4.返回容器对象
return annotationConfigWebApplicationContext;
}
}
简化方式
package com.itheima.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
//1.继承抽象类
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
三、数据请求
3.1.在controller类上面添加一个模块的请求访问路径前缀,便于区分管理不同的controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")
public class UserController {
3.2post请秋中文乱码问题
在servlet初始化容器里面重写getServletFilter()方法
//1.重写方法设置响应数据格式
@Override
protected Filter[] getServletFilters() {
//2.创建设置响应数据格式的对象
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
//3.设置请求字符为utf-8
characterEncodingFilter.setEncoding("UTF-8");
//4.返回对象
return new Filter[]{characterEncodingFilter};
}
3.3请求数据传递
1.普通参数
直接用controller类里面的方法用形参接收,形参名和请求数据的键的名称一致。
@RequestMapping(value = "/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("name:"+name);
System.out.println("age:"+age);
return "{'module':'commonParam'}";
}
2.普通参数但controller类里面的方法的形参和请求数据的键的名称不一致
在形参前加@RequestParam注解绑定
@RequestMapping("/commonParamDifferenceName")
@ResponseBody
public String commonParamDifferenceName(@RequestParam("name") String username,int age){
System.out.println("username:"+username);
System.out.println("age:"+age);
return "{'module':'commonParamDifferenceName'}";
}
3.实体类类型参数
如果实体类里没有引用类型成员变量,请求数据的键的名称和实体类的成员变量名称一致即可。
如果有引用类型,请求数据的键的名称为(引用类型对象.引用类型成员变量)即可。
/*
实体类参数
*/
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("user:"+user);
return "{'module':'pojoParam'}";
}
4.数组参数
请求数据的键的名称和形参数组的名称一致即可
/*
数组参数
*/
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("likes"+ Arrays.toString(likes));
return "{'module':'arrayParam'}";
}
5.集合参数
请求数据的键的名称和集合的名称一致即可。
/*
集合参数
*/
@RequestMapping("/collectionParam")
@ResponseBody
public String collectionParam(@RequestParam List<String> likes){
System.out.println("likes"+likes);
return "{'module':'collectionParam'}";
}
6.json数据传递参数
导入坐标---》
<!--json数据坐标-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
在springMVC配置类里添加注解,开启json数据格式的自动转换---》
@EnableWebMvc
编写访问方法
1)集合参数(简单类型),json格式
/*
集合参数:json格式
*/
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println("likes"+likes);
return "{'module': commonJsonParam}";
}
请求的数据
["gym","pingpong","basketball"]
2)pojo参数(json格式)
/*
pojo参数:json格式
*/
@RequestMapping("pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println("user:"+user);
return "{'module':'pojoParamForJson'}";
}
请求的json数据
{
"name":"xiaoyu",
"age":18,
"address":{
"province":"guangdong",
"city":"zhaoqing"
}
}
3)集合参数(引用类型),json格式
/*
集合参数(引用类型):json格式
*/
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> userList){
System.out.println("listPojoParamForJson"+userList);
return "{'module':'listPojoParamForJson'}";
}
请求的数据
[
{
"name":"xiaoyu",
"age":18
},
{
"name":"xiaoyu",
"age":18
}
]
7.日期型参数传递
/*
日期型数据
*/
@RequestMapping("dataParam")
@ResponseBody
public String dataParam(Date date1,@DateTimeFormat(pattern = "yyyy-mm-dd") Date date2){
System.out.println("yyyy/MM/dd:"+date1);
System.out.println("yyyy-MM-dd HH:mm:ss"+date2);
return "{'module':'dataParam'}";
}
四、响应数据
1.页面跳转
去掉@ResponseBody注解,否则会直接响应成字符串
//响应页面/跳转页面
//返回值为String类型,设置返回值为页面名称,即可实现页面跳转
@RequestMapping("/toJumpPage")
public String toJumpPage(){
System.out.println("跳转页面");
return "page.jsp";
}
2.响应文本
controller方法返回类型改为String,添加@ResponseBody注解
//响应文本数据
//返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
@RequestMapping("/responseText")
@ResponseBody
public String responseText(){
System.out.println("返回纯文本数据");
return "response text";
}
3.响应pojo对象
controller里的方法返回类型改为pojo实体类---》
public User responseJsonPOJO(){
添加@ResponseBody注解---》
@ResponseBody
返回pojo对象
User user = new User();
user.setName("itcast");
user.setAge(15);
return user;
3.响应pojo集合对象
//响应POJO集合对象
//返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
@RequestMapping("/toJsonList")
@ResponseBody
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;
}
五、rest风格
设置当前请求方法----》
method = RequestMethod.GET
访问映射路径改为统一名称,需要数据在后面添加(/{参数名称})---》
value = "/users/{id}"
5.1入门案例
1添加操作(post请求)
//设置当前请求方法为POST,表示REST风格中的添加操作
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'user save'}";
}
2根据id删除操作(delete请求)
地址栏设置数据传递给形参---》
value = "/users/{id}"
设置请求方式为delete---》
method = RequestMethod.DELETE
提示形参在访问路径接收参数---》
public String delete(@PathVariable Integer id)
//设置当前请求方法为DELETE,表示REST风格中的删除操作
//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
@RequestMapping( value = "/users/{id}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
System.out.println("user delete..." + id);
return "{'module':'user delete'}";
}
3根据id修改操作(put请求)
地址栏设置数据给形参,并且请求方式改为put---》
@RequestMapping(value = "/users/{id}",method = RequestMethod.PUT)
注解形参数据在url中获取
public String update(@PathVariable Integer id,@RequestBody User user)
//设置当前请求方法为PUT,表示REST风格中的修改操作
@RequestMapping(value = "/users/{id}",method = RequestMethod.PUT)
@ResponseBody
public String update(@PathVariable Integer id,@RequestBody User user){
System.out.println("user update..."+user+id);
return "{'module':'user update'}";
}
4查询所有操作(get请求方式)
//设置当前请求方法为GET,表示REST风格中的查询操作
@RequestMapping(value = "/users",method = RequestMethod.GET)
@ResponseBody
public String selectAll(){
System.out.println("user selectAll...");
return "{'module':'user selectAll'}";
}
5根据id查询(get请求方式)
//设置当前请求方法为GET,表示REST风格中的查询操作
//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)
@ResponseBody
public String selectById(@PathVariable Integer id){
System.out.println("user selectById..."+id);
return "{'module':'user selectById'}";
}
5.2简化开发
1.@ResponseBody提取到controller类上面统一书写(每个方法的返回值都作为响应体)
2.@Controller注解和@ReoponseBody注解合并到同一个注解()@RestController
@RestController //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
3.利用访问路径前缀的方法简化书写
@RequestMapping("/books")
4.在方法前的@RequestMapping注解改成@请求方式Mapping注解简化开发,可携带需要的路径访问变量。
@DeleteMapping("/{id}") //使用@DeleteMapping简化DELETE请求方法对应的映射配置
5.3设置静态资源访问过滤
编写SpringMvcSupport配置类---》
package com.xiaoyu.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
继承WebMvcConfiguration---》
extends WebMvcConfigurationSupport
重写addResourcesHandlers方法---》
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
当访问/xxx/**时,从/xxx查找内容---》
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
在springMvc配置类中扫描该配置类---》
@ComponentScan({"com.itheima.controller","com.itheima.config"})