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
隨著異步 I/O 和 Netty 等框架的流行,響應(yīng)式編程逐漸走入大眾的視野。但是,響應(yīng)式編程本身并不是太新的概念,這個術(shù)語最早出現(xiàn)在 1985 年 David Harel 和 Amir Pnueli 的論文“響應(yīng)式系統(tǒng)的開發(fā)”之中,他們對復(fù)雜計算機(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)則會持續(xù)受到外部環(huán)境的刺激,它們的角色就是持續(xù)響應(yīng)刺激。在構(gòu)建響應(yīng)式 Web 服務(wù)上,Spring 5 中引入了全新的編程框架,那就是 Spring WebFlux。作為一款新型的 Web 服務(wù)開發(fā)框架,它與傳統(tǒng)的 WebMVC 相比具體有哪些優(yōu)勢呢?
介紹
Spring WebFlux 作為一個響應(yīng)式 (reactive-stack) web 框架補(bǔ)充,在 5.0 的版本開始加入到 Spring 全家桶。這是一個完全非阻塞的,支持 Reactive Streams, 運行在諸如 Netty, Undertow, 以及 Servlet 3.1+ 容器上的,Spring WebFlux 構(gòu)建在 Reactor 框架之上,提供了基于注解和函數(shù)式兩種方式來配置和運行。Spring WebFlux 可以讓你使用更少的線程去處理并發(fā)請求,同時能夠讓你使用更少的硬件資源來拓展你的應(yīng)用。WebFlux 使用Netty作為默認(rèn)的web服務(wù)器,其依賴于非阻塞IO,并且每次寫入都不需要額外的線程進(jìn)行支持。也可以使用Tomcat、Jetty容器,不同與SpringMVC依賴于Servlet阻塞IO,并允許應(yīng)用程序在需要時直接使用Servlet API,WebFlux依賴于Servlet 3.1非阻塞IO。使用Undertow作為服務(wù)器時,WebFlux直接使用Undertow API而不使用Servlet API。
特點
場景
WebFlux 用于構(gòu)建響應(yīng)式 Web 服務(wù)。微服務(wù)架構(gòu)的興起為 WebFlux 的應(yīng)用提供了一個很好的場景。我們知道在一個微服務(wù)系統(tǒng)中,存在數(shù)十乃至數(shù)百個獨立的微服務(wù),它們相互通信以完成復(fù)雜的業(yè)務(wù)流程。這個過程勢必會涉及大量的 I/O 操作,尤其是阻塞式 I/O 操作會整體增加系統(tǒng)的延遲并降低吞吐量。如果能夠在復(fù)雜的流程中集成非阻塞、異步通信機(jī)制,我們就可以高效處理跨服務(wù)之間的網(wǎng)絡(luò)請求。針對這種場景,WebFlux 是一種非常有效的解決方案。控制層一旦使用 Spring WebFlux,它下面的安全認(rèn)證層、數(shù)據(jù)訪問層都必須使用 Reactive API。其次,Spring Data Reactive Repositories 目前只支持 MongoDB、Redis 和 Couchbase 等幾種不支持事務(wù)管理的 NOSQL。技術(shù)選型時一定要權(quán)衡這些弊端和風(fēng)險。
響應(yīng)式編程
響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式,這意味著可以在編程語言中很方便地表達(dá)靜態(tài)或動態(tài)的數(shù)據(jù)流,而相關(guān)的計算模型會自動將變化的值通過數(shù)據(jù)流進(jìn)行傳播,電子表格程序就是響應(yīng)式編程的。
響應(yīng)式應(yīng)用應(yīng)該具備如下的四個特點:
并發(fā)模型
WebFlux模型主要依賴響應(yīng)式編程庫Reactor,Reactor 有兩種模型,F(xiàn)lux 和 Mono,提供了非阻塞、支持回壓機(jī)制的異步流處理能力。WebFlux API接收普通Publisher作為輸入,在內(nèi)部使其適配Reactor類型,使用它并返回Flux或Mono作為輸出。
介紹
SpringMvc是一種基于java的實現(xiàn)Mvc設(shè)計模式的請求驅(qū)動類型的輕量級web框架,屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow中,SpringMvc已經(jīng)成為目前最主流的MVC框架之一,并且隨著Spring3.0的發(fā)布,全面超越Struts2,成為最優(yōu)秀的mvc框架,他通過一套注解,讓一個簡單的java類成為處理請求的控制器,他無需實現(xiàn)任何接口,同時他還支持RESTful編程風(fēng)格的請求。
特點
MVC
Spring web MVC框架提供了MVC(模型 - 視圖 - 控制器)架構(gòu)和用于開發(fā)靈活和松散耦合的Web應(yīng)用程序的組件。 MVC模式導(dǎo)致應(yīng)用程序的不同方面(輸入邏輯,業(yè)務(wù)邏輯和UI邏輯)分離,同時提供這些元素之間的松散耦合。
并發(fā)模型
servlet由servlet container進(jìn)行生命周期管理。container啟動時構(gòu)造servlet對象并調(diào)用servlet init()進(jìn)行初始化;container關(guān)閉時調(diào)用servlet destory()銷毀servlet;container運行時接受請求,并為每個請求分配一個線程(一般從線程池中獲取空閑線程)然后調(diào)用service()。
處理請求的時候同步操作,一個請求對應(yīng)一個線程來處理,并發(fā)上升,線程數(shù)量就會上漲(上線文切換,內(nèi)存消耗大)影響請求的處理時間。現(xiàn)代系統(tǒng)多數(shù)都是IO密集的,同步處理讓線程大部分時間都浪費在了IO等待上面。雖然Servlet3.0后提供了異步請求處理與非阻塞IO支持,但是使用它會遠(yuǎn)離Servlet API的其余部分,比如其規(guī)范是同步的(Filter, Servlet)或阻塞的(getParameter,getPart),而且其對響應(yīng)的寫入仍然是阻塞的。
Spring WebFlux 不是 Spring MVC 的替代方案,Spring WebFlux 是 Spring Framework 5.0中引入的新的響應(yīng)式web框架。與Spring MVC不同,它不需要Servlet API,是完全異步且非阻塞的,并且通過Reactor項目實現(xiàn)了Reactive Streams規(guī)范。Spring MVC依然構(gòu)建在 Servlet API 以及 Servlet 容器之上;Spring Security 為兩種不同的技術(shù)棧提供了安全性的支持,Spring Data 分別為兩種不同的技術(shù)棧實現(xiàn)了 Repository;在數(shù)據(jù)訪問方面,響應(yīng)式 Repository 已經(jīng)涵蓋了 Mongo、Cassandra、Redis 以及 Couchbase。但是在關(guān)系型數(shù)據(jù)庫方面,因為 JBDC 規(guī)范本身就是阻塞式的,所以進(jìn)展并不明顯。但是,像 PostgreSQL 和 MySQL 已經(jīng)有了異步驅(qū)動。異步非阻塞并不會使程序運行得更快。WebFlux 并不能使接口的響應(yīng)時間縮短,它僅僅能夠提升吞吐量和伸縮性。Spring WebFlux 是一個異步非阻塞的 Web 框架,所以,它特別適合應(yīng)用在 IO 密集型的服務(wù)中,比如微服務(wù)網(wǎng)關(guān)這樣的應(yīng)用中。
pring MVC的表單標(biāo)簽為Java程序員提供了許多額外的支持。例如數(shù)據(jù)綁定,允許自動設(shè)置數(shù)據(jù)并從Java對象中檢索數(shù)據(jù)。
從2.0版本開始,Spring提供了一組全面的數(shù)據(jù)綁定感知標(biāo)記,用于在使用JSP和Spring Web MVC時處理表單元素。每個標(biāo)記都支持其相應(yīng)HTML標(biāo)記對應(yīng)的屬性集,使標(biāo)記熟悉且直觀易用。標(biāo)記生成的HTML符合HTML 4.01 / XHTML 1.0 標(biāo)準(zhǔn)。
在本文中我們會瀏覽所有這些表單標(biāo)簽,并查看每個標(biāo)簽的使用方式。
表單標(biāo)記庫被捆綁在spring-webmvc.jar中,庫描述符稱為spring-form.tld。
要使用此庫中的標(biāo)記,請將以下指令添加到JSP頁面的頂部:
此標(biāo)記呈現(xiàn)HTML“form”標(biāo)記,并公開內(nèi)部標(biāo)記的綁定路徑以進(jìn)行綁定。 它將命令對象放在PageContext中,以便內(nèi)部標(biāo)記可以訪問命令對象。 此庫中的所有其他標(biāo)記都是表單標(biāo)記的嵌套標(biāo)記。
假設(shè)我們有一個名為User的域?qū)ο蟆K且粋€JavaBean,具有firstName和lastName等屬性。我們將它用作表單控制器的表單支持對象,它返回form.jsp。如下所示:
firstName和lastName值是從頁面控制器放置在PageContext中的命令對象中檢索的。加載表單時,Spring MVC將對user.getFirstName()和getLastName()(getter方法)進(jìn)行分類。提交表單時,Spring MVC將調(diào)用user.setFirstName()和user.setLastName()方法。 生成的HTML看起來是這樣:
input 標(biāo)記默認(rèn)使用綁定值和type='text'呈現(xiàn)HTML 'input'標(biāo)記,舉個例子:
生成的HTML代碼如下所示:
此標(biāo)記呈現(xiàn)帶有“checkbox”類型的HTML “input”標(biāo)記,例如:
生成的代碼如下所示:
此標(biāo)記呈現(xiàn)多個帶有“checkbox”類型的HTML “input”標(biāo)記,示例如下:
此標(biāo)記呈現(xiàn)帶有“radio”類型的HTML “input”標(biāo)記,典型的使用模式將涉及綁定到同一屬性但具有不同值的多個標(biāo)記實例:
此標(biāo)記呈現(xiàn)多個帶有“radio”類型的HTML “input”標(biāo)記,例如:
此標(biāo)記使用綁定值呈現(xiàn)帶有“password”類型的HTML “input”標(biāo)記,如下:
請注意,默認(rèn)情況下,密碼值不會顯示。如果您確實需要顯示密碼值,請將“showPassword”屬性的值設(shè)置為true,如下所示:
此標(biāo)記呈現(xiàn)HTML“select”元素,它支持?jǐn)?shù)據(jù)綁定到所選選項以及使用嵌套選項和標(biāo)記。示例如下:
選擇一個Skill,則可能HTML代碼如下:
此標(biāo)記呈現(xiàn)HTML “option”,它根據(jù)綁定值設(shè)置“selected”,如下:
如果選擇了 “Gryffindor”,則相應(yīng)的代碼如下:
此標(biāo)記呈現(xiàn)HTML 'option'標(biāo)記的列表,它根據(jù)綁定值設(shè)置“selected”屬性,如下:
實際生成的HTML代碼有可能是這樣:
此標(biāo)記呈現(xiàn)HTML “textarea”,如下:
此標(biāo)記使用綁定值呈現(xiàn)類型為“hidden”的HTML“input”標(biāo)記,如下:
此標(biāo)記在HTML “span”標(biāo)記中呈現(xiàn)字段錯誤,它可以訪問控制器中創(chuàng)建的錯誤或由與控制器關(guān)聯(lián)的任何驗證器創(chuàng)建的錯誤。假設(shè)我們希望在提交表單后顯示firstName和lastName字段的所有錯誤消息,有一個名為UserValidator的User類實例的驗證器,如下:
form.jsp 代碼如下:
如果firstName和lastName字段中有一個為空,那么提交后的是HTML是這樣:
如果想顯示給定頁面的整個錯誤列表怎么辦? 下面的示例顯示errors標(biāo)記還支持一些基本的通配符功能。path=“*”顯示所有錯誤; path=“l(fā)astName”顯示與lastName字段關(guān)聯(lián)的所有錯誤; 僅顯示對象錯誤。下面的示例將在頁面頂部顯示錯誤列表,然后是字段旁邊的特定錯誤:
生成的HTML代碼如下:
從Spring 3開始,Spring表單標(biāo)記庫允許輸入動態(tài)屬性,這意味著可以輸入任何HTML5特定屬性。在Spring 3.1中,表單輸入標(biāo)記支持輸入“text”以外的type屬性。這旨在允許呈現(xiàn)新的HTML5特定輸入類型,例如“email”,“date”,“range”等。請注意,不需要輸入type='text',因為'text'是默認(rèn)類型。
文主要分享了對整合jsp的springboot項目打jar包,如何正確的配置maven pom。
1.pom.xml添加spring-boot-maven-plugin配置
如果只是普通的項目打包,上面的配置足夠了,但是帶src/main/webapp的打包,還不行,會發(fā)現(xiàn)src/main/webapp的內(nèi)容都沒有打進(jìn)jar包
2.pom.xml添加配置resources配置
這個配置可將src/main/webapp打包到j(luò)ar包中,但是這個jar包還不能讓jsp正常訪問
注:如果沒有配置<targetPath>META-INF/resources</targetPath>,src/main/webapp的內(nèi)容會保存到BOOT-INF/ 目錄下。經(jīng)測試,jsp頁面無法正常訪問,需要指定到META-INF/resources才能正常訪問
3.spring-boot-maven-plugin的版本指定為1.4.2.RELEASE
springboot官方推薦的前端模板引擎是thymeleaf,所以對于jsp的支持可能存在兼容性。1.4.2.RELEASE是經(jīng)過測試出來。具體原因未知,不過確實可用。
如果項目中沒有多個main方法,mainClass可以不配置
4.最終版配置
怎么樣?如果你覺得有用的話,還不快快收藏起來!!!
附:涉及的代碼目錄
gitee:https://gitee.com/jq_di/springcloud-template
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。