`
顽石
  • 浏览: 166799 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring webflux视图forward

 
阅读更多

   Spring5基于Spring Reactor3支持反应式编程(reactive programing),在其spring-webflux模块中提供反应式web开发,它又可分为两种风格的编程api:类似于spring-webmvc基于注解的controller风格和函数式风格。

 

     我们知道,对视图forward,在spring-webmvc controller的处理器方法中返回类似“forward:xx”的字符串即可将请求forward到xx url上。目前在webflux中如果要forward http请求,目前只有采用webfilter,在前面的文章spring webflux过滤器中有演示如何在过滤器中forward。在webflux controller中forward目前是不支持的,webflux支持controller方法返回“redirect:xx”进行重定向,但直到目前最新的spring 5.0.4 ,spring-webflux controller仍不支持类似spring-mvc的forward功能,相关jira见Reactive HTTP request forwarding,结合thymeleaf测试了视图forward,确实不支持,forward时报错。在thymeleaf-spring5-3.0.9.RELEASE.jar中org.thymeleaf.spring5.view.reactive.ThymeleafReactiveViewResolver.resolveViewName(String, Locale)方法有如下的TODO提示:

    if (viewName.startsWith(FORWARD_URL_PREFIX)) {

            vrlogger.trace("[THYMELEAF] View \"{}\" is a forward, and will not be handled directly by ThymeleafReactiveViewResolver.", viewName);

            // TODO * No view forwarding in Spring WebFlux yet. See https://jira.spring.io/browse/SPR-14537

            return Mono.error(new UnsupportedOperationException("Forwards are not currently supported by ThymeleafReactiveViewResolver"));

        }

 

      spring5仍支持spring-webmvc模块,使用webflux的原因是其全栈支持异步非阻塞,几乎从前端控制层--》服务层--》数据层均可异步(mongo/redis等有异步,JDBC目前还不支持异步,有些缺失,不过异步JDBC估计在19年会出现),不像spring-webmvc中的高并发场景下的异步是靠一个或多个线程池中的众多线程处理同步任务来达到伪异步,webflux也有线程池,但它的线程池容量较少,它推荐使用异步api编写异步任务,这些异步任务进行io时不会阻塞线程,这样只要不多的线程即可处理众多的请求。异步servlet和异步servlet io是在原来servlet阻塞api中打补丁的临时方案,适合做没有多少业务逻辑的应用,特别是可能有较高延迟(high latency)同时又有高并发的场景的io型应用,例如api网关这种需要进行高效网络io转发的应用,当然全新设计的webflux比异步servlet更适合做这种应用,并且它的适用面更广,还适合做业务逻辑复杂的应用。

    webflux模块抛弃了servlet编程模型,它没有servlet、servlet filter、context path、HttpServletRequest这些概念和类,它提供有webfilter(它是一个接口,不要和spring-webmvc中的WebFilter注解混淆)和前面说的两种风格的api。webflux controller中的view forward功能可通过webflux  webfilter来实现。

  

   view forwarding实现

   fork了github上最新的spring-framework,见https://github.com/wangguobo/spring-framework

   修改涉及到两个模块spring-web和spring-webflux。代码在master分支上,我另开了个分支v5.0.2.RELEASE.patch 也有相应的功能,可以下载编译该分支,使用v5.0.2.RELEASE.patch 版本的spring-web和spring-webflux。

 

   webflux  controller 视图forward演示

    项目使用的pom文件包含如下依赖

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.0.0.M7</version>

        <relativePath/> 

    </parent>

 

    <dependencies>

        <dependency>

              <groupId>org.springframework.boot</groupId>

              <artifactId>spring-boot-starter-thymeleaf</artifactId>

     </dependency>

 

     <dependency>

          <groupId>org.springframework.boot</groupId>

          <artifactId>spring-boot-starter-webflux</artifactId>

     </dependency>

 

      <dependency>

          <groupId>org.springframework</groupId>

          <artifactId>spring-webflux</artifactId>

           <!-- 要使用该版本-->

         <version>5.0.2.RELEASE.patch</versio> 

      </dependency>

 

      <dependency>

          <groupId>org.springframework</groupId>

          <artifactId>spring-web</artifactId>

          <!-- 要使用该版本-->

          <version>5.0.2.RELEASE.patch</version> 

       </dependency>

        ...

  </dependencies>

 

 

   

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

 

@Controller
public class WebfluxForwardDemoController {

@GetMapping("/")
public String home(ServerWebExchange exchange) {
    System.out.println("/");
    //forward:index为相对路径,forward:/index为绝对路径,和servlet forward类似
    return "forward:index";
}

@GetMapping("index")
public String index(Model model,ServerWebExchange exchange) {
    System.out.println("index");
    model.addAttribute("content", "hello");
    return "index";
}

@GetMapping("webflux")
public Mono<String> webflux(ServerWebExchange exchange) {
    System.out.println("webflux");
    return Mono.just("forward:demo");
}

@GetMapping("demo")
public String index(Model model,ServerWebExchange exchange) {
    System.out.println("forward-view");
    model.addAttribute("content", "webflux forward view");
    return "view1";
}

}

   forward会重放请求,请求会重新经过所有webfilter最后到controller(如果根据请求mapping能找到控制器的情况下),如果forward时希望跳过所有webfilter直接转到另一个controller方法,可以返回带前缀through:的字符串,例如 "through:index"。这个through功能也是这次一并实现的。

   

 

Test:
curl http://127.0.0.1:8080/
curl http://127.0.0.1:8080/webflux

   

   

 

 

 

分享到:
评论

相关推荐

    Java reactive programming - Reactor 3 and Spring WebFlux

    ### Java响应式编程:Reactor 3 和 Spring WebFlux #### 一、响应式编程简介 响应式编程(Reactive Programming)是一种编程范式,它允许开发者通过声明式的方式处理异步数据流和事件。这种编程模式的核心在于能够...

    springwebflux的demo

    **Spring WebFlux 概述** Spring WebFlux 是 Spring Framework 的一部分,它引入了一种反应式编程模型,用于构建高度可伸缩、非阻塞的 Web 应用程序。WebFlux 是对传统 Spring MVC 的补充,为现代 Web 应用提供了更...

    spring-webflux-5.3.15-API文档-中文版.zip

    赠送jar包:spring-webflux-5.3.15.jar; 赠送原API文档:spring-webflux-5.3.15-javadoc.jar; 赠送源代码:spring-webflux-5.3.15-sources.jar; 赠送Maven依赖信息文件:spring-webflux-5.3.15.pom; 包含翻译后...

    spring-webflux-5.3.10-API文档-中文版.zip

    赠送jar包:spring-webflux-5.3.10.jar; 赠送原API文档:spring-webflux-5.3.10-javadoc.jar; 赠送源代码:spring-webflux-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-webflux-5.3.10.pom; 包含翻译后...

    spring webflux使用的详细代码

    Spring WebFlux是Spring Framework 5.0引入的一个全新模块,它是对传统Spring MVC的补充,专注于非阻塞式、反应式编程模型。这个模型特别适用于高并发、低延迟的现代Web应用程序。在这个主题中,我们将深入探讨...

    spring webflux demo

    **Spring WebFlux 演示项目** Spring WebFlux 是 Spring Framework 的一个模块,它引入了一种响应式编程模型,用于构建非阻塞式的Web应用程序。与传统的基于Servlet的Spring MVC不同,WebFlux旨在优化性能,提高...

    spring-webflux实战.zip

    5. **错误处理**:在Spring WebFlux中,错误处理是内置的,通过异常处理器和自定义错误视图来提供友好的错误反馈。开发者可以通过定义全局异常处理器来统一处理各种异常情况。 6. **测试**:Spring WebFlux提供了...

    Java编程方法论 之 Spring Reactor Reactor-Netty Spring Webflux 全面解读.pdf

    Java编程方法论中,Spring Reactor、Reactor-Netty和Spring Webflux是现代Java开发中用于构建反应式应用程序的关键组件。Spring Reactor是响应式流(Reactive Streams)规范的实现,它提供了用于处理异步事件和数据...

    springfox-spring-webflux-3.0.0-API文档-中英对照版.zip

    赠送jar包:springfox-spring-webflux-3.0.0.jar; 赠送原API文档:springfox-spring-webflux-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webflux-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...

    Java_Spring Webflux课程代码.zip

    《深入理解Java Spring WebFlux框架》 Spring WebFlux是Spring Framework 5.0引入的一个新特性,它提供了一种响应式编程模型,用于构建高性能、非阻塞式的Web应用。相较于传统的Spring MVC,Spring WebFlux更适应...

    springfox-spring-webflux-3.0.0-API文档-中文版.zip

    赠送jar包:springfox-spring-webflux-3.0.0.jar; 赠送原API文档:springfox-spring-webflux-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webflux-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...

    使用SpringCloud和Spring WebFlux开发的学生作业管理系统服务端,前后端分离项目

    《基于SpringCloud与Spring WebFlux构建的学生作业管理系统服务端详解》 在现代软件开发领域,微服务架构已经成为主流,而SpringCloud作为Java生态中的微服务框架翘楚,深受开发者喜爱。结合轻量级的Spring WebFlux...

    spring-webflux.zip

    特点 1.webflux是一个异步非阻塞的Web框架,它能够充分利用多核CPU的硬件资源去处理大量...包含:spring-webflux-5.2.0.RELEASE.jarspring-webflux-5.2.0.RELEASE-javadoc.jarspring-webflux-5.2.0.RELEASE-sources.jar

    springwebflux:针对spring webflux相关技术

    springwebflux针对spring webflux相关技术Spring-Webflux重定向问题请看com.upic.controller.EditPetForm @GetMapping("/user/{id}")public String handle(User user, BindingResult errors, SessionStatus status, ...

    (源码)基于SpringWebFlux和MongoDB的自动化仓库管理系统.zip

    # 基于Spring WebFlux和MongoDB的自动化仓库管理系统 ## 项目简介 本项目是一个基于Spring WebFlux和MongoDB的自动化仓库管理系统,采用前后端分离的架构。后端部分的核心任务是定义并实现一套Restful API,以支持...

    webFlux:SpringwebFlux

    【Spring WebFlux:新一代反应式编程框架】 Spring WebFlux是Spring框架的一个重要扩展,它引入了对反应式编程模型的支持,旨在处理高并发、低延迟的Web应用。Spring WebFlux是Spring Framework 5.0及以上版本的一...

    spring-webflux-5.3.10-API文档-中英对照版.zip

    赠送jar包:spring-webflux-5.3.10.jar; 赠送原API文档:spring-webflux-5.3.10-javadoc.jar; 赠送源代码:spring-webflux-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-webflux-5.3.10.pom; 包含翻译后...

    Spring Webflux 响应式编程 (二) - WebFlux编程实战

    在本篇中,我们将深入探讨Spring Webflux的响应式编程模型,这是Spring框架的一个重要扩展,旨在提供非阻塞、事件驱动的Web应用程序开发。WebFlux是Spring Framework 5.x引入的新特性,它支持反应式编程,允许我们...

    okta-spring-webflux-react-example:React式Spring WebFlux API +实时React

    响应式Spring WebFlux API +实时React 这个例子展示了如何构建一个Reactive Spring WebFlux API,用OIDC保护它,然后向React客户端添加实时功能。 请阅读以了解如何创建此API。 要查看如何构建React应用程序并集成...

Global site tag (gtag.js) - Google Analytics