springboot3
和springMVC5.2
以后允许我们使用函数式的方式编程,定义Web的请求处理流程。
Web请求处理的方式
1.@Controller+@RequestMapping
:耦合式(路由、业务耦合)
2.函数式web:分离式(路由、业务分离)
1.场景
场景:User RESTful - CRUD
- GET /user/1 获取1号用户
- GET /users 获取所有用户
- POST /user 请求体携带JSON,新增一个用户
- PUT /user/1 请求体携带JSON,修改1号用户
- DELETE /user/1 删除1号用户
2.核心类
- RouterFunction:给容器中放一个Bean:类型是RouterFunction
- RequestPredicate:定义请求:请求谓语。请求方式(GET、POST)、请求参数
- ServerRequest:封装请求完整数据
- ServerResponse:封装响应完整数据
3.实例
首先定义了一个实体类Person
@Data
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement
public class Person {
Long id;
String username;
String email;
int age;
}
然后定义一个配置类
@Configuration
public class WebFunctionConfig {
/**
* 函数式Web:
* 1、给容器中放一个Bean:类型是RouterFunction<ServerResponse>
* 2、RequestPredicate:定义请求:请求谓语。请求方式(GET、POST)、请求参数
* 3、ServerRequest:封装请求完整数据
* 4、ServerResponse:封装相应完整数据
* */
@Bean
public RouterFunction<ServerResponse> userRoute(UserBizHandler userBizHandler /*这个会被自动注入进来*/){
return RouterFunctions.route()//开始定义路由信息
.GET("/user/{id}", RequestPredicates.accept(MediaType.ALL),userBizHandler::getUser)
.GET("/users",userBizHandler::getUsers)
.POST("/user",RequestPredicates.accept(MediaType.ALL),userBizHandler::addUser)
.PUT("/user/{id}",RequestPredicates.accept(MediaType.ALL),userBizHandler::updateUser)
.DELETE("/user/{id}",userBizHandler::deleteUser)
.build();
}
}
最后可以写上处理器类
@Service
@Slf4j
public class UserBizHandler {
/**
* 查询指定id的用户
* */
public ServerResponse getUser(ServerRequest request){
log.info("查询【{}】用户信息",request.pathVariable("id"));
//业务处理
Person person = new Person(1L,"张三1","zs1@qq.com",15);
//构造响应
return ServerResponse.ok().body(person);
}
/**
* 查询多个id的用户
* 1*/
public ServerResponse getUsers(ServerRequest request){
log.info("查询所有用户信息");
List<Person> list = Arrays.asList(new Person(1L, "张三1", "zs1@qq.com", 15),
new Person(2L, "张三2", "zs2@qq.com", 16));
return ServerResponse.ok().body(list);
}
/**
* 添加用户
* */
public ServerResponse addUser(ServerRequest request) throws ServletException, IOException {
Person body = request.body(Person.class);
log.info("保存用户信息:{}",body);
return ServerResponse.ok().build();
}
/**
* 修改用户信息
* */
public ServerResponse updateUser(ServerRequest request) throws ServletException, IOException {
Person body = request.body(Person.class);
log.info("修改用户信息后:{}",body);
return ServerResponse.ok().build();
}
/**
* 删除用户信息
* */
public ServerResponse deleteUser(ServerRequest request){
log.info("删除用户【{}】信息",request.pathVariable("id"));
return ServerResponse.ok().build();
}
}
后面可以通过Postman进行测试
测试GET
测试POST
测试PUT
测试DELETE
总结
虽然还是觉得最开始的controller、service
这些业务逻辑更清晰一点,但是可能后续的开发规则有改变,学习一下官方给的新特性更好的适应现在的内卷开发环境,所以以后可以试一试这种开发方式。