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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/43290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构day7(2023.7.23)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;结点之间的关系 练习2&#xff1a;二叉树的特殊形态 练习3&#xff1a;满二叉树的形态 练习4&#xff1a;完全二叉树的形态 满二叉树一定是完全二叉树&#xff0c;完全二叉树不一定是满二叉树 练习5&am…

Window下编译ffmpeg

Window下编译ffmpeg 下载MSYS2编译ffmpeg运行 下载MSYS2 MSYS2是一个是工具和库的集合&#xff0c;它能够方便的在windows上编译、安装和运行程序。ffmpeg可以通过这个软件来编译。 从MSYS2官网下载MSYS2并安装。 运行MSYS2终端&#xff0c;在终端中输入命令&#xff0c;安装…

07统计模型练习

使用SPSS进行分析求解 第一题 下表1.1是中国1994-2016年国内旅游总花费Y、国内生产总值X1、铁路里程X2和公路里程X3的数据,请据此分析如下问题: (1)就建立简单线性回归模型,分别分析中国国内旅游总花费与国内生产总值、铁路里程和公路里程数据的数量关系。 (2)对建立的回归模型…

JVS开源基础框架:用户管理介绍(支持同步钉钉、企微、微信等)

在企业内部系统中&#xff0c;用户管理是指对系统内的用户进行管理、授权和权限管理的过程&#xff0c;这里主要介绍用户的创建与基本信息的管理&#xff0c;权限、登录等详细介绍请参考相关章节。 用户管理界面 点击平台管理-用户管理&#xff0c;界面上展示了组织管理与组织…

potplayer放大画面,画面拖拽。备份

放大画面&#xff1a; 按住alt和鼠标左键&#xff0c;就可以拖动放大后的画面了 窗口化示图 倍数调整 默认只能0.1往上加&#xff0c;但是有的视频0.08倍数才正好&#xff0c;需要精确到2位小数。

基于Vue+Element Plus实现表格组件

目录 前言分析实现例子效果图前言 表格对于管理类项目是很重要的,可以只管的展示和比比较数据。使用Element Plus能解决一部分问题,但是还存在一些缺点和不足。 分析 浏览器上表格数据展示空间不足。列显示太多不够直观。完全依赖官方表格组件代码过于臃肿不利于管理和优化…

【Docker】Docker基本管理命令

目录 一、Docker概述1.1容器化受欢迎的原因1.2Docker核心概念 二、安装 Docker2.1环境准备 三、Doker镜像操作镜像操作选项 四 、Docker 容器操作容器操作选项 一、Docker概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是…

vue项目之《 搭建路由系统 》

author&#xff1a;德玛玩前端 date&#xff1a;2023-07-22 今天&#xff0c;在工作中拿到了架构师的前端框架&#xff0c;是一个vue2elementui搭建的单页面架构&#xff0c;没有路由系统&#xff0c;需要自己搭建&#xff0c;因为以往拿到的框架都是路由系统已经搭建好&#x…

【Linux】Tcp服务器的三种与客户端通信方法及守护进程化

全是干货~ 文章目录 前言一、多进程版二、多线程版三、线程池版四、Tcp服务器日志的改进五、将Tcp服务器守护进程化总结 前言 在上一篇文章中&#xff0c;我们实现了Tcp服务器&#xff0c;但是为了演示多进程和多线程的效果&#xff0c;我们将服务器与客户通通信写成了一下死循…

iphone新机官网验机流程

苹果官网验机流程 进入苹果官网&#xff0c;找到技术支持&#xff0c;进入“查看保障服务和支持期限“页面&#xff0c;输入要查询的机器的序列号&#xff0c;就可以查询了。 苹果官网验机入口&#xff1a;https://checkcoverage.apple.com/ 输入iphone序列号进行验机&#xff…

【高阶数据结构】B树

文章目录 一、B-树1. 常见的搜索结构2. B树概念3. B-树的查找4. B-树的插入分析 二、B树和B*树1. B树2. B*树 三、B-树的应用1. 索引2. MySQL索引简介2.1 MyISAM2.2 InnoDB 一、B-树 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索…

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

文章目录 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值&#x1f512;题目&#x1f511;题解 搜索二维矩阵II&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维…

帖子列表和SerializerMixin注意事项

帖子序列化 继承SerializerMixin 即可调用to_dict()序列化 后端 class PostModel(db.Model, SerializerMixin):serialize_only ("id", "title", "content", "create_time", "board", "author")__tablename__ …

rabbitmq访问异常

看到这个问题&#xff0c;第一时间想到rabbitmq的问题&#xff0c;应该权限导致的 先创建virtual hosts 接着创建用户并赋予权限,将eayc的virtual hosts权限赋予acc用户即可 15:34:24.250 WARN com.rabbitmq.client.impl.ForgivingExceptionHandler - An unexpected connec…

线程的基本概念

线程的基本概念 1. 概念1.1 什么是线程1.2 为什么要有线程1.3 进程和线程的区别 2. 线程创建的基本方法3. Thread 类3.1. Thread 的常见构造方法3.2 Thread 类常见的几种方法 4. 线程的状态 1. 概念 1.1 什么是线程 一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯…

Vue中TodoList案例_添加

与上一篇Vue中TodoList案例_初始化列表有四个文件变化了 安装nanoid库&#xff1a; npm i nanoid App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"…

IDEA快速创建SpringBoot

文件具有错误的版本 61.0, 应为 52.0报错可以看看是不是Springboot的版本比较高 和jdk版本不匹配 package com.qf.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframewor…

【Java】 服务器cpu过高如何排查和解决?

文章目录 前言一、常见能够引起CPU100%异常的情况都有哪些&#xff1f;二、服务器CPU使用率飙升异常&#xff0c;黄金4步排查法三、排查 CPU 故障的常用命令四、什么场景会造成 CPU 低而负载确很高呢&#xff1f;五、监控发现线上机器内存占用率居高不下&#xff0c;如何分析进…

第一天基础名词

文章目录 一、域名1、域名的概念2、域名注册3、域名的分类 二、DNS1、DNS的概念2、DNS解析3、本地hosts文件与DNS的关系4、如何查看本地Hosts文件 三、CDN1、CDN的概念2、CDN原理&#xff08;1&#xff09;回顾域名解析&#xff08;2&#xff09;CDN原理 3、常见DNS攻击 四、脚…

HideSeeker论文阅读

文章目录 3.1 Overview of Our System HideSeeker3.2 Visual Information Extraction3.3 Relation Graph Learning3.4 Hidden Object Inference 4 EVALUATIONS4.7 Summary 6 DISCUSSIONS AND CONCLUSION 3.1 Overview of Our System HideSeeker 我们设计了一种名为“HideSeeke…