Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲日本va中文字幕婷婷,免费视频日韩,国产精品ⅴ视频免费观看

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Spring WebFlux vs. Spring

          Spring WebFlux vs. Spring MVC


          隨著異步 I/O 和 Netty 等框架的流行,響應(yīng)式編程逐漸走入大眾的視野。但是,響應(yīng)式編程本身并不是太新的概念,這個(gè)術(shù)語(yǔ)最早出現(xiàn)在 1985 年 David Harel 和 Amir Pnueli 的論文“響應(yīng)式系統(tǒng)的開(kāi)發(fā)”之中,他們對(duì)復(fù)雜計(jì)算機(jī)系統(tǒng)的特征進(jìn)行了歸納,提出了一種新穎的二分方式:轉(zhuǎn)換式(Transformative)與響應(yīng)式(Reactive)系統(tǒng)。轉(zhuǎn)換式系統(tǒng)接收已知的一組輸入,轉(zhuǎn)換這些輸入并產(chǎn)生輸出,而響應(yīng)式系統(tǒng)則會(huì)持續(xù)受到外部環(huán)境的刺激,它們的角色就是持續(xù)響應(yīng)刺激。在構(gòu)建響應(yīng)式 Web 服務(wù)上,Spring 5 中引入了全新的編程框架,那就是 Spring WebFlux。作為一款新型的 Web 服務(wù)開(kāi)發(fā)框架,它與傳統(tǒng)的 WebMVC 相比具體有哪些優(yōu)勢(shì)呢?


          Spring WebFlux

          介紹

          Spring WebFlux 作為一個(gè)響應(yīng)式 (reactive-stack) web 框架補(bǔ)充,在 5.0 的版本開(kāi)始加入到 Spring 全家桶。這是一個(gè)完全非阻塞的,支持 Reactive Streams, 運(yùn)行在諸如 Netty, Undertow, 以及 Servlet 3.1+ 容器上的,Spring WebFlux 構(gòu)建在 Reactor 框架之上,提供了基于注解和函數(shù)式兩種方式來(lái)配置和運(yùn)行。Spring WebFlux 可以讓你使用更少的線程去處理并發(fā)請(qǐng)求,同時(shí)能夠讓你使用更少的硬件資源來(lái)拓展你的應(yīng)用。WebFlux 使用Netty作為默認(rèn)的web服務(wù)器,其依賴于非阻塞IO,并且每次寫(xiě)入都不需要額外的線程進(jìn)行支持。也可以使用Tomcat、Jetty容器,不同與SpringMVC依賴于Servlet阻塞IO,并允許應(yīng)用程序在需要時(shí)直接使用Servlet API,WebFlux依賴于Servlet 3.1非阻塞IO。使用Undertow作為服務(wù)器時(shí),WebFlux直接使用Undertow API而不使用Servlet API。


          特點(diǎn)

          • 非阻塞式,在有限資源下,提高系統(tǒng)吞吐量和伸縮性,以Reactor為基礎(chǔ)實(shí)現(xiàn)響應(yīng)式編程,異步非阻塞 I/O 模型,認(rèn)為應(yīng)用不會(huì)阻塞當(dāng)前線程,所以只是需要一個(gè)包含少數(shù)固定線程數(shù)的線程池 (event loop workers) 來(lái)處理請(qǐng)求
          • 函數(shù)式編程,Spring5框架基于Java8, WebFlux使用Java8函數(shù)式編程方式實(shí)現(xiàn)路由請(qǐng)求
          • 支持異步I/O的Netty、Undertow等框架,以及基于Servlet 3.1+的容器(如Tomcat 8.0.23+和Jetty 9.0.4+);
          • 支持響應(yīng)式的數(shù)據(jù)訪問(wèn)Spring Data Reactive Repositories;
          • 支持響應(yīng)式的安全訪問(wèn)控制Spring Security Reactive;


          場(chǎng)景

          WebFlux 用于構(gòu)建響應(yīng)式 Web 服務(wù)。微服務(wù)架構(gòu)的興起為 WebFlux 的應(yīng)用提供了一個(gè)很好的場(chǎng)景。我們知道在一個(gè)微服務(wù)系統(tǒng)中,存在數(shù)十乃至數(shù)百個(gè)獨(dú)立的微服務(wù),它們相互通信以完成復(fù)雜的業(yè)務(wù)流程。這個(gè)過(guò)程勢(shì)必會(huì)涉及大量的 I/O 操作,尤其是阻塞式 I/O 操作會(huì)整體增加系統(tǒng)的延遲并降低吞吐量。如果能夠在復(fù)雜的流程中集成非阻塞、異步通信機(jī)制,我們就可以高效處理跨服務(wù)之間的網(wǎng)絡(luò)請(qǐng)求。針對(duì)這種場(chǎng)景,WebFlux 是一種非常有效的解決方案。控制層一旦使用 Spring WebFlux,它下面的安全認(rèn)證層、數(shù)據(jù)訪問(wèn)層都必須使用 Reactive API。其次,Spring Data Reactive Repositories 目前只支持 MongoDB、Redis 和 Couchbase 等幾種不支持事務(wù)管理的 NOSQL。技術(shù)選型時(shí)一定要權(quán)衡這些弊端和風(fēng)險(xiǎn)。


          響應(yīng)式編程

          響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式,這意味著可以在編程語(yǔ)言中很方便地表達(dá)靜態(tài)或動(dòng)態(tài)的數(shù)據(jù)流,而相關(guān)的計(jì)算模型會(huì)自動(dòng)將變化的值通過(guò)數(shù)據(jù)流進(jìn)行傳播,電子表格程序就是響應(yīng)式編程的。

          響應(yīng)式應(yīng)用應(yīng)該具備如下的四個(gè)特點(diǎn):

          • 即時(shí)響應(yīng)性(Responsive):只要有可能,系統(tǒng)就會(huì)及時(shí)地做出響應(yīng)。響應(yīng)能力是可用性和實(shí)用性的基石,但是更加重要的是,響應(yīng)能力意味著可以快速地檢測(cè)出問(wèn)題并且行之有效地解決它
          • 彈性(Resilient):系統(tǒng)在出現(xiàn)失敗(Failure)時(shí)依然保持即時(shí)響應(yīng)性。
          • 適應(yīng)性(Elastic):系統(tǒng)在變化的工作負(fù)載之下依保持著即時(shí)響應(yīng)性。反應(yīng)式系統(tǒng)可以通過(guò)增加或者減少分配給服務(wù)于輸入(負(fù)載的)資源,來(lái)響應(yīng)輸入(負(fù)載的)速率的變化
          • 消息驅(qū)動(dòng)(Message Driven):反應(yīng)式系統(tǒng)依賴異步的消息傳遞來(lái)確立組件之間的邊界,以確保松散耦合、隔離以及位置透明性


          并發(fā)模型

          WebFlux模型主要依賴響應(yīng)式編程庫(kù)Reactor,Reactor 有兩種模型,F(xiàn)lux 和 Mono,提供了非阻塞、支持回壓機(jī)制的異步流處理能力。WebFlux API接收普通Publisher作為輸入,在內(nèi)部使其適配Reactor類型,使用它并返回Flux或Mono作為輸出。


          Spring WebMVC

          介紹

          SpringMvc是一種基于java的實(shí)現(xiàn)Mvc設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)web框架,屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow中,SpringMvc已經(jīng)成為目前最主流的MVC框架之一,并且隨著Spring3.0的發(fā)布,全面超越Struts2,成為最優(yōu)秀的mvc框架,他通過(guò)一套注解,讓一個(gè)簡(jiǎn)單的java類成為處理請(qǐng)求的控制器,他無(wú)需實(shí)現(xiàn)任何接口,同時(shí)他還支持RESTful編程風(fēng)格的請(qǐng)求。


          特點(diǎn)

          • 清晰地角色劃分
          • 靈活的配置功能
          • 提供了大量的控制器接口和實(shí)現(xiàn)類
          • 真正的View層實(shí)現(xiàn)無(wú)關(guān)(JSP、Velocity、Xslt等)
          • 國(guó)際化支持
          • 面向接口編程
          • Spring提供了Web應(yīng)用開(kāi)發(fā)的一整套流程,不僅僅是MVC,他們之間可以很方便的結(jié)合一起


          MVC

          Spring web MVC框架提供了MVC(模型 - 視圖 - 控制器)架構(gòu)和用于開(kāi)發(fā)靈活和松散耦合的Web應(yīng)用程序的組件。 MVC模式導(dǎo)致應(yīng)用程序的不同方面(輸入邏輯,業(yè)務(wù)邏輯和UI邏輯)分離,同時(shí)提供這些元素之間的松散耦合。

          • 模型(Model)封裝了應(yīng)用程序數(shù)據(jù),通常它們將由POJO類組成。
          • 視圖(View)負(fù)責(zé)渲染模型數(shù)據(jù),一般來(lái)說(shuō)它生成客戶端瀏覽器可以解釋HTML輸出。
          • 控制器(Controller)負(fù)責(zé)處理用戶請(qǐng)求并構(gòu)建適當(dāng)?shù)哪P停⑵鋫鬟f給視圖進(jìn)行渲染

          并發(fā)模型

          servlet由servlet container進(jìn)行生命周期管理。container啟動(dòng)時(shí)構(gòu)造servlet對(duì)象并調(diào)用servlet init()進(jìn)行初始化;container關(guān)閉時(shí)調(diào)用servlet destory()銷毀servlet;container運(yùn)行時(shí)接受請(qǐng)求,并為每個(gè)請(qǐng)求分配一個(gè)線程(一般從線程池中獲取空閑線程)然后調(diào)用service()。

          處理請(qǐng)求的時(shí)候同步操作,一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)線程來(lái)處理,并發(fā)上升,線程數(shù)量就會(huì)上漲(上線文切換,內(nèi)存消耗大)影響請(qǐng)求的處理時(shí)間。現(xiàn)代系統(tǒng)多數(shù)都是IO密集的,同步處理讓線程大部分時(shí)間都浪費(fèi)在了IO等待上面。雖然Servlet3.0后提供了異步請(qǐng)求處理與非阻塞IO支持,但是使用它會(huì)遠(yuǎn)離Servlet API的其余部分,比如其規(guī)范是同步的(Filter, Servlet)或阻塞的(getParameter,getPart),而且其對(duì)響應(yīng)的寫(xiě)入仍然是阻塞的。

          總結(jié)

          Spring WebFlux 不是 Spring MVC 的替代方案,Spring WebFlux 是 Spring Framework 5.0中引入的新的響應(yīng)式web框架。與Spring MVC不同,它不需要Servlet API,是完全異步且非阻塞的,并且通過(guò)Reactor項(xiàng)目實(shí)現(xiàn)了Reactive Streams規(guī)范。Spring MVC依然構(gòu)建在 Servlet API 以及 Servlet 容器之上;Spring Security 為兩種不同的技術(shù)棧提供了安全性的支持,Spring Data 分別為兩種不同的技術(shù)棧實(shí)現(xiàn)了 Repository;在數(shù)據(jù)訪問(wèn)方面,響應(yīng)式 Repository 已經(jīng)涵蓋了 Mongo、Cassandra、Redis 以及 Couchbase。但是在關(guān)系型數(shù)據(jù)庫(kù)方面,因?yàn)?JBDC 規(guī)范本身就是阻塞式的,所以進(jìn)展并不明顯。但是,像 PostgreSQL 和 MySQL 已經(jīng)有了異步驅(qū)動(dòng)。異步非阻塞并不會(huì)使程序運(yùn)行得更快。WebFlux 并不能使接口的響應(yīng)時(shí)間縮短,它僅僅能夠提升吞吐量和伸縮性。Spring WebFlux 是一個(gè)異步非阻塞的 Web 框架,所以,它特別適合應(yīng)用在 IO 密集型的服務(wù)中,比如微服務(wù)網(wǎng)關(guān)這樣的應(yīng)用中。

          pring MVC的表單標(biāo)簽為Java程序員提供了許多額外的支持。例如數(shù)據(jù)綁定,允許自動(dòng)設(shè)置數(shù)據(jù)并從Java對(duì)象中檢索數(shù)據(jù)。

          從2.0版本開(kāi)始,Spring提供了一組全面的數(shù)據(jù)綁定感知標(biāo)記,用于在使用JSP和Spring Web MVC時(shí)處理表單元素。每個(gè)標(biāo)記都支持其相應(yīng)HTML標(biāo)記對(duì)應(yīng)的屬性集,使標(biāo)記熟悉且直觀易用。標(biāo)記生成的HTML符合HTML 4.01 / XHTML 1.0 標(biāo)準(zhǔn)。

          Spring 表單標(biāo)簽

          • form 標(biāo)簽
          • input 標(biāo)簽
          • checkbox 標(biāo)簽
          • checkboxes 標(biāo)簽
          • radiobutton 標(biāo)簽
          • radiobuttons 標(biāo)簽
          • password 標(biāo)簽
          • select 標(biāo)簽
          • option 標(biāo)簽
          • options 標(biāo)簽
          • textarea 標(biāo)簽
          • hidden 標(biāo)簽
          • errors 標(biāo)簽
          • HTML5 標(biāo)簽集

          在本文中我們會(huì)瀏覽所有這些表單標(biāo)簽,并查看每個(gè)標(biāo)簽的使用方式。

          配置

          表單標(biāo)記庫(kù)被捆綁在spring-webmvc.jar中,庫(kù)描述符稱為spring-form.tld。

          如何引入Spring MVC 表單標(biāo)簽

          要使用此庫(kù)中的標(biāo)記,請(qǐng)將以下指令添加到JSP頁(yè)面的頂部:

          form標(biāo)簽

          此標(biāo)記呈現(xiàn)HTML“form”標(biāo)記,并公開(kāi)內(nèi)部標(biāo)記的綁定路徑以進(jìn)行綁定。 它將命令對(duì)象放在PageContext中,以便內(nèi)部標(biāo)記可以訪問(wèn)命令對(duì)象。 此庫(kù)中的所有其他標(biāo)記都是表單標(biāo)記的嵌套標(biāo)記。

          假設(shè)我們有一個(gè)名為User的域?qū)ο蟆K且粋€(gè)JavaBean,具有firstName和lastName等屬性。我們將它用作表單控制器的表單支持對(duì)象,它返回form.jsp。如下所示:

          firstName和lastName值是從頁(yè)面控制器放置在PageContext中的命令對(duì)象中檢索的。加載表單時(shí),Spring MVC將對(duì)user.getFirstName()和getLastName()(getter方法)進(jìn)行分類。提交表單時(shí),Spring MVC將調(diào)用user.setFirstName()和user.setLastName()方法。 生成的HTML看起來(lái)是這樣:

          input 標(biāo)簽

          input 標(biāo)記默認(rèn)使用綁定值和type='text'呈現(xiàn)HTML 'input'標(biāo)記,舉個(gè)例子:

          生成的HTML代碼如下所示:

          checkbox 標(biāo)簽

          此標(biāo)記呈現(xiàn)帶有“checkbox”類型的HTML “input”標(biāo)記,例如:

          生成的代碼如下所示:

          checkboxes 標(biāo)簽

          此標(biāo)記呈現(xiàn)多個(gè)帶有“checkbox”類型的HTML “input”標(biāo)記,示例如下:

          radiobutton 標(biāo)簽

          此標(biāo)記呈現(xiàn)帶有“radio”類型的HTML “input”標(biāo)記,典型的使用模式將涉及綁定到同一屬性但具有不同值的多個(gè)標(biāo)記實(shí)例:

          radiobuttons 標(biāo)簽

          此標(biāo)記呈現(xiàn)多個(gè)帶有“radio”類型的HTML “input”標(biāo)記,例如:

          password 標(biāo)簽

          此標(biāo)記使用綁定值呈現(xiàn)帶有“password”類型的HTML “input”標(biāo)記,如下:

          請(qǐng)注意,默認(rèn)情況下,密碼值不會(huì)顯示。如果您確實(shí)需要顯示密碼值,請(qǐng)將“showPassword”屬性的值設(shè)置為true,如下所示:

          select 標(biāo)簽

          此標(biāo)記呈現(xiàn)HTML“select”元素,它支持?jǐn)?shù)據(jù)綁定到所選選項(xiàng)以及使用嵌套選項(xiàng)和標(biāo)記。示例如下:

          選擇一個(gè)Skill,則可能HTML代碼如下:

          option 標(biāo)簽

          此標(biāo)記呈現(xiàn)HTML “option”,它根據(jù)綁定值設(shè)置“selected”,如下:

          如果選擇了 “Gryffindor”,則相應(yīng)的代碼如下:

          options 標(biāo)簽

          此標(biāo)記呈現(xiàn)HTML 'option'標(biāo)記的列表,它根據(jù)綁定值設(shè)置“selected”屬性,如下:

          實(shí)際生成的HTML代碼有可能是這樣:

          textarea 標(biāo)簽

          此標(biāo)記呈現(xiàn)HTML “textarea”,如下:

          hidden 標(biāo)簽

          此標(biāo)記使用綁定值呈現(xiàn)類型為“hidden”的HTML“input”標(biāo)記,如下:

          errors 標(biāo)簽

          此標(biāo)記在HTML “span”標(biāo)記中呈現(xiàn)字段錯(cuò)誤,它可以訪問(wèn)控制器中創(chuàng)建的錯(cuò)誤或由與控制器關(guān)聯(lián)的任何驗(yàn)證器創(chuàng)建的錯(cuò)誤。假設(shè)我們希望在提交表單后顯示firstName和lastName字段的所有錯(cuò)誤消息,有一個(gè)名為UserValidator的User類實(shí)例的驗(yàn)證器,如下:

          form.jsp 代碼如下:

          如果firstName和lastName字段中有一個(gè)為空,那么提交后的是HTML是這樣:

          如果想顯示給定頁(yè)面的整個(gè)錯(cuò)誤列表怎么辦? 下面的示例顯示errors標(biāo)記還支持一些基本的通配符功能。path=“*”顯示所有錯(cuò)誤; path=“l(fā)astName”顯示與lastName字段關(guān)聯(lián)的所有錯(cuò)誤; 僅顯示對(duì)象錯(cuò)誤。下面的示例將在頁(yè)面頂部顯示錯(cuò)誤列表,然后是字段旁邊的特定錯(cuò)誤:

          生成的HTML代碼如下:

          HTML5 標(biāo)簽

          從Spring 3開(kāi)始,Spring表單標(biāo)記庫(kù)允許輸入動(dòng)態(tài)屬性,這意味著可以輸入任何HTML5特定屬性。在Spring 3.1中,表單輸入標(biāo)記支持輸入“text”以外的type屬性。這旨在允許呈現(xiàn)新的HTML5特定輸入類型,例如“email”,“date”,“range”等。請(qǐng)注意,不需要輸入type='text',因?yàn)?text'是默認(rèn)類型。

          文主要分享了對(duì)整合jsp的springboot項(xiàng)目打jar包,如何正確的配置maven pom。

          一、項(xiàng)目結(jié)構(gòu)

          二、打包配置

          1.pom.xml添加spring-boot-maven-plugin配置

          如果只是普通的項(xiàng)目打包,上面的配置足夠了,但是帶src/main/webapp的打包,還不行,會(huì)發(fā)現(xiàn)src/main/webapp的內(nèi)容都沒(méi)有打進(jìn)jar包

          2.pom.xml添加配置resources配置

          這個(gè)配置可將src/main/webapp打包到j(luò)ar包中,但是這個(gè)jar包還不能讓jsp正常訪問(wèn)

          注:如果沒(méi)有配置<targetPath>META-INF/resources</targetPath>,src/main/webapp的內(nèi)容會(huì)保存到BOOT-INF/ 目錄下。經(jīng)測(cè)試,jsp頁(yè)面無(wú)法正常訪問(wèn),需要指定到META-INF/resources才能正常訪問(wèn)

          3.spring-boot-maven-plugin的版本指定為1.4.2.RELEASE

          springboot官方推薦的前端模板引擎是thymeleaf,所以對(duì)于jsp的支持可能存在兼容性。1.4.2.RELEASE是經(jīng)過(guò)測(cè)試出來(lái)。具體原因未知,不過(guò)確實(shí)可用。

          如果項(xiàng)目中沒(méi)有多個(gè)main方法,mainClass可以不配置

          4.最終版配置


          怎么樣?如果你覺(jué)得有用的話,還不快快收藏起來(lái)!!!


          附:涉及的代碼目錄

          gitee:https://gitee.com/jq_di/springcloud-template


          主站蜘蛛池模板: 相泽南亚洲一区二区在线播放| 亚洲欧美成人一区二区三区| 国产精品无码一区二区三区电影| 亚拍精品一区二区三区| 日本免费一区尤物| 蜜臀AV一区二区| 国产在线无码一区二区三区视频| 免费人妻精品一区二区三区| 成人精品一区二区户外勾搭野战| 夜夜嗨AV一区二区三区| 国产一区二区精品久久凹凸| 亚洲成av人片一区二区三区 | 精品乱子伦一区二区三区| 精品国产一区二区三区久| 亚洲av乱码一区二区三区| 中文字幕在线看视频一区二区三区| 久久久久国产一区二区三区| 亚洲国产一区明星换脸| 国产成人av一区二区三区不卡| 久久se精品动漫一区二区三区| 久久99国产精品一区二区| 久久久久久免费一区二区三区| 中文字幕一区在线观看| 中文字幕一区在线观看| 成人国内精品久久久久一区| 天堂Aⅴ无码一区二区三区| 熟女少妇丰满一区二区| 国产精品va无码一区二区| 国产区精品一区二区不卡中文| 国产一区二区三区免费观在线| 中文字幕一区二区三区免费视频 | 无码国产精品一区二区免费vr| 国语精品一区二区三区| 91精品国产一区| 亚洲综合av一区二区三区| 欧洲精品一区二区三区| 亚洲日本一区二区一本一道| 国产日韩AV免费无码一区二区| 亚洲美女一区二区三区| 欧美激情国产精品视频一区二区| 国产第一区二区三区在线观看|