• 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坐标

    1. <dependencies>
    2. <dependency>
    3. <groupId>javax.servletgroupId>
    4. <artifactId>javax.servlet-apiartifactId>
    5. <version>3.1.0version>
    6. <scope>providedscope>
    7. dependency>
    8. <dependency>
    9. <groupId>org.springframeworkgroupId>
    10. <artifactId>spring-webmvcartifactId>
    11. <version>5.2.10.RELEASEversion>
    12. dependency>
    13. dependencies>

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

    1. //该注解将该类交给SpringMVC容器控制
    2. @Controller
    3. public class UserController {
    4. //设置映射路径为/save,即外部访问路径
    5. @RequestMapping("/save")
    6. //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    7. @ResponseBody
    8. public String save(){
    9. System.out.println("user save ...");
    10. return "{'info':'springmvc'}";
    11. }
    12. }

    名称:@RequestMapping

    类型:方法注解

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

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

    相关属性

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

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

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

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

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

    1. //web容器配置类
    2. public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    3. //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    4. protected WebApplicationContext createServletApplicationContext() {
    5. //初始化WebApplicationContext对象
    6. AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    7. //加载指定配置类
    8. ctx.register(SpringMvcConfig.class);
    9. return ctx;
    10. }
    11. //设置由springmvc控制器处理的请求映射路径
    12. protected String[] getServletMappings() {
    13. return new String[]{"/"};
    14. }
    15. //加载spring配置类
    16. protected WebApplicationContext createRootApplicationContext() {
    17. return null;
    18. }
    19. }

    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()方法的返回值作为响应求体返回给请求方

    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

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

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

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

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

    bean的加载格式

    1. //web配置类简化开发,仅设置配置类类名即可
    2. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    3. protected Class[] getRootConfigClasses() {
    4. return new Class[]{SpringConfig.class};
    5. }
    6. protected Class[] getServletConfigClasses() {
    7. return new Class[]{SpringMvcConfig.class};
    8. }
    9. protected String[] getServletMappings() {
    10. return new String[]{"/"};
    11. }
    12. }
    13. /*
    14. public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    15. protected WebApplicationContext createServletApplicationContext() {
    16. AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    17. ctx.register(SpringMvcConfig.class);
    18. return ctx;
    19. }
    20. protected WebApplicationContext createRootApplicationContext() {
    21. AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    22. ctx.register(SpringConfig.class);
    23. return ctx;
    24. }
    25. protected String[] getServletMappings() {
    26. return new String[]{"/"};
    27. }
    28. }

    1.2.1小结

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

    2.请求与响应

    2.1请求映射路径

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

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

    1. @Controller
    2. //类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
    3. @RequestMapping("/user")
    4. public class UserController {
    5. //请求路径映射
    6. @RequestMapping("/save")
    7. @ResponseBody
    8. public String save(){
    9. System.out.println("user save ...");
    10. return "{'module':'user save'}";
    11. }
    12. //请求路径映射
    13. @RequestMapping("/delete")
    14. @ResponseBody
    15. public String delete(){
    16. System.out.println("user delete ...");
    17. return "{'module':'user delete'}";
    18. }
    19. }

    2.2请求方式

    2.2.1Get请求

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

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

    2.2.2Post请求参数

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

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

    Post请求中文乱码处理

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

    1. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    2. protected Class[] getRootConfigClasses() {
    3. return new Class[0];
    4. }
    5. protected Class[] getServletConfigClasses() {
    6. return new Class[]{SpringMvcConfig.class};
    7. }
    8. protected String[] getServletMappings() {
    9. return new String[]{"/"};
    10. }
    11. //乱码处理
    12. @Override
    13. protected Filter[] getServletFilters() {
    14. CharacterEncodingFilter filter = new CharacterEncodingFilter();
    15. filter.setEncoding("UTF-8");
    16. return new Filter[]{filter};
    17. }
    18. }

    2.3请求参数

    参数种类:

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

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

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

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

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

     

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

     

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

     

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

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

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

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

     

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

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

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

    JavaScript Object Notation => JavaScript对象表示法

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

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

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.coregroupId>
    3. <artifactId>jackson-databindartifactId>
    4. <version>2.9.0version>
    5. dependency>

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

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

    1. @Configuration
    2. @ComponentScan("com.itheima.controller")
    3. @EnableWebMvc
    4. public class SpringMvcConfig {
    5. }

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

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

    ④:设置接收json数据

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

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

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

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

     

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

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

     

    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:日期时间格式字符串

    1. //日期参数
    2. //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    3. @RequestMapping("/dataParam")
    4. @ResponseBody
    5. public String dataParam(Date date,
    6. @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
    7. @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
    8. System.out.println("参数传递 date ==> "+date);
    9. System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
    10. System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
    11. return "{'module':'data param'}";
    12. }

    消息发送:

    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)

    1. public interface Converter {
    2. @Nullable
    3. T convert(S var1);
    4. }

    2.4响应

    响应页面

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

    响应文本数据

    1. @RequestMapping("/toText")
    2. @ResponseBody
    3. public String toText(){
    4. return "response text";
    5. }

    响应json数据(对象转json)

    1. @RequestMapping("/toJsonPOJO")
    2. @ResponseBody
    3. public User toJsonPOJO(){
    4. User user = new User();
    5. user.setName("赵云");
    6. user.setAge(41);
    7. return user;
    8. }

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

    1. @RequestMapping("/toJsonList")
    2. @ResponseBody
    3. public List toJsonList(){
    4. User user1 = new User();
    5. user1.setName("赵云");
    6. user1.setAge(41);
    7. User user2 = new User();
    8. user2.setName("master 赵云");
    9. user2.setAge(40);
    10. List userList = new ArrayList();
    11. userList.add(user1);
    12. userList.add(user2);
    13. return userList;
    14. }

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

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

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

    HttpMessageConverter接口

    1. public interface HttpMessageConverter {
    2. boolean canRead(Class clazz, @Nullable MediaType mediaType);
    3. boolean canWrite(Class clazz, @Nullable MediaType mediaType);
    4. List getSupportedMediaTypes();
    5. T read(Class clazz, HttpInputMessage inputMessage)
    6. throws IOException, HttpMessageNotReadableException;
    7. void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
    8. throws IOException, HttpMessageNotWritableException;
    9. }

    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请求动作(动词)

    1. @RequestMapping(value = "/users", method = RequestMethod.POST)
    2. @ResponseBody
    3. public String save(@RequestBody User user){
    4. System.out.println("user save..." + user);
    5. return "{'module':'user save'}";
    6. }
    7. @RequestMapping(value = "/users" ,method = RequestMethod.PUT)
    8. @ResponseBody
    9. public String update(@RequestBody User user){
    10. System.out.println("user update..."+user);
    11. return "{'module':'user update'}";
    12. }

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

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

    @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")也移至类上。

    1. @RequestMapping(value = "/books", method = RequestMethod.POST)
    2. @ResponseBody
    3. public String save(@RequestBody Book book){
    4. System.out.println("book save..." + book);
    5. return "{'module':'book save'}";
    6. }
    7. @RequestMapping(value = "/books" ,method = RequestMethod.PUT)
    8. @ResponseBody
    9. public String update(@RequestBody Book book){
    10. System.out.println("book update..."+book);
    11. return "{'module':'book update'}";
    12. }

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

    1. @Controller
    2. @ResponseBody
    3. @RequestMapping("/books")
    4. public class BookController {
    5. }

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

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

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

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

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

    例如:

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

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

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

    1. @RestController
    2. @RequestMapping("/books")
    3. public class BookController {
    4. @PostMapping
    5. public String save(@RequestBody Book book){
    6. System.out.println("book save ==> "+ book);
    7. return "{'module':'book save success'}";
    8. }
    9. @GetMapping
    10. public List getAll(){
    11. System.out.println("book getAll is running ...");
    12. List bookList = new ArrayList();
    13. Book book1 = new Book();
    14. book1.setType("计算机");
    15. book1.setName("SpringMVC入门教程");
    16. book1.setDescription("小试牛刀");
    17. bookList.add(book1);
    18. //模拟数据...
    19. return bookList;
    20. }
    21. }

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

    1. @Configuration
    2. public class SpringMvcSupport extends WebMvcConfigurationSupport {
    3. @Override
    4. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    5. //当访问/pages/????时候,走/pages目录下的内容
    6. registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    7. registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    8. registry.addResourceHandler("/css/**").addResourceLocations("/css/");
    9. registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    10. }
    11. }

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

    1. //添加
    2. saveBook() {
    3. axios.post("/books",this.formData).then((res)=>{
    4. });
    5. },
    6. //主页列表查询
    7. getAll() {
    8. axios.get("/books").then((res)=>{
    9. this.dataList = res.data;
    10. });
    11. },

    3.4.1小结

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

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

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

    最后完成页面数据展示

    补充:放行静态资源访问

  • 相关阅读:
    (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
    2022秋季信息安全实验2
    Java Flink报错org/apache/flink/api/java/io/TextInputFormat
    LeetCode 623. 在二叉树中增加一行
    C++/Qt 小知识记录
    【POJ No. 3635】 加满油箱 Full Tank?
    第十五章 mysql存储过程与存储函数课后练习
    【QT+JS】QT和JS 中的正则表达式 、QT跑JS语言
    如何提高360评估的问卷回收率?
    Python网络编程
  • 原文地址:https://blog.csdn.net/weixin_65440201/article/details/126714460