(三)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*/@Beanpublic 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 {@Overridepublic 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("北京市朝阳区"))));}@Overridepublic 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("北京市朝阳区")))));}@Overridepublic ServerResponse savePerson(ServerRequest serverRequest) throws ServletException, IOException {log.info("==================保存用户信息==================");Person person = serverRequest.body(Person.class);log.info("用户信息:{}", person);return ServerResponse.ok().build();}@Overridepublic ServerResponse updatePerson(ServerRequest serverRequest) throws ServletException, IOException {log.info("==================更新用户信息==================");Person person = serverRequest.body(Person.class);log.info("用户信息:{}", person);return ServerResponse.ok().build();}@Overridepublic ServerResponse deletePerson(ServerRequest serverRequest) {log.info("==================删除用户信息==================");String id = serverRequest.pathVariable("id");log.info("用户id:{}", id);return ServerResponse.ok().build();}
}

- 具体业务实现

  • 启动项目访问测试

 - 获取用户信息

- 获取用户全部信息

-  保存用户信息

 - 更新用户信息

 - 删除用户信息

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Linux] 初识应用层协议: 序列化与反序列化、编码与解码、jsoncpp简单使用...

写在应用层之前 有关Linux网络, 之前的文章已经简单演示介绍了UDP、TCP套接字编程 相关文章: [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现… [Linux] 网络编程 - 初见TCP套接…

国产化 | 走近人大金仓-KingbaseES数据库

引入 事务隔离级别 || KingbaseES数据库 开篇 1、KingbaseES数据库 百度百科&#xff1a;金仓数据库的最新版本为KingbaseES V8&#xff0c; KingbaseES V8在系统的可靠性、可用性、性能和兼容性等方面进行了重大改进&#xff0c;支持多种操作系统和硬件平台支持Unix、Linux…

Ubuntu--科研工具系列

翻译系列 pot-desktop github链接: https://github.com/pot-app/pot-desktop 下载deb Releases pot-app/pot-desktop GitHub 安装过程 在下载好的deb目录下打开终端(自动安装依赖) sudo apt install "XXX.deb" &#xff08;后面可以直接托文件到终端&#…

d3dx9_42.dll丢失怎么解决?这三个方法亲测可修复

最近我在使用计算机时遇到了一个问题&#xff0c;就是d3dx9_42.dll文件丢失的错误提示。初时我对这个错误一无所知&#xff0c;不知道该如何解决。但是经过一番搜索和学习&#xff0c;我终于找到了修复这个问题的方法。d3dx9_42.dll是一个与DirectX相关的动态链接库文件&#x…

网络:TCP/IP协议

1. OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2. TCP/IP模型 应用层 传输层 网络层 数据链路层 物理层 3. 各链路层对应的名称 应用层对应的是协议数据单元 传输层对应的是数据段 网络层对应的是数据包 链路层对应的是数据帧 物理层对应的是比特…

Elasticsearch API(二)

文章目录 前言一、Elasticsearch指标ES支持的搜索类型ES的能力ES的写入实时性ES不支持事务 二、Elasticsearch名词节点&#xff08;Node&#xff09;角色&#xff08;Roles&#xff09;索引&#xff08;index&#xff09;文档&#xff08;document&#xff09; 三、Elasticsear…

fastadmin 项目gitee管理

gitee创建一个仓库使用sourcetree等工具拉取代码使用phpstorm远程同步代码到本地设置忽略代码文件 注意&#xff1a;如果是直接把远程代码同步到本地&#xff0c;默认是你在 .gitignore中设置是无效的&#xff0c;代码一样会提交&#xff0c;需要先使用上面的截图去掉缓存&…

VM虚拟机网络配置桥接模式方法步骤

VM虚拟机配置桥接模式&#xff0c;可以让虚拟机和物理主机一样存在于局域网中&#xff0c;可以和主机相通&#xff0c;和互联网相通&#xff0c;和局域网中其它主机相通。 vmware为我们提供了三种网络工作模式&#xff0c;它们分别是&#xff1a;Bridged&#xff08;桥接模式&…

Linux相关

0.需要安装的软件 0.1.VMware&#xff08;虚拟机&#xff09; 0.2.XShell&#xff08;强大的安全终端模拟软件&#xff09; 0.3.XFTP&#xff08;是一个功能强大的SFTP、FTP 文件传输软件&#xff09; 0.4.CentOS XShell和XFTP文件压缩包所在路径 D:\CentOS7 xftp安装默认…

Windows用户如何安装新版本cpolar内网穿透

在科学技术高度发达的今天&#xff0c;我们身边充斥着各种电子产品&#xff0c;这些电子产品不仅为我们的工作带来极大的便利&#xff0c;也让生活变得丰富多彩。我们可以使用便携的电子设备&#xff0c;记录下生活中精彩和有趣的瞬间&#xff0c;并通过互联网方便的与大家分享…

【雕爷学编程】Arduino动手做(172)---WeMos D1开发板模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Linux-DHCP安装配置流程

DHCP 介绍 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络协议&#xff0c;用于在局域网(LAN)中自动分配IP地址和其他网络配置信息给计算机设备。DHCP旨在简化网络管理&#xff0c;允许设备自动获取IP地址&#xff0c;无需手动配置&#xff0c;…

19.主题时钟

主题时钟 html部分 <div class"btn">黑色</div><div class"clock-container"><div class"time">21</div><div class"date">21</div><div class"clock"><div class&qu…

Linux系统MySQL数据库的备份及应用

本节主要学习了MySQL数据库的备份&#xff1a;概念&#xff0c;数据备份的重要性&#xff0c;造成数据丢失的原因&#xff0c;备份的类型&#xff0c;常见的备份方法&#xff0c;实例与应用等。 目录 一、概述 二、数据备份的重要性 三、造成数据丢失的原因 四、备份类型 …

小程序如何上传商品

​小程序作为一种便捷的电商平台&#xff0c;上传商品是非常重要的一步。本文将为你提供一个完整的小程序上传商品教程&#xff0c;帮助你轻松上架自己的商品。 一、进入商品管理页面 在个人中心点击管理入口&#xff0c;然后找到“商品管理”菜单并点击。 2. 点击“添加商品…

MySQL数据库期末项目 图书馆管理系统

1 项目需求分析 1.1 项目名称 图书馆管理系统 1.2 项目功能 在以前大多部分图书馆都是由人工直接管理&#xff0c;其中每天的业务和操作流程非常繁琐复杂&#xff0c;纸质版的登记信息耗费了大量的人力物力。因此图书馆管理系统应运而生&#xff0c;该系统采用智能化设计&#…

分布式文件存储与数据缓存 FastDFS

一、FastDFS概述 1.1 什么是分布式文件系统 单机时代 初创时期由于时间紧迫&#xff0c;在各种资源有限的情况下&#xff0c;通常就直接在项目目录下建立静态文件夹&#xff0c;用于用户存放项目中的文件资源。如果按不同类型再细分&#xff0c;可以在项目目录下再建立不同的…

C++初阶之一篇文章让你掌握string类(模拟实现)

string类模拟实现 1.为什么要模拟实现string2.string的模拟实现需要注意哪些问题3.经典的string类问题4.写时拷贝5.传统版写法的String类&#xff08;参考&#xff09;6.现代版写法的String类&#xff08;参考&#xff09;7.string类的模拟实现&#xff08;讲解&#xff09;7.1…

Android:RecyclerView封装,打造列表极简加载

前言 mBinding.recycler.linear().divider().set<OrdinaryListBean> {addLayout(R.layout.layout_ordinary_item)}.setList(getList()) 如果我要说&#xff0c;除了数据和布局之外&#xff0c;以上的几行代码&#xff0c;就实现了一个列表加载&#xff0c;有老铁会相信…

在 Windows 中通过 WSL 2 高效使用 Docker

大家好&#xff0c;我是比特桃。平时开发中&#xff0c;不免会使用一些容器来跑中间件。而开发者使用的操作系统&#xff0c;大多是Mac OS 、Windows。Docker 为了兼顾这两个平台的用户&#xff0c;推出了 Docker Desktop 应用。Docker Desktop 中的内核还是采用了 Linux 的内核…