(三)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新特性之函数式实现的相关内容到这里就结束了,我们下期见。。。。。。

相关推荐
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
Wx-bishekaifayuan3 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Yaml44 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
LuckyLay4 小时前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
佳佳_5 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
程序媛小果6 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
狂放不羁霸8 小时前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
计算机学长felix9 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
码农派大星。9 小时前
Spring Boot 配置文件
java·spring boot·后端