java webflux注解方式写一个可供web端访问的数据接口

首先 创建一个 Spring initiolar 项目
然后 找到项目配置文件 pom.xml
引入webflux 和 web
参考代码如下

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

在这里插入图片描述

然后在项目中打开如下图目录文件
在这里插入图片描述
就在这个文件中设置一个端口号 参考代码如下

server.port=8081

然后 打开项目如下图箭头所指的这个目录
在这里插入图片描述
在项目创建我们项目所需要的结构包 entity,controller,senvice
然后 我们的项目就是这样的
在这里插入图片描述
在entity包下创建一个类 叫 User 参考代码如下

package com.example.springapiweb.entity;

public class User {
    private String name;
    private String gender;
    private Integer age;

    public User(String name,String gender,Integer age){
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public void setName(String name){
        this.name = name;
    };

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    public String getName(){
        return this.name;
    };
    public String getGender() {
        return this.gender;
    }
    public Integer getAge() {
        return this.age;
    }
}

简单创建了一个实体类 创建了三个字段 name 用户名称 gender 性别 age 年龄 写了他们对应的get set 和 一个有参构造方法

然后呢 我们这个项目就不直接去操作数据库啦

我们在 senvice 包下创建一个接口 叫 UserService
参考代码如下

package com.example.springapiweb.senvice;

import com.example.springapiweb.entity.User;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public interface UserService {
    //根据id查询用户
    Mono<User> getUserById(int id);
    //查询所有用户
    Flux<User> getAllUser();
    //添加用户
    Mono<Void> saveUserInfo (Mono<User> user);
}

我们在接口中定义了几个比较简单的用户操作方法

然后在 senvice 下创建一个包 叫 impl 用于存放实现类 在下面创建一个类 叫 UserServiceImpl

参考代码如下

package com.example.springapiweb.senvice.impl;

import com.example.springapiweb.entity.User;
import com.example.springapiweb.senvice.UserService;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Map;
import java.util.HashMap;

@Repository
public class UserServiceImpl implements UserService {
    //创建map集合存储教据
    private final Map<Integer,User> users = new HashMap<>();

    //在构造方法中为map注入几条数据
    public UserServiceImpl(){
        this.users.put(1,new User("小猫猫","女",2));
        this.users.put(2,new User("小明","男",11));
        this.users.put(3,new User("服部半藏","男",32));
    }

    //根据id查询指定用户
    @Override
    public Mono<User> getUserById(int id) {
        return Mono.justOrEmpty(this. users. get (id));
    }

    //查询所有用户
    @Override
    public Flux<User> getAllUser() {
        return Flux.fromIterable(this.users.values());
    }

    //添加用户
    @Override
    public Mono<Void> saveUserInfo(Mono<User> userMono) {
        return userMono.doOnNext(person -> {
            //向map集合里面放值
            int id = users. size()+1;
            users.put(id,person);
        }).thenEmpty(Mono.empty());
    }
}

我们实现了UserService接口 因为我们这次并不打算操作数据库 所以 所有的操作都是通过Map集合实现的
要特别说明 我们添加后面特意加一个Mono.empty() 是结束流 不然他就成立一个无限的流了

而Mono只能返回 0-1个元素 而 Flux可以返回N个 所以 这里只有查询所有用户的方法用到了Flux
专业的人 做专业的事 这是一个很基础的术语

而 为了解决一开始 map没数据的问题 我们在构造方法中给他注入了几条数据

然后 通过 Repository 声明了当前的类在注解中

然后 在 controller 包下创建一个类 叫 UserController
参考代码如下

package com.example.springapiweb.controller;
import com.example.springapiweb.entity.User;
import com.example.springapiweb.senvice.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
public class UserController {
    //注入service
    @Autowired
    private UserService userService;

    //id查询
    @GetMapping("/user/{id}")
    public Mono<User> geetUserId(@PathVariable int id) {
        return userService. getUserById(id);
    };

    //查询所有
    @GetMapping("/user")
    public Flux<User> getUsers() {
        return userService.getAllUser();
    };

    @PostMapping("/saveuser")
    public Mono<Void> saveUser(@RequestBody User user) {
        Mono<User> userMono = Mono.just(user);
        return userService.saveUserInfo(userMono);
    };
}

这样 我们就简单做出了一个webflux的交互案例
讲解一下 PathVariable 通常是通过路径获取参数
RequestBody 则是要通过bodyi去取

然后 我们如下图 找到他的启动类 进行一个启动
在这里插入图片描述
我们的项目就起来了
在这里插入图片描述
我们可以看到 目前这里的请求地址 是 本机的 8081
在这里插入图片描述
然后我们随便打开一个浏览器 访问 http://localhost:8081/user/1
运行结果如下
在这里插入图片描述
通过你电脑的IP+端口也可以访问 这里 因为没必要暴露 我就不演示IP的用法啦 很基础的东西了

然后我们再通过浏览器直接访问 http://localhost:8081/user
运行结果如下
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,我们可以使用 Java 的 Servlet 技术来实现 web 的异步接口。 首先,你需要在 web.xml 中注册一个 Servlet,并将其映射到一个 URL。例如: ``` <servlet> <servlet-name>AsyncServlet</servlet-name> <servlet-class>com.example.AsyncServlet</servlet-class> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>AsyncServlet</servlet-name> <url-pattern>/async</url-pattern> </servlet-mapping> ``` 然后,你可以在你的 Servlet 中实现 doGet() 或 doPost() 方法,并在其中调用 startAsync() 方法来启动一个异步操作。例如: ``` @WebServlet(urlPatterns="/async", asyncSupported=true) public class AsyncServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final AsyncContext asyncContext = request.startAsync(); asyncContext.start(new Runnable() { @Override public void run() { try { // 执行异步操作 asyncContext.getResponse().getWriter().write("Hello, World!"); } catch (IOException e) { e.printStackTrace(); } asyncContext.complete(); } }); } } ``` 然后,你就可以在客户使用 JavaScript 发起一个异步请求,并在请求完成后处理响应。例如: ``` var xhr = new XMLHttpRequest(); xhr.open("GET", "/async"); xhr.onload = function() { console.log(xhr.responseText); }; xhr.send(); ``` 希望这些信息对你有帮助。 ### 回答2: 要使用Java一个Web的异步接口,可以使用Servlet和JAX-RS来实现。 首先,创建一个Servlet类,继承HttpServlet,并在web.xml文件中配置该Servlet。在Servlet的doGet或doPost方法中,可以使用Java的ExecutorService来实现异步处理。可以使用ExecutorService的submit方法来提交一个带有Callable或Runnable的任务,并获取一个Future对象。 在任务的run方法中,可以实现需要异步处理的逻辑,例如从数据库中获取数据或执行计算。在异步处理完成后,可以将结果保存在一个变量中或将其返回给客户。 接下来,创建一个JAX-RS资源类,使用@Path注解来标记资源的路径。在资源类中,可以使用@GET或@POST注解来指定HTTP方法,并使用@Produces注解来指定响应的数据类型。 在资源类的方法中,可以使用异步Servlet中获取的结果对象,并将其作为响应的一部分返回给客户。可以使用Java的线程池来处理并发请求。 最后,在web.xml文件中配置JAX-RS应用程序并指定资源类的包名。可以使用Java的内嵌Tomcat或Jetty服务器来启动Web应用程序。 总之,通过结合Servlet和JAX-RS,使用Java一个Web的异步接口是相对简单的。关键是理解如何使用ExecutorService和线程池来实现异步处理,并且熟悉Servlet和JAX-RS的基本使用方法。希望以上信息对您有所帮助! ### 回答3: 使用JavaWeb异步接口可以通过Servlet、Spring框架或者其他相关的Java Web框架来实现。 一种常见的方式是使用Servlet来实现异步接口。具体步骤如下: 1. 创建一个Servlet类,并在web.xml文件中配置Servlet映射。 2. 在Servlet类的doGet或doPost方法中,将请求标记为异步处理(使用AsyncContext对象)。 3. 在异步处理中进行相应的业务逻辑操作,例如从数据库中获取数据、调用其他接口等。 4. 在处理完成后,可以通过AsyncContext对象的complete方法通知容器请求处理已完成。 5. 返回结果给客户。 下面是一个简单示例: ```java import java.io.IOException; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyAsyncServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final AsyncContext asyncContext = request.startAsync(); // 进行异步处理 new Thread(new Runnable() { public void run() { try { // 执行业务逻辑操作 String result = doSomeWork(); // 返回结果给客户 HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse(); response.getWriter().write(result); // 通知容器请求处理已完成 asyncContext.complete(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } private String doSomeWork() { // 进行业务逻辑操作,例如从数据库中获取数据、调用其他接口等 // ... return "处理完成"; } } ``` 在上述示例中,doGet方法将请求标记为异步处理,并创建了一个新的线程,在该线程中执行业务逻辑操作,最后将结果返回给客户。使用异步处理可提高并发能力,并且不会阻塞容器中的线程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值