曹榮凱,劉曉燕*,李丹丹,吉春山
(1.昆明理工大學(xué) 信息工程與自動化學(xué)院, 云南 昆明 650500;2.金川鎳鉆研究設(shè)計院, 甘肅 金昌 737100)
現(xiàn)今,通過建模方法來實現(xiàn)復(fù)雜的Web應(yīng)用已經(jīng)處于比較重要的位置,許多研究者結(jié)合實踐經(jīng)驗,針對不同的建模方法提出了獨到的映射方法。交互流建模語言(Interaction Flow Modeling Language,IFML)是一種基于圖形化平臺的獨立建模語言,為了更好地對Web應(yīng)用建模,WebRatio公司(http://www.webratio.com)推出了WebRatio工具用于Web應(yīng)用程序的模型驅(qū)動開發(fā),為解決復(fù)雜的Web前端應(yīng)用提供了一個相對完整的方案[1-4]。
PHP+MySQL是開發(fā)Web應(yīng)用程序的經(jīng)典組合,具有開放源代碼、可以免費下載使用和支持多種操作系統(tǒng)平臺等特點,具有很強的實用性,被國內(nèi)外眾多網(wǎng)站廣泛采用。
目前國內(nèi)應(yīng)用IFML建模方法來開發(fā)復(fù)雜前端交互的Web應(yīng)用程序的相關(guān)研究非常少,為解決把IFML建模模型平滑過渡到PHP開發(fā)環(huán)境中,本文提出了從IFML模型映射到該開發(fā)環(huán)境的方法,以解決兩個高層開發(fā)環(huán)境下的映射。
IFML元模型的元素分為3個包:核心包、擴展包和數(shù)據(jù)類型包[5-6]。核心包中包含創(chuàng)建用戶交互組件的核心元素如下:
(1)View Container(視圖容器)是界面的一個元素,包含要顯示的內(nèi)容和支持的交互;
(2)View Component(視圖組件)是顯示內(nèi)容或接受輸入的界面元素;
(3)Event(事件)是影響應(yīng)用程序狀態(tài)的事件;
(4)Action(行為)是由事件觸發(fā)的業(yè)務(wù)邏輯;
(5)Navigation Flow(導(dǎo)航流)是輸入輸出的介質(zhì),鏈接源傳輸一些與鏈接目標(biāo)相關(guān)的信息;
(6)Data Flow(數(shù)據(jù)流)是作為先前用戶交互的結(jié)果,在View Components或Action之間傳遞數(shù)據(jù);
(7)Parameter Binding Group(參數(shù)綁定組)是Parameter Binding的集合,用來表示參數(shù)之間的依賴關(guān)系,即輸入?yún)?shù)和輸出參數(shù)之間的傳遞。
View Container由一個或多個View Container組成,他們分別用于表示W(wǎng)eb應(yīng)用程序和桌面應(yīng)用程序中的Web頁面和窗口。而一個View Container可以包含一個或多個View Components。
View Components包含要顯示的數(shù)據(jù)類型,即包含在IFML元模型的擴展包中的表單、列表或詳細信息。輸入和輸出參數(shù)可以與View Components相關(guān)聯(lián),也就是與Parameter Binding Group關(guān)系密切。Data Binding是View Component的一部分,表示域模型元素和View Component之間的關(guān)系。
Event用于表示View Containers和View Components之間的交互,會使源頁面和目標(biāo)頁面之間進行跳轉(zhuǎn)。
Interaction Flow表示用于連接View Components和View Containers的事件的效果,描述了界面狀態(tài)的變化。IFML中的交互流有兩種類型,即數(shù)據(jù)流和導(dǎo)航流。數(shù)據(jù)流表示由虛線表示的兩個IFML元素之間的數(shù)據(jù)傳輸,而不是由用戶交互引起的;導(dǎo)航流表示由實線表示的組件和容器之間的導(dǎo)航。
IFML提供了一種獨特的、簡明的圖像符號來表示用戶界面各個方面的功能,其模型符號及到PHP的具體約束如表1所示。
表1IFML模型符號及到PHP代碼定義
鑒于IFML的平臺獨立性,可以針對支持用戶交互的任何軟件架構(gòu)來實現(xiàn)。PHP和MySQL代表了最廣泛的網(wǎng)站開發(fā)平臺,托管在所謂的WAMP(Windows,Apache,MySQL,PHP)環(huán)境中。
PHP腳本可放置于文檔中的任何位置,以 結(jié)尾;PHP 文件的默認文件擴展名是“.php”,它通常包含HTML標(biāo)簽以及一些PHP腳本代碼;PHP語句以分號結(jié)尾,PHP 代碼塊的關(guān)閉標(biāo)簽也會自動表明分號(因此在PHP代碼塊的最后一行不必使用分號)。
從IFML模型到PHP所在環(huán)境的映射存在以下難點:
(1)IFML核心模型過于籠統(tǒng),會出現(xiàn)一種模型對應(yīng)到多種PHP代碼的情況;
(2)對于一種模型對應(yīng)多種PHP代碼的情況,要根據(jù)具體情況具體分析,會產(chǎn)生分歧;
(3)PHP模板的建立存在難度,需要適應(yīng)各類需求。
IFML提供了一組圖形表達的符號以及映射到不同開發(fā)環(huán)境的機制,且已經(jīng)有相應(yīng)的工具軟件WebRatio來支持它[7]。
考慮IFML的主要建模元素到PHP開發(fā)環(huán)境建立的映射關(guān)系[8-9]。映射規(guī)則如下:
(1)View Container映射到PHP開發(fā)環(huán)境即為一個PHP頁面模版。
(2)Event包括Select Event和Submit Event,相應(yīng)的Select Event 映射到PHP開發(fā)環(huán)境為HTTP獲取請求;Submit Event映射到PHP開發(fā)環(huán)境為HPPT發(fā)布請求。
(3)Navigation Flow映射到PHP開發(fā)環(huán)境為HTML超鏈接或按鈕。
(4)Data Flow映射到PHP開發(fā)環(huán)境為請求參數(shù)傳輸?shù)讲樵兂鼋Y(jié)果或其他的頁面。
(5)Action映射到PHP開發(fā)環(huán)境為PHP腳本。
(6)Parameter Binding Group映射到PHP開發(fā)環(huán)境也為請求參數(shù)傳輸?shù)讲樵兂鼋Y(jié)果或其他的頁面。
動態(tài)網(wǎng)站是一種交互式應(yīng)用程序,其前端允許用戶瀏覽從數(shù)據(jù)庫中動態(tài)提取的內(nèi)容,并執(zhí)行上傳內(nèi)容和下載內(nèi)容。在最簡單的情況下,用戶瀏覽的界面由純HTML文檔組成,由服務(wù)器端程序動態(tài)生成。
用于說明純HTML Web開發(fā)的示例性平臺,采用PHP服務(wù)器端腳本語言,該語言本地耦合到MySQL關(guān)系數(shù)據(jù)庫。
3.2.1 View Container映射步驟
PHP Web站點的典型結(jié)構(gòu)是由多個頁面組成,并且在IFML中對應(yīng)于一組獨立且相互關(guān)聯(lián)的View Container,包括用于動態(tài)數(shù)據(jù)發(fā)布和數(shù)據(jù)輸入的View Components。View Container是由用戶觸發(fā),用戶將HTTP請求發(fā)送到托管應(yīng)用程序的服務(wù)器,服務(wù)器響應(yīng)用戶的請求,然后根據(jù)圖1所示的執(zhí)行步驟處理動態(tài)頁面。
圖1 IFML模型
IFML View Containers和View Components到PHP的轉(zhuǎn)換產(chǎn)生了動態(tài)頁面,其結(jié)構(gòu)如下:
第一步,從HTTP請求中提取用于計算View Components的參數(shù)。第二步,解決與數(shù)據(jù)庫的連接,初步執(zhí)行獲取View Components內(nèi)容所需的數(shù)據(jù)綁定查詢。第三步,HTTP請求中的特定參數(shù)根據(jù)View Container的訪問方式處理所有可計算的View Components。首先,通過檢查請求參數(shù)值的合適條件語句確定最初可計算的View Components,并評估View Components數(shù)據(jù)綁定查詢。此類查詢的輸出用作執(zhí)行其他相關(guān)View Components查詢的輸入。其次,還需要解決由多個備用輸入?yún)?shù)值的View Components引起的沖突,這需要進一步的條件語句,根據(jù)所選擇的決策策略區(qū)分最具體的值。最后,已經(jīng)執(zhí)行了可計算View Components的所有數(shù)據(jù)綁定查詢,并且將結(jié)果存儲在適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)中,從中提取其以生成HTML標(biāo)記的動態(tài)部分。第四步構(gòu)建每個View Component的HTML內(nèi)容,將動態(tài)生成的內(nèi)容與靜態(tài)HTML標(biāo)記混合,以實現(xiàn)所需的頁面布局。最后一步,處理前幾個階段中使用的臨時對象。
3.2.2 Event和Navigation Flows的實現(xiàn)
Event可以與View Containers和View Components相關(guān)聯(lián),以表示他們之間支持用戶交互。事件的效果則由Navigation Flows表示,該Navigation Flow將Event連接到受其影響的View Container或View Component。Navigation Flow表示為箭頭,將與View Element相關(guān)聯(lián)的事件連接到目標(biāo)View Element。Navigation Flows指定用戶界面的狀態(tài)變化:在計算其內(nèi)容之后,引入Navigation Flows的目標(biāo)View Element;根據(jù)接口的結(jié)構(gòu),Navigation Flow的目標(biāo)View Element可能會保持視圖狀態(tài)或切換到其他視圖狀態(tài)。
3.2.3 Action的實現(xiàn)步驟
IFML不會對Actions的內(nèi)部組織建模,而只會模擬他們與用戶界面的相互作用。在PHP純HTML體系結(jié)構(gòu)中,Actions由服務(wù)器端腳本實現(xiàn),服務(wù)器端腳本可以通過合適的API訪問外部系統(tǒng)。
Action的實現(xiàn)涉及如何實現(xiàn)業(yè)務(wù)邏輯以及如何實現(xiàn)激活它的Event和Navigation Flow。在PHP中,Actions通過服務(wù)器端腳本實現(xiàn)步驟如下:
第一步,處理請求參數(shù)提取。從要在執(zhí)行業(yè)務(wù)操作的請求中提取由Navigation Flow傳輸?shù)膮?shù)。
第二步,業(yè)務(wù)邏輯的執(zhí)行。如果Action包含單個操作,則腳本只需使用輸入?yún)?shù)初始化組件,執(zhí)行它并檢查結(jié)果以確定是否正常或異常而終止事件。如果Action包含一系列操作,則腳本必須以正確的順序解決操作之間的參數(shù)傳遞。
第三步,在操作的Navigation Flow上將信息傳送到目標(biāo),顯示結(jié)果頁面。
為了說明映射方法的可行性,我們以網(wǎng)上銷售系統(tǒng)中的部分功能為例。該應(yīng)用系統(tǒng)的主要功能為用戶可以在該網(wǎng)站上瀏覽購買商品,管理員可以管理用戶商品,發(fā)布關(guān)于商品的新聞消息等。
圖1為用戶在選擇商品時所產(chǎn)生的事件與數(shù)據(jù)流傳輸?shù)腎FML模型。與Select Category事件關(guān)聯(lián)的Navigation Flow將View Component Category List與目標(biāo)View Component Product List連接起來,當(dāng)事件發(fā)生時,先計算目標(biāo)View Component的內(nèi)容以顯示所選類別的產(chǎn)品列表;觸發(fā)Select Category事件將會使Product Of Category View Container顯示新的頁面來替換Product Category View Container。Category List和Product List之間的輸入輸出依賴性表示為參數(shù)綁定(由IFML Parameter Binding Group元素表示),用來表示用戶選擇的對象的Selected Category參數(shù)的值與Product List View Component請求的輸入?yún)?shù)Category的值相關(guān)聯(lián)。同理View Component Product List和View Component Product Details也會進行同樣方式的交互。
本文提出了從IFML模型映射到PHP所在環(huán)境的規(guī)則和方法,以解決他們之間高層環(huán)境的映射,并說明了實現(xiàn)的具體步驟。下一步要做的研究工作是如何從運行PHP語言的Eclipse工具中將建模語言轉(zhuǎn)換成代碼,最終實現(xiàn)軟件的開發(fā)。