SpringMVC---请求与响应&&REST风格

目录

1.SpringMVC简介

1.1SpringMVC入门案例

1.1.1入门案例总结

1.1.2入门案例工作流程分析

1.2Controller加载控制与业务bean加载控制

1.2.1小结

2.请求与响应

2.1请求映射路径

2.2请求方式

2.2.1Get请求

2.2.2Post请求参数

2.3请求参数

2.3.1请求参数(传递json数据)

2.3.2@RequestBody与@RequestParam区别

2.3.3小结

2.3.4日期类型参数传递

2.3.5类型转换器(基于@EnableWebMvc)

2.4响应

3.REST风格

3.1REST简介

3.2入门案例

3.3RESTful快速开发

3.4案例:基于RESTful页面数据交互

3.4.1小结


1.SpringMVC简介

SpringMVC技术与Servlet技术功能等同,均属于web层开发技术。

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

优点:

使用简单,开发便捷(相比于Servlet)

灵活性强

1.1SpringMVC入门案例

①:使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标

  
    
      javax.servlet
      javax.servlet-api
      3.1.0
      provided
    
    
      org.springframework
      spring-webmvc
      5.2.10.RELEASE
    
  

②:创建SpringMVC控制器类(等同于Servlet功能)

//该注解将该类交给SpringMVC容器控制
@Controller
public class UserController {

    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

名称:@RequestMapping

类型:方法注解

位置:SpringMVC控制器方法定义上方

作用:设置当前控制器方法请求访问路径

相关属性

value(默认):请求访问路径

名称:@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法响应内容为当前返回值,无需解析

③:初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean

//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

④:初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求

//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类
AbstractDispatcherServletInitializer提供三个接口方法供用户实现

接口一:createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围

接口二:createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()

接口三:getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理

1.1.1入门案例总结

SpringMVC入门程序开发总结(1+N)
一次性工作
创建工程,设置服务器,加载工程
导入坐标
创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
多次工作
定义处理请求的控制器类
定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)

步骤总结:

导入坐标
开发控制器类
        @Controller
        @RequestMapping
        @ResponseBody

开发配置类
开发SpringMVC专用的servlet容器配置类
        createServletApplicationContext
        getServletMappings

1.1.2入门案例工作流程分析

启动服务器初始化过程:
1.服务器启动,执行ServletContainersInitConfig类,初始化web容器(提供通信支持,即服务器与客户端的通信,控制servlet生命周期,多线程支持)
2.执行createServletApplicationContext方法,创建了WebApplicationContext对象
3.加载SpringMvcConfig(类似于Spring的IOC容器,创建和管理bean)
4.执行@ComponentScan加载对应的bean(进项目扫描并加载)
5.加载UserController,每个@RequestMapping的名称对应一个具体的方法
6.执行getServletMappings方法,定义所有的请求都通过SpringMVC(对客户端的request进行拦截,判断是否通行,相当于过滤器)

单次请求过程
1.发送请求localhost/save
2.web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
3.解析请求路径/save
4.由/save匹配执行对应的方法save()
5.执行save()
6.检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方

SpringMVC---请求与响应&&REST风格_第1张图片

1.2Controller加载控制与业务bean加载控制

SpringMVC相关bean(表现层bean)

Spring控制的bean

        业务bean(Service)

        功能bean(DataSource等)

因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?

加载Spring控制的bean的时候排除掉SpringMVC控制的bean(别扫描到SpringMVC的bean)

SpringMVC相关bean加载控制

SpringMVC加载的bean对应的包均在com.itheima.controller包内

Spring相关bean加载控制

方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean

@Configuration
//设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean
//excludeFilters属性:设置扫描加载bean时,排除的过滤规则
//type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
//classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
@ComponentScan(value="com.itheima",
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = Controller.class
    )
)
public class SpringConfig {
}

@ComponentScan属性
excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)

方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等

方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

bean的加载格式

//web配置类简化开发,仅设置配置类类名即可
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[]{"/"};
    }
}
/*

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}

1.2.1小结

SpringMVC对应bean加载
Spring对应bean加载

2.请求与响应

2.1请求映射路径

名称:@RequestMapping
类型:方法注解  类注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

属性:value(默认):请求访问路径,或访问路径前缀

@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")
public class UserController {
    //请求路径映射
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    //请求路径映射
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }

}

2.2请求方式

2.2.1Get请求

普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

@RequestMapping("/commonParam")
@ResponseBodypublic String commonParam(String name ,int age){    
    System.out.println("普通参数传递 name ==> "+name);    
    System.out.println("普通参数传递 age ==> "+age);    
    return "{'module':'common param'}";
}

SpringMVC---请求与响应&&REST风格_第2张图片

2.2.2Post请求参数

普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){
    System.out.println("普通参数传递 name ==> "+name);
    System.out.println("普通参数传递 age ==> "+age);
    return "{'module':'common param'}";
}

SpringMVC---请求与响应&&REST风格_第3张图片

Post请求中文乱码处理

为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

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[]{"/"};
    }

    //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

2.3请求参数

参数种类:

普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数,请求参数名与形参变量名不同,使用@RequestParam绑定参数关系

名称:@RequestParam
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:绑定请求参数与处理器方法形参间的关系
参数:
required:是否为必传参数
defaultValue:参数默认值

    //普通参数:请求参数与形参名称对应即可完成参数传递
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println("普通参数传递 name ==> "+name);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'common param'}";
    }
    //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
    @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String userName , int age){
        System.out.println("普通参数传递 userName ==> "+userName);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'common param different name'}";
    }

SpringMVC---请求与响应&&REST风格_第4张图片

POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数(自动封装成user对象)

    //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojo参数传递 user ==> "+user);
        return "{'module':'pojo param'}";
    }

 SpringMVC---请求与响应&&REST风格_第5张图片

嵌套POJO参数:POJO对象中包含POJO对象(在发送请求的时候可以使用address.province完成对嵌套POJO的调用)

SpringMVC---请求与响应&&REST风格_第6张图片

 

    //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
        return "{'module':'pojo contain pojo param'}";
    }

 SpringMVC---请求与响应&&REST风格_第7张图片

数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数

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

SpringMVC---请求与响应&&REST风格_第8张图片

集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系(建议都使用该注解对参数进行绑定,否则SpringMVC会将参数封装为对象)

    //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List likes){
        System.out.println("集合参数传递 likes ==> "+ likes);
        return "{'module':'list param'}";
    }

 SpringMVC---请求与响应&&REST风格_第9张图片

2.3.1请求参数(传递json数据)

json数组
json对象(POJO)
json数组(POJO)

目标:接收请求中json的数据

JavaScript Object Notation => JavaScript对象表示法

json用于前后端,移动端和服务端的数据交互,即json是一种数据传输格式。

①:添加json数据转换相关坐标

    
      com.fasterxml.jackson.core
      jackson-databind
      2.9.0
    

②:设置发送json数据(请求body中添加json数据)

SpringMVC---请求与响应&&REST风格_第10张图片

③:开启自动转换json数据的支持

@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换

josn格式转java格式由@EnableWebMvc注解自动完成,我们只需接收json数据

④:设置接收json数据

名称:@RequestBody
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

    //集合参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List likes){
        System.out.println("list common(json)参数传递 list ==> "+likes);
        return "{'module':'list common for json param'}";
    }

POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数

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

SpringMVC---请求与响应&&REST风格_第11张图片

 

POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数

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

SpringMVC---请求与响应&&REST风格_第12张图片 

2.3.2@RequestBody与@RequestParam区别

区别
@RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
@RequestBody用于接收json数据【application/json】
应用
后期开发中,发送json格式数据为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数

2.3.3小结

1.json数据传递与接收(常用)接收json数据只需在接收非json格式的基础上加上以下两个注解
2.@EnableWebMvc
3.@RequestBody

2.3.4日期类型参数传递

日期类型数据基于系统不同格式也不尽相同
2088-08-18
2088/08/18
08/18/2088
接收形参时,根据不同的日期格式设置不同的接收方式

名称:@DateTimeFormat
类型:形参注解
位置:SpringMVC控制器方法形参前面
作用:设定日期时间型数据格式

属性:pattern:日期时间格式字符串

    //日期参数
    //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    @RequestMapping("/dataParam")
    @ResponseBody
    public String dataParam(Date date,
                            @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
                            @DateTimeFormat(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'}";
    }

消息发送:

http://localhost/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08

2.3.5类型转换器(基于@EnableWebMvc)

Converter接口,通过其实现类可以实现以下的功能:

请求参数年龄数据(String→Integer)
json数据转对象(json → POJO)
日期格式转换(String → Date)

public interface Converter {
    @Nullable
    T convert(S var1);
}

2.4响应

响应页面

@RequestMapping("/toPage")
    public String toPage(){
    return "page.jsp";
}

响应文本数据

@RequestMapping("/toText")
@ResponseBody
public String toText(){
    return "response text";
}

响应json数据(对象转json)

@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
    User user = new User();
    user.setName("赵云");
    user.setAge(41);
    return user;
}

响应json数据(对象集合转json数组)

@RequestMapping("/toJsonList")
@ResponseBody
public List toJsonList(){
    User user1 = new User();
    user1.setName("赵云");
    user1.setAge(41);
    User user2 = new User();
    user2.setName("master 赵云");
    user2.setAge(40);
    List userList = new ArrayList();
    userList.add(user1);
    userList.add(user2);
    return userList;
}

名称:@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器返回值作为响应体

@RequestMapping("/save")
@ResponseBodypublic String save(){
    System.out.println("save...");
    return "{'info':'springmvc'}";
}

java类型转json类型并且将数据输出到客户端的接口:

HttpMessageConverter接口

public interface HttpMessageConverter {
   boolean canRead(Class clazz, @Nullable MediaType mediaType);
   boolean canWrite(Class clazz, @Nullable MediaType mediaType);
   List getSupportedMediaTypes();
   T read(Class clazz, HttpInputMessage inputMessage)
         throws IOException, HttpMessageNotReadableException;
   void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
         throws IOException, HttpMessageNotWritableException;
}

3.REST风格

3.1REST简介

REST(Representational State Transfer),表现形式状态转换
传统风格资源描述形式
    http://localhost/user/getById?id=1
    http://localhost/user/saveUser
REST风格描述形式
    http://localhost/user/1
    http://localhost/user
优点:
隐藏资源的访问行为,无法通过地址得知对资源是何种操作
书写简化

按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
http://localhost/users        查询全部用户信息    GET(查询)
http://localhost/users/1        查询指定用户信息        GET(查询)
http://localhost/users        添加用户信息        POST(新增/保持)
http://localhost/users        修改用户信息        PUT(修改/更新)
http://localhost/users/1        删除用户信息
        DLETE(删除)
根据REST风格对资源进行访问称为RESTful

上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts……

3.2入门案例

名称:@RequestMapping
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径

属性:
value(默认):请求访问路径
method:http请求动作,标准动作(GET/POST/PUT/DELETE)

名称:@PathVariable
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

①:设定http请求动作(动词)

@RequestMapping(value = "/users", method = RequestMethod.POST)
@ResponseBody
public String save(@RequestBody User user){
    System.out.println("user save..." + user);
    return "{'module':'user save'}";
}

@RequestMapping(value = "/users" ,method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
    System.out.println("user update..."+user);
    return "{'module':'user update'}";
}

②:设定请求参数(路径变量)

@RequestMapping(value = "/users/{id}" ,method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
    System.out.println("user delete..." + id);
    return "{'module':'user delete'}";
}

@RequestBody  @RequestParam  @PathVariable

区别
@RequestParam用于接收url地址传参或表单传参
@RequestBody用于接收json数据
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数
应用
后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

3.3RESTful快速开发

在控制类的每一个方法上,都有@ResponseBody注解,并且在@RequestMapping的属性中值value固定,我们可以将@ResponseBody移至类上,将@RequestMapping(value = "/books")也移至类上。

@RequestMapping(value = "/books", method = RequestMethod.POST)
@ResponseBody
public String save(@RequestBody Book book){
    System.out.println("book save..." + book);
    return "{'module':'book save'}";
}
@RequestMapping(value = "/books" ,method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody Book book){
    System.out.println("book update..."+book);
    return "{'module':'book update'}";
}

那么我们在控制类上便有以下注解:

@Controller
@ResponseBody
@RequestMapping("/books")
public class BookController {
}

可以将@Controller与@ResponseBody进行组合,得到@RestController

名称:@RestController
类型:类注解
位置:基于SpringMVC的RESTful开发控制器类定义上方
作用:设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能

最后控制类中的方法还需要一个注解来声明RESTful中的请求访问路径与请求动作:

名称:@GetMapping  @PostMapping  @PutMapping  @DeleteMapping
类型:方法注解
位置:基于SpringMVC的RESTful开发控制器方法定义上方
作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求

属性:value(默认):请求访问路径

例如:

@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
    System.out.println("book getById..."+id);
    return "{'module':'book getById'}";
}

3.4案例:基于RESTful页面数据交互

①:制作SpringMVC控制器,并通过PostMan测试接口功能

@RestController
@RequestMapping("/books")
public class BookController {
    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book save ==> "+ book);
        return "{'module':'book save success'}";
    }
    @GetMapping
    public List getAll(){
        System.out.println("book getAll is running ...");
        List bookList = new ArrayList();
        Book book1 = new Book();
        book1.setType("计算机");
        book1.setName("SpringMVC入门教程");
        book1.setDescription("小试牛刀");
        bookList.add(book1);
        //模拟数据...
        return bookList;
    }
}

②:设置对静态资源的访问放行

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected 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/");
    }
}

③:前端页面通过异步提交访问后台控制器

//添加
saveBook() {
    axios.post("/books",this.formData).then((res)=>{

    });
},

//主页列表查询
getAll() {
    axios.get("/books").then((res)=>{
        this.dataList = res.data;
    });
},

3.4.1小结

案例:基于RESTful页面数据交互

先做后台功能,开发接口并调通接口

再做页面异步调用,确认功能可以正常访问

最后完成页面数据展示

补充:放行静态资源访问

你可能感兴趣的:(Sping,java,servlet,前端)