(三)springboot实战——web新特性之函数式实现

前言

本节内容我们主要介绍一下web访问的另一种形式,通过函数式web实现一个restful风格的http请求案例。函数式web是spring5.2之后的一个新特性,可以通过函数去定义web请求的处理流程,使得代码更为简洁,耦合性也降低了。

正文

  • 函数式web的四大核心对象
  • RouterFunction:定义路由信息

  • RequestPredicates:定义请求规则,包括请求参数、请求方式等

  • ServerRequest:封装请求参数

  • ServerResponse:封装响应参数

  • 定义一个函数式web的路由组件WebFunctionConfig配置类
  • 实现代码

    package com.yundi.isbc.config;

    import com.yundi.isbc.handler.PersonHandlerService;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.MediaType;
    import org.springframework.web.servlet.function.RequestPredicates;
    import org.springframework.web.servlet.function.RouterFunction;
    import org.springframework.web.servlet.function.RouterFunctions;
    import org.springframework.web.servlet.function.ServerResponse;

    @Configuration
    public class WebFunctionConfig {

      /**
       * 用户信息管理
       *
       * @param personHandlerService
       * @return
       */
      @Bean
      public RouterFunction<ServerResponse> personRouter(PersonHandlerService personHandlerService) {
          RouterFunction<ServerResponse> personRouterFunction = RouterFunctions.route()
                  .GET("/person/{id}", RequestPredicates.accept(MediaType.ALL), personHandlerService::getPerson)
                  .GET("/persons", personHandlerService::getPersons)
                  .POST("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandlerService::savePerson)
                  .PUT("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandlerService::updatePerson)
                  .DELETE("/person/{id}", personHandlerService::deletePerson)
                  .build();
          return personRouterFunction;
      }
    

    }

  • 在该类中实现了restful风格的请求完成用户管理功能的开发

  • 用户person对象的实体类
  • 用户Person类

    package com.yundi.isbc.entity;

    import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
    import lombok.Data;
    import lombok.experimental.Accessors;

    import java.util.ArrayList;
    import java.util.List;

    @Accessors(chain = true)
    @Data
    public class Person {
    /**
    * id
    */
    private String id;

      /**
       * 名称
       */
      private String name;
    
      /**
       * 年龄
       */
      private Integer age;
    
      /**
       * 手机号
       */
      private String phone;
    
      /**
       * 住址
       */
      private List<Address> addresses = new ArrayList<>();
    

    }

  • 用户地址类

    package com.yundi.isbc.entity;

    import lombok.Data;
    import lombok.experimental.Accessors;

    @Accessors(chain = true)
    @Data
    public class Address {
    /**
    * 地址名称
    */
    private String addressName;
    }

  • 定义业务实现接口PersonHandlerService
  • 实现代码

    package com.yundi.isbc.handler;

    import jakarta.servlet.ServletException;
    import org.springframework.web.servlet.function.ServerRequest;
    import org.springframework.web.servlet.function.ServerResponse;

    import java.io.IOException;

    public interface PersonHandlerService {
    /**
    * 根据id获取用户信息
    *
    * @param serverRequest
    * @return
    */
    ServerResponse getPerson(ServerRequest serverRequest);

      /**
       * 获取全部用户
       * @param serverRequest
       * @return
       */
      ServerResponse getPersons(ServerRequest serverRequest);
    
      /**
       * 保存用户
       * @param serverRequest
       * @return
       */
      ServerResponse savePerson(ServerRequest serverRequest) throws ServletException, IOException;
    
      /**
       * 更新用户信息
       * @param serverRequest
       * @return
       */
      ServerResponse updatePerson(ServerRequest serverRequest) throws ServletException, IOException;
    
      /**
       * 删除用户
       * @param serverRequest
       * @return
       */
      ServerResponse deletePerson(ServerRequest serverRequest);
    

    }

  • 定义各功能业务实现接口方法

  • 定义业务实现类PersonHandlerServiceImpl
  • 实现代码

    package com.yundi.isbc.handler.impl;

    import com.yundi.isbc.entity.Address;
    import com.yundi.isbc.entity.Person;
    import com.yundi.isbc.handler.PersonHandlerService;
    import jakarta.servlet.ServletException;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    import org.springframework.web.servlet.function.ServerRequest;
    import org.springframework.web.servlet.function.ServerResponse;

    import java.io.IOException;
    import java.util.Arrays;

    @Slf4j
    @Service
    public class PersonHandlerServiceImpl implements PersonHandlerService {

      @Override
      public ServerResponse getPerson(ServerRequest serverRequest) {
          log.info("==================获取用户信息==================");
          String id = serverRequest.pathVariable("id");
          log.info("用户id:{}", id);
          return ServerResponse
                  .ok()
                  .body(new Person()
                          .setId("1")
                          .setName("xiaoming")
                          .setAge(18)
                          .setPhone("18288474612")
                          .setAddresses(Arrays.asList(new Address().setAddressName("北京市朝阳区"))));
      }
    
      @Override
      public ServerResponse getPersons(ServerRequest serverRequest) {
          log.info("==================获取全部用户信息==================");
          return ServerResponse
                  .ok()
                  .body(Arrays.asList(new Person()
                          .setId("1")
                          .setName("xiaoming")
                          .setAge(18)
                          .setPhone("18288474612")
                          .setAddresses(Arrays.asList(new Address().setAddressName("北京市朝阳区")))));
      }
    
      @Override
      public ServerResponse savePerson(ServerRequest serverRequest) throws ServletException, IOException {
          log.info("==================保存用户信息==================");
          Person person = serverRequest.body(Person.class);
          log.info("用户信息:{}", person);
          return ServerResponse.ok().build();
      }
    
      @Override
      public ServerResponse updatePerson(ServerRequest serverRequest) throws ServletException, IOException {
          log.info("==================更新用户信息==================");
          Person person = serverRequest.body(Person.class);
          log.info("用户信息:{}", person);
          return ServerResponse.ok().build();
      }
    
      @Override
      public ServerResponse deletePerson(ServerRequest serverRequest) {
          log.info("==================删除用户信息==================");
          String id = serverRequest.pathVariable("id");
          log.info("用户id:{}", id);
          return ServerResponse.ok().build();
      }
    

    }

  • 具体业务实现

  • 启动项目访问测试
  • 获取用户信息
  • 获取用户全部信息
  • 保存用户信息

- 更新用户信息

- 删除用户信息

结语

关于web新特性之函数式实现的相关内容到这里就结束了,我们下期见。。。。。。

相关推荐
路在脚下@17 分钟前
Java使用Redisson实现布隆过滤器
java·spring boot
周盛欢2 小时前
Spring Boot应用开发
spring boot
B站计算机毕业设计超人2 小时前
计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)
java·vue.js·spring boot·后端·spring·intellij-idea·课程设计
m0_748254663 小时前
定时任务特辑 Quartz、xxl-job、elastic-job、Cron四个定时任务框架对比,和Spring Boot集成实战
java·spring boot·后端
Warren983 小时前
Springboot中分析SQL性能的两种方式
java·spring boot·后端·sql·mysql·intellij-idea
毕业设计-014 小时前
0083.基于springboot+uni-app的社区车位租赁系统小程序+论文
spring boot·小程序·uni-app
计算机学姐4 小时前
基于SpringBoot的校园消费点评管理系统
java·vue.js·spring boot·后端·mysql·spring·java-ee
猎人everest4 小时前
Spring Boot数据访问(JDBC)全解析:从基础配置到高级调优
java·spring boot·后端
coderzjy5 小时前
苍穹外卖中的模块总结
spring boot·后端