struts+mybatis聯(lián)合開發(fā)中數(shù)據(jù)的共享

過去的時間中,支撐開發(fā)的話題一直都是CRUD,雖然形式多樣,但無非就這四個操作。由于沒有涉及到業(yè)務(wù),基本上也就都是些簡單技術(shù)的使用。雖然技術(shù)都是簡單的,沒有設(shè)計模式,沒有復(fù)雜邏輯,沒有業(yè)務(wù)邏輯,但由于是框架封裝,數(shù)據(jù)在其中的流動和各個地方的存在形式依然需要好好記錄。

先畫張圖:

這里的整理只是已知的部分,還有很多細(xì)節(jié)沒有體現(xiàn)。更靠譜的說法是,這是張思維導(dǎo)圖。

首先看簡單的部分,中間的service層。

由于service層的代碼結(jié)構(gòu),或者是數(shù)據(jù)結(jié)構(gòu)都是根據(jù)需求不停改變,所以,(在已知的情況中)沒有一個好的框架對這一層進行好的封裝。所以數(shù)據(jù)流動也更容易看見,畢竟都是在自己寫的代碼中,數(shù)據(jù)存在方式也是java中經(jīng)典的數(shù)據(jù)存儲方式,最常見的是封裝在類中,這也是迎合OO思想的表現(xiàn)。當(dāng)然,也會有放進特殊數(shù)據(jù)結(jié)構(gòu)中的做法,但對于OO來說,這些數(shù)據(jù)結(jié)構(gòu)也是類(當(dāng)然,如果這么說是在用抽象的思想解決實際問題,沒有意義。)?。

實際的來看,數(shù)據(jù)最多情況下放在了自己定義的類中,包括VO,PO,DAO等。

PO:持久對象,是持久層使用的對象。目前使用PO對數(shù)據(jù)庫查詢條件進行過封裝,這個對象使用的意義在于,將數(shù)據(jù)庫查詢語句中需要的數(shù)據(jù)裝在一個對象中,這樣調(diào)用java中執(zhí)行sql語句的方法時,只需要向參數(shù)中傳入該對象即可,避免出現(xiàn)參數(shù)過多的情況。

DAO:數(shù)據(jù)訪問對象。主要是用對象的思維來對數(shù)據(jù)查詢進行封裝,其中包含的主要是對數(shù)據(jù)的不同操作的抽象,并在其中提供實現(xiàn)數(shù)據(jù)操作的方法。通過DAO,可以實現(xiàn)數(shù)據(jù)的真實查詢。

VO:數(shù)據(jù)對象。主要是用面向?qū)ο蟮姆绞椒庋b一個數(shù)據(jù)塊,其中包括對數(shù)據(jù)進行描述的POJO(簡單java類型)對象,在類中被看作是字段,這些字段如果沒有g(shù)et或set方法,在web應(yīng)用中幾乎沒有什么用處。當(dāng)他們獲得了自己的getter或setter的時候,這些字段被稱作“屬性”。屬性是相對于javabean而言的。javabean中可以包含多種不同的POJO類型。當(dāng)形成javabean的時候,在整個項目中的數(shù)據(jù)流動就有了基礎(chǔ)。

雖然在service層提到了javabean,但是數(shù)據(jù)的數(shù)據(jù)封裝并不是在這里形成的。真實的數(shù)據(jù)存在于“持久層”中,數(shù)據(jù)的封裝也是在這里形成的。

現(xiàn)在來看持久層。

從命名就可以看出,這一層是將數(shù)據(jù)永久保存起來的地方。數(shù)據(jù)永久保存的方式就在于把數(shù)據(jù)寫進掉電可存儲的硬件中,對于個人計算機來講,就是硬盤。但是數(shù)據(jù)不是隨便誰都可以去管理的,因此需要一個數(shù)據(jù)管理的工具。同時,數(shù)據(jù)如果是零散的也沒有意義,需要一個有序的數(shù)據(jù)存儲方式(數(shù)據(jù)結(jié)構(gòu)),這些數(shù)據(jù)存儲方式管理和數(shù)據(jù)管理(數(shù)據(jù)導(dǎo)入,建立數(shù)學(xué)模型等等),通過“數(shù)據(jù)庫”來實現(xiàn)。

既然是有序的來實現(xiàn)數(shù)據(jù)存儲,就必定有一套規(guī)則來進行描述。數(shù)據(jù)庫中有自己的描述方式,而java中有另一種描述方式。想要讓java中的數(shù)據(jù)能夠很好的放進數(shù)據(jù)庫中,需要用到ORM(對象關(guān)系映射)。

想要實現(xiàn)這套規(guī)則,并為實現(xiàn)這套規(guī)則建立恰當(dāng)?shù)膶崿F(xiàn)環(huán)境(數(shù)據(jù)庫連接池,數(shù)據(jù)庫連接,對象拆裝,數(shù)據(jù)封裝等等),并不容易,但同樣,每次要做的操作又很相似。為此,出現(xiàn)了一系列框架,這里用的是Mybatis框架。

框架使用的配置文件包括,?數(shù)據(jù)庫連接池配置,數(shù)據(jù)庫JDBC配置,mapper配置。

數(shù)據(jù)連接池配置:Mybatis用來建議的配置連接池的文件,一旦配置文件成功引用,框架將自動創(chuàng)建連接池,與數(shù)據(jù)庫保持長期連接并管理數(shù)據(jù)連接資源。

數(shù)據(jù)庫JDBC配置:JDBC配置。JSBC是Mybatis框架依賴的數(shù)據(jù)庫連接技術(shù),配置中包含有數(shù)據(jù)庫位置,JDBC核心類引用以及數(shù)據(jù)庫連接的賬號和密碼。

mapper配置:這個配置文件中,寫的全是sql語句,同時,該配置文件在需要的時候,還要用來指定數(shù)據(jù)封裝的格式。對于沒有配置封裝格式的數(shù)據(jù),Mybatis將實現(xiàn)自動封裝,方法是,利用反射從指定的類中去找到屬性,對屬性(或字段)進行賦值。此處,需要用來封裝數(shù)據(jù)的類的字段或?qū)傩悦蛿?shù)據(jù)庫中列的名字相對應(yīng)。?(框架約定,遵循該規(guī)則的情況下,不需要對數(shù)據(jù)進行更多配置)

至此,數(shù)據(jù)的獲得得到了保障。從統(tǒng)一的數(shù)據(jù)源中獲得數(shù)據(jù)也按照我們需要的格式進行了數(shù)據(jù)模型的表達(dá)。

數(shù)據(jù)從持久層中獲得并成功封裝以后,通過方法返回值、對象使用或者靜態(tài)變量使用等方式,服務(wù)層也可以獲得這些?數(shù)據(jù),并進行進一步處理。處理結(jié)束以后,數(shù)據(jù)繼續(xù)通過與持久層相同的方式,向展示層的后臺代碼中流動。

展示層:

展示層只做一件事情,就是展示數(shù)據(jù)。這也是結(jié)果看起來相對不那么枯燥,但其實也比較麻煩的一個地方。

首先,要知道的是,除去展示的前段代碼,包括JSP,HTML等等,剩下的部分都是寫在Java中的代碼,也就是跑在應(yīng)用服務(wù)器中的代碼,?算作是后臺代碼。由于后臺代碼和前臺代碼有物理上分開(后臺代碼在服務(wù)器中,前臺代碼被瀏覽器解釋)的特點,數(shù)據(jù)流動需要經(jīng)過一些轉(zhuǎn)換。在不涉及底層的情況下,可以認(rèn)為,struts2的值棧充當(dāng)了數(shù)據(jù)中轉(zhuǎn)的機制。(底層實現(xiàn)方式,可以猜想為,通過http協(xié)議,將數(shù)據(jù)進行某種格式放在http請求或響應(yīng)中,在網(wǎng)絡(luò)環(huán)境中傳輸。對于前端來說,數(shù)據(jù)被瀏覽器通過http協(xié)議解析以后,拼湊成完整的文件,并對不同的文件按照自己的格式解析出來,再通過某種編程規(guī)范,將數(shù)據(jù)重新拼湊,形成一長段有價值的數(shù)據(jù)流。這段數(shù)據(jù)流被瀏覽器按照國際規(guī)范以及自己瀏覽器的獨有風(fēng)格以及客戶配置約束,進行一系列復(fù)雜的編譯,最終變成了另一種有意義的數(shù)據(jù)形式,放進計算機相應(yīng)的硬件中,最終通過計算機硬件進行展示。對于后臺,同樣需要對http協(xié)議指定格式的數(shù)據(jù)進行解析,這一步發(fā)生在JVM中,解析以后的數(shù)據(jù)按照我們事先在代碼中約定的方式進行封裝以后就可以被程序猿使用了。)

對于值棧,其實就是提供了數(shù)據(jù)在不同物理位置,但是相同表現(xiàn)形式的可能。按照編程中透明化的要求,對于后臺開發(fā)程序猿而言,值棧就是可以被后臺和前臺都認(rèn)識的一種特殊的數(shù)據(jù)存儲。?值棧中有兩部分,分別是ValueStackContents和StackContext。

ValueStackContent是值棧中數(shù)值存儲的位置。其中包含的所有棧行都可以看作是值棧中封裝的一個個數(shù)據(jù)類,不同的行就是這個數(shù)據(jù)類的不同實例對象。?對于前端代碼而言,使用struts提供的標(biāo)簽,直接通過數(shù)據(jù)的別名可以對這些數(shù)據(jù)進行操作。對于后端代碼而言,只要在struts2中提供了這些數(shù)據(jù)對應(yīng)的getter或setter,就可以按照使用類的方式對數(shù)據(jù)進行使用。

StackContext運行上下文。值棧中用來保存上下文數(shù)據(jù)的位置,其中通過Map的形式對數(shù)據(jù)進行表述,每條數(shù)據(jù)都對應(yīng)自己的一個鍵,前端代碼通過OGNL表達(dá)式對數(shù)據(jù)進行引用,后端代碼通過對map進行操作對數(shù)據(jù)進行讀寫

(ActionContext.getContext().get(String key); ? OR ? ActionContext.getContext().put(String key,Object value);)。

至此,數(shù)據(jù)在struts2中(展示層)中的存儲和使用已經(jīng)結(jié)束。綜合從服務(wù)層的數(shù)據(jù)流動,數(shù)據(jù)完成了從數(shù)據(jù)庫中的提取,服務(wù)層的處理和轉(zhuǎn)發(fā),到達(dá)了展示層,按照五花八門的方式展示出來。

對于基本的web應(yīng)用而言,已經(jīng)完成了功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容