版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
反應式Web開發(fā)框架第1章WebFluxWebFlux簡SpringWebFluxisanon-blockingwebframeworkbuiltfromthegrounduptotakeadvantageofmulti-core,next-generationprocessorsandhandlemassivenumbersofconcurrent打開Spring官網(wǎng),可以看到WebFlux參考文檔地址翻譯web框架包含在Spring框架中,即SpringWebMVCServletAPIServlet容器構(gòu)建的reactivestack,webframework,SpringWebFlux被添加到了Spring5.0版本中。ReactiveStreamsNettyUndertow與Server3.1+兩個Web框架都反映了它們源模塊的名稱:spring-webmvcspring-webflux,并且它們共存于Spring框架之中。每一個模塊都是可選的。應用程序可以選擇一個或另一個模塊,或者在某些情況下兩個同時使用。例如,SpringMVC使用反應式Web客戶端進行控制。第一個WebFlux程創(chuàng)建工SpringStarterProject,SpringBoot2.0.0。不要添加原來的web依賴,添加ReactiveWeb,即flux依賴,并添加上Lombok與DevTools依賴定義處理器通過瀏覽器地址欄,并沒有感覺有任何的區(qū)別修改處理器添加一個耗時操作方法添加@Slf4j添加兩個處理器方法再通過瀏覽器地址欄,對于客戶端來說感覺是一樣的,都是在等待了大約5秒后才獲得普通處理器仔細查看這兩個時間差,發(fā)現(xiàn)其差值大約為5秒。即耗時操作阻塞了處理器5(2)mono處理修改處理器-FluxMono表示,處理器返回的數(shù)據(jù)為0-1個;而Flux表示,處理器返回的數(shù)據(jù)為0-多個(1)方以下測試均使用如下的URL,且不要使用火狐瀏覽器,而要使用谷歌或360瀏覽器。數(shù)組集合 底層不會阻塞處理器執(zhí)行從對耗時操作的執(zhí)行時間上可以看出,其并沒有阻塞處理器方法的執(zhí)行。SSE,Server- Event,服務端推送,后面會詳細學習通過前面的第一個WebFlux程序我們可以真切地體會到“非阻塞”“異步”。為了進一步底阻塞了什么?異步Servlet到底對客戶端與服務端的影響是什么?(1)定義同(2)同步在瀏覽器同步Servlet時,瀏覽器會出現(xiàn)等待5秒時間后才可以看到“Done!”字樣的情況。但關(guān)鍵是控制臺的輸出,業(yè)務邏輯耗時為5秒左右。創(chuàng)建異在創(chuàng)建異步Servlet的向?qū)е泄催x“異步支持”定義異異步在瀏覽器異步Servlet時,瀏覽器同樣會出現(xiàn)等待5秒時間后才可以看到“Done!”字樣的情況。但關(guān)鍵是控制臺的輸出,業(yè)務邏輯耗時為5毫秒左右。分同步Servlet阻塞了什么當請求到達Tomcat后,Tomcat會為其找到與該請求相匹配的Servlet,并分配一個該ServletServletServlet線程會被阻塞。所以當前Servlet中的業(yè)務邏輯阻塞了當前Servlet線程的執(zhí)行。異步Servlet是怎樣工作的?異步Servlet沒有阻塞Servlet線程,而是很快結(jié)束了Servlet線程的調(diào)用,將其又放入到了Servlet線程池,供其它請求使用。這樣就增加了Tomcat服務器的吞吐量了。不過需要注意一點,雖然沒有阻塞Selet線程的運行,但服務端向客戶端的響應是需到服務器運算速度的加快,但服務器的吞吐量增加了。反應式流編程中經(jīng)常與SSE相結(jié)合使用,所以我們這里學下SSE相關(guān)知識老的http對于某些實時性要求比較高的需求(例如消息推送),若使用這種原始的請求-響應方式實現(xiàn)起來是比較麻煩的。HTML5標準中新增了一個(eve-ntvnt件,可以方便地做到消息實時推送,即一次請求后會不斷的獲得多個響應。由于這是特性,主流瀏覽器對其支持是較好的(除了火狐。SSESSE時 可以做到不需要用戶執(zhí)行任何操作便可以完成例如要做一個統(tǒng)計系統(tǒng)的管理,我們想知道統(tǒng)計數(shù)據(jù)的實時情況。類似這種更新頻繁、低延遲的場景,SSE可以完全滿足。再比如,郵箱服務的新郵件提醒,的新消息推送、在線的顯示等,SSE都是不錯的選擇。SSE對比SSE是單向通道,只能服務器向客戶端發(fā)送消息,如果客戶端需要向服務器發(fā)送消息,HTTPWebSocket的雙工通道來說,會有更大的開銷。這么WebSocket56次的話,其實這個SSE技術(shù)規(guī)SSEHTML5JavaScriptEventSource通訊協(xié)這個通訊協(xié)議是基于純文本的簡單協(xié)議。服務器端的響應內(nèi)容類型必須是“text/event-stream”。響應文本的內(nèi)容是一個流,流是一個簡單的文本流,僅支UTF-8流由不同的組成。不同間通過僅包含回車符和換行符的空行(“\r\n”)行分隔,冒號前的為類型,冒號后的為其對應的值。每個可以包含如下類型的行:類型為data,表示該行是所包含的數(shù)據(jù)。以data開頭的行可以出現(xiàn)多次。所有類型為event,表示該行用來的類型,即名稱。瀏覽器在收到數(shù)據(jù)時,會產(chǎn)生對稱的。類型 id,表示該行用來的標識符類型 retry,表示該行用來瀏覽器在連接斷開之后進行重連的等待時間//data:id://event://id::thisisadata:shenzhen id有什如果服務端發(fā)送的中包含標識id,那么瀏覽器會將最近一次接收到的標連接時,會將Last-Event-ID記錄的標識id發(fā)送給服務端。服務器端通過瀏覽器端發(fā)送的標識id來確定將繼續(xù)連接哪個。EventSource對于服務端發(fā)送的帶有的響應,瀏覽器需要在JavaScript中使用EventSource對象進行處理。EventSource使用的是標準的器方式(注意,這里的并不是響應中所帶的,而是瀏覽器上所發(fā)生的。當相應的發(fā)生時,只需使EventSource對象調(diào)用相應的處理方法即可。EventSource提供了三個標準SSE創(chuàng)建一個普通的動態(tài) 工程,無需其它依賴不過,在測試時使用的瀏覽器,不要使用火狐,看不到效果,可以使用谷歌定義并定義Servlet的目的主要是用于對比,對比一下使用SSE前后,瀏覽器的區(qū)別BC、Servlet運分別在瀏覽器兩個Servlet,可以看到兩種不同的效果:對CommonServlet的是,瀏覽器會被阻塞,然后一下將所有數(shù)據(jù)顯示;對SomeSseServlet的是,瀏覽器會逐條顯示數(shù)據(jù),未出現(xiàn)阻塞現(xiàn)象。這個逐條顯示的內(nèi)容即為流中的內(nèi)容。再定義并A僅添加了一行內(nèi)容:指定名稱B、Servlet運對 的是,瀏覽器會逐條顯示數(shù)據(jù),未出現(xiàn)阻塞現(xiàn)象。 的效果相同,但流內(nèi)容多了名稱定義并AB、打開瀏覽器后,12打開開發(fā)者,在其中找到Cnle控制臺,可看到接收到的服務端發(fā)送來的內(nèi)容。當然,對于這些數(shù)據(jù)怎么使用,那就要看程序員對于JS的掌握程度了。定義并AB、ReactiveStream推拉模型與背壓在流處理機制中,pu(推送模型和l(拉取模型是最常見的。push模型中,發(fā)布者將元素主動推送給訂閱者。而pll當訂閱者比發(fā)布者快時,會出現(xiàn)訂閱者無消息可消費的情況。在同步數(shù)據(jù)處理機制中訂閱,情并對統(tǒng)產(chǎn)響。當發(fā)布者比訂閱者快時,有兩大類解決方案另一類解決方案是改變發(fā)布者。這類解決方案采用的策略稱為背壓(BckPresure)策略。訂閱者告訴發(fā)布者讓其減慢發(fā)布速度并保持消息,直到訂閱者準備好處理消息。使用背壓策略可確保較快的發(fā)布者不會較慢的訂閱者。但該解決方案要求發(fā)布者要擁有反應式反應式流從2013年開始,作為提供非阻塞背壓的異步流處理標準的倡議,旨在解決處理元素流(即消息流、數(shù)據(jù)流的問題——如何將元素流從發(fā)布者傳遞到訂閱者,而不需要發(fā)布者阻塞,或訂閱者有的緩沖區(qū)或丟棄。發(fā)送多個或稍少的元素。反應式流會在pull模型和push模型流處理機制之間動態(tài)切換。當發(fā)pullpush模型。即誰慢2015年了用于處理反應式流的規(guī)范和JavaAPIJDK與反應式流的關(guān) 是一種數(shù)據(jù)處理機制,是一種思想,一套解決方案。JDK使用Flow義了這種規(guī)范,該規(guī)范中僅包含四個接口(后面講。這套規(guī)范最初是定義在JDK9JDK9曇花一現(xiàn),不到一年時間Oracle已經(jīng)不提供JDK9的支持與了,并建議JDK9的用戶使用JDK10,所以可以說,ReactiveStreamJDK10的特性。故,后面編程使用的Eclipse版本要是版本的,例如photon版本的Eclipse反應式流接口在JDK中Flow類中了四個反應式流接口Publisher<T>接口Publisher,即發(fā)布者,是有序消息的生產(chǎn)者。它根據(jù)收到的請求向訂閱者發(fā)布消息。Subscriber<T>接口Subscriber,即訂閱者,從發(fā)布者那里訂閱并接收消息。發(fā)布者向訂閱者發(fā)送訂閱令牌(bscipin。使用訂閱令牌,訂閱者可以從發(fā)布者那里請求多個消息。當消息元素準備就或取消訂閱。一個發(fā)布者可能需要處理來自多個訂閱者的請求。Subscriptionbscripin(訂閱費),訂閱令牌。當訂閱請求成功時,發(fā)布者將其傳遞給訂閱者。訂閱者使用訂閱令牌與發(fā)布者進行交互,例如請求的消息元素或取消訂閱。三個接口的關(guān)系Processor<T,R>接Processor,即處理器,充當訂閱者和發(fā)布者的處理階段。Processor接口繼承了Publisher和Subscriber接口。它用于轉(zhuǎn)換發(fā)布者/訂閱者管道中的元素。Processor<T,R>會將來自于發(fā)布T類型的消息數(shù)據(jù),接收并轉(zhuǎn)換為R類型的數(shù)據(jù),并將轉(zhuǎn)換后的R類型數(shù)據(jù)發(fā)布給訂閱“發(fā)布-訂閱”模式反應式流編程項目:reactiveStream定義訂閱者定義測試類“發(fā)布-處理-訂閱”模式響應流編程這里要使用處理器Processor50的消息過濾掉,并將小50的Integer消息轉(zhuǎn)換為String后發(fā)布給訂閱者。項目:reactiveStream2。該項目直接前面的reactiveStream項目,然后面項目修改測試類定義處理器類該類可以直接訂閱者類,并在訂閱者類基礎上進行修改。主要修改了onNext()方法及修改訂閱者類訂閱者類主要是修改了其泛型,由Integer修改為了String。其它代碼第2章WebFlux需求:通過WebFlux實現(xiàn)對MongoDB的CRUDWebFlux不支持RDBMS(關(guān)系型數(shù)據(jù)庫管理系統(tǒng)NoSQL中選擇。Redis是鍵值對型的內(nèi)存數(shù)據(jù)庫,而MongoDB則與關(guān)系型數(shù)據(jù)庫更為相近,其也存在表的概念。所以我們這里選擇使用MongoDB。對于該功能的實現(xiàn),采用了兩種實現(xiàn)方式:使用傳統(tǒng)處理器開發(fā),與使用 開發(fā)使用傳統(tǒng)處理器開發(fā)使用傳統(tǒng)處理器開發(fā),指的是使用 注解的類作為處理器類,使@RequestMap進行請求與處理器方法映射,來開發(fā)WebFlux的方式基本結(jié)構(gòu)搭建創(chuàng)建工SpringStarterProject,SpringBoot2.0.0。不要添加原來的web依賴,添加ReactiveWeb,即flux依賴,并添加上Lombok與DevTools依賴。另外,再添加上ReactiveMongoDB依賴。修改啟動類定義實體類定義處理器當處理器方法返回 時,一般我們都會定義兩種數(shù)據(jù)返回形式:返回,與實時性定義Repository接數(shù)據(jù)庫連接配置這是mongoDB的數(shù)據(jù)庫連接,其中test為要連接的數(shù)據(jù)庫名測使用Chrome瀏覽器的 在提交了 請求后,可以看以下內(nèi)容說明前面的工作成功CURD的實添加對需要注意,在REST協(xié)議中,添加操作需要使用POST請求提交方式,所以這對于Spring-Data-JPA中的save()id屬性為Null,則save()為添加操作,底層執(zhí)行insertinto語句;若參數(shù)對象的id屬性不Null,則save()為修改操作,底層執(zhí)行update語句。B在選擇了POST提交后,在請求體BODY中寫入JSON數(shù)據(jù)。注意,標準的JSON的字符 看到如下響應說明添加成C改處理器(Form表單在處理器中添加如下處理器方法。由于數(shù)據(jù)來自于表單而非JSON,所以參數(shù)中無需添加@RequetBoy。D、測無狀態(tài)數(shù)據(jù)刪除200,我們無法對于執(zhí)行刪除操作的處理器方法,其可以是沒有返回值的Spring-Data- 的方法是沒有返回值,但在 編程中需要將其包裝為Mono,但泛型為Void需要注意,在REST協(xié)議中,刪除操作需要使用DELETE請求提交方式,所以這@DeleteMap注解B試(刪除存在的數(shù)據(jù)操作請求,找到添加數(shù)據(jù)的請求,點擊后從RESPONSE中可以看到那次添加數(shù)據(jù)的id。b刪除數(shù)提交刪除請求后,響應碼為200C、測試(刪除不存在的數(shù)據(jù)將請求id隨便修改一下再次提交請求,其響應碼仍為200有狀態(tài)數(shù)據(jù)刪除200,否則返回404。通過響應碼就可以判斷刪除操作是否成功。編寫該處理器的思路是:首先根據(jù)id對該對象進行查詢,若存在則先將該查詢結(jié)果刪除,然后再將其映射為狀態(tài)碼200;若不存在,則將查詢結(jié)果映射為狀態(tài)碼404。對于該處理器,需要注意以下幾點ResponseEntity可以封裝響應體中所攜帶的數(shù)據(jù)及響應碼,其泛型用于指定攜帶數(shù)據(jù)的類型。若響應體中沒有攜帶數(shù)據(jù),則泛型為Void。本例中要返回的ResponseEntity中僅封裝了響應碼不攜帶任何數(shù)據(jù),所以泛型為Void。響應碼只能采用HttpStatus枚舉類型常量表示,這是ResponseEntity的構(gòu)造器所要求的。為什么做映射時使用flatMp(),不使用map()?首先這兩個方法都是Mno的方法,不是tream的方法,與tream的兩個同名方法無關(guān),但均是做映射的。若需要對對象數(shù)據(jù)先執(zhí)行操作后再做映射,則使用flatMp();若純粹是一種數(shù)據(jù)映射,沒有數(shù)據(jù)操作,則使用mp()。Mono的訪求中,對于沒有返回值的方法,若想為其添加返回值,則可鏈式調(diào)用方法,由then()方法返回想返回的值。對于本例,由于Spring-Data-JPA的delete()方法沒有返回值,所以這里使用then()為其添加返回值。B試(刪除存在的數(shù)據(jù)C、測試(刪除不存在的數(shù)據(jù)再次提交前面的刪除請求即可,因為該對象已經(jīng)在上次請求時被刪除了。修改數(shù)需要注意,在REST協(xié)議中,修改操作需要使用PUT請求提交方式,所以這里的對象數(shù)據(jù);若指定的id對象不存在,則返404。B試(修改存在的數(shù)據(jù)首先插入一條新的數(shù)據(jù),查看其id及其它屬性值這里準備要將其修改為“”“24提交修改該對象的請求,查看修改后的結(jié)果,發(fā)現(xiàn)id未變,但數(shù)據(jù)已經(jīng)變化,且響應200。C、測試(對于不存在的數(shù)據(jù)提交修改將請求中的 隨意修改為不存在的id,然后提交修改請求,可以看到響應碼為404id需要注意,在REST協(xié)議中,查詢操作需要使用GET請求提交方式,所以這里@GetMap注解對于執(zhí)行根據(jù)id進行查詢操作的處理器方法,我們可以這定義其返回值:若有查詢結(jié)果,則返回查詢到的對象數(shù)據(jù);若沒有查詢結(jié)果,則返回404。B試(查找存在的對象一個剛完成插入操作的對象的id進行查詢C、測試(查詢不存在的對象隨意修改查詢請求中的 后進行查詢根據(jù)上下限查前面的查詢,要么是查詢所有,與字段無關(guān),要么是根據(jù)id查詢,而id屬性屬于業(yè)務無關(guān)屬性。這些查詢在Spring-Data-JPA的Repository接口中已經(jīng)定義好了,可以直接使用。但就像根據(jù)、等字段進行查詢,Repository接口中就不可能事先定義好,因為這些這些業(yè)務相關(guān)字段的查詢,需要程序員在自定義的Repository接口中自己,然后 會根據(jù)指定的字段名稱自動實現(xiàn)該方法。在其中添加一C、測試(返回D、測試(實時性返回使用MongoDB的原始查詢語句在命令行窗口中何 下鍵入mongo命令,打開Mongo 窗口查看指定表中放大后為:查尋大于等于22且小于等于28的所有學生在接口中添加如下抽象方D、測試(返回E試(實時性返回參數(shù)校為了保證數(shù)據(jù)在進入到業(yè)務運算時的正確性,一般我們會對參數(shù)首先進行校驗。例如,我們需要使tdnt的name值不能是adin或dminitatr,則可自己定義校驗邏輯。自定義校驗邏輯在校驗切面類中添加如下異常處D、修改處理修改具有Student類型參數(shù)的處理器方法,即兩個添加數(shù)據(jù)方法,及修改數(shù)據(jù)方法,在情使用Hibernate注解校Hibernate 中已經(jīng)定義好了很多通用的校驗注解,我們可以直接使用a實體類在要驗證的屬性上添加相修改具有Student類型參數(shù)的處理器方法,即兩個添加數(shù)據(jù)方法,及修改數(shù)據(jù)方法的參數(shù)上添加@Valide注解。測試添加與修改。提交正常數(shù)據(jù),運行成功,返回 200前面驗證失敗的結(jié)果是400異常,但并沒有是哪個屬性出現(xiàn)了異常,出現(xiàn)了什么異常。對于該切面類的定義,需要注意以下幾點:由于getFieldErrors()方法獲取到的是一個List集合,所以stream()后的流就是一個集合數(shù)據(jù)mp()方法用于將集合數(shù)據(jù)流中的每一個元素,即異常對象映射為字符串形式:發(fā)生異常的屬性名加指定的異常信息。mp()的最終結(jié)果仍為一個集合流,只不過集合流中的元素由異常對象變?yōu)榱俗址?。但這里需要的最終結(jié)果不是字符串集合,而是一個字符串,所以需要使用ece()將集合流縮減為一個字符串。ruce()的第一個參數(shù)為默認值,即在流中元素為空時所使用的值,可以避免異常的拋出。第二個參數(shù)為BinarOeatr,兩個輸入一個輸出,且類型相同。由兩個輸入最終變?yōu)榱艘粋€輸出,就達到了縮減educe的效果了。b情每一個Hibernate校驗注解均有一個message屬性,用于設置驗證失敗后的提注適用的數(shù)據(jù)類說Boolean,Boolean,BigDecimal,BigInteger,String,byte,short,int,longandtherespectivewrappersoftheprimitivetypes.AdditionallysupportedbyHV:anysub-typeofNumber驗證注解的元素值小于等于@DecimalMax指value值BigDecimal,BigInteger,String,byte,short,int,longandtherespectivewrappersoftheprimitivetypes.AdditionallysupportedbyHV:anysub-typeofNumber驗證注解的元素值小于等于@DecimalMin指value值整數(shù)位數(shù),fraction=小數(shù)位數(shù))BigDecimal,BigInteger,String,byte,short,int,longandtherespectivewrappersoftheprimitivetypes.AdditionallysupportedbyHV:anysub-typeofNumber驗證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)java.util.Calendar;AdditionallysupportedbyHV,iftheJodaTimedate/timeAPIisontheclasspath:anyimplementationsBigDecimal,BigInteger,byte,short,int,longandtherespectivewrappersoftheprimitivetypes.AdditionallysupportedbyHV:anysub-typeofCharSequence(thenumericvaluerepresentedbythecharactersequenceisanysub-typeof于等于@Max指定的value值BigDecimal,BigInteger,byte,short,int,longandtherespectivewrappersoftheprimitivetypes.AdditionallysupportedbyHV:anysub-typeofCharSequence(thenumericvaluerepresentedbythecharsequenceisevaluated),sub-typeof于等于@Min指定的value值AnyAnyjava.util.Calendar;AdditionallysupportedbyHV,iftheJodaTimedate/timeAPIisontheclasspath:anyimplementationsString.AdditionallysupportedbyHV:anysub-typeofCharSequence.值,max=最大值)String,Collection,Mapandarrays.AdditionallysupportedbyHV:anysub-typeofCharSequence.minmax(包含)Anynon-primitivetype(類型象null(字值,max=CharSequence,Collection,MapandArrays,BigDecimal,BigInteger,CharSequence,byte,short,int,longandtherespectivewrappersoftheprimitive為空(不為null、去0@NotBlank只應用于字符串且在比較時@Length(min=限,max=度在minmax@驗證注解的元素值則表達式和flag自定義的格式使用RouterFunctions使用RouterFunctions開發(fā),指的是使用由@Component注解的普通類作為處理器類,使用Router進行請求與處理器方法映射,來開發(fā)WebFlux的方式。,還可以運行在Netty、Jetty等容器中。不過,在開發(fā)過程中會出現(xiàn)一個問題:Servlet中的HttpServletRequest、HttpServletResponseWeb容器中并不支持,例如Netty。為了能夠統(tǒng)一請求與響應,RouterFunctions專門定義了所有容器都技術(shù)的ServerRequest與ServerResponse作為請求與響應對象。基本結(jié)構(gòu)搭建(1)創(chuàng)建工程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 下半造價師工程計價知識點缺陷責任期考試試題
- 公開課英語單詞快速記憶
- 高中語文第3單元古思今賞第8課寡人之于國也課件新人教版必修
- 窗簾布藝:團隊卓越之旅-項目管理能力與團隊合作精進之路
- 獨樹一幟的中國畫 課件 2024-2025學年人教版初中美術(shù)九年級上冊
- 高中語文10蜀道難登高課件蘇教版必修
- 2024至2030年中國控天線彈簧數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國引線式石英晶體振蕩器行業(yè)投資前景及策略咨詢研究報告
- 2024至2030年中國差速器十字軸行業(yè)投資前景及策略咨詢研究報告
- 2024至2030年中國大小鼠灌胃針行業(yè)投資前景及策略咨詢研究報告
- 食管癌手術(shù)配合
- 設備安裝調(diào)試記錄表格
- Brother-TC-S2A機器操作資料課件
- 提高急危重患者轉(zhuǎn)運途中安全率(共40頁).ppt
- 二十個大型新建銅礦的生產(chǎn)成本
- 加油站績效考核方案
- Cr18Ni9Ti鋼鎢極氬弧焊接焊接工藝要點
- OA項目推進計劃(甘特圖)
- 錯納礦區(qū)Ⅰ號礦體鉛鋅礦800~1100td的露天開采最終開采境界設計說明
- 豐田A3報告示例
- 聚丙烯(等規(guī))化學品安全技術(shù)說明書
評論
0/150
提交評論