陳 科
(四川大學(xué)錦城學(xué)院 計(jì)算機(jī)與軟件學(xué)院,四川 成都 611731)
據(jù)權(quán)威編程語(yǔ)言排行榜TIOBE[1]統(tǒng)計(jì),目前JAVA仍然是世界上使用范圍最廣、使用人數(shù)最多、影響力最大的編程語(yǔ)言。各大高校計(jì)算機(jī)專業(yè)都開(kāi)設(shè)了JAVA編程相關(guān)的課程,并分配了大量的實(shí)驗(yàn)學(xué)時(shí),以培養(yǎng)和提高學(xué)生JAVA 編程能力。通過(guò)一學(xué)期(約64 學(xué)時(shí))的理論加實(shí)踐學(xué)習(xí),大部分學(xué)生可以掌握J(rèn)AVA 標(biāo)準(zhǔn)版(JAVA SE)的核心內(nèi)容,包括JAVA 基礎(chǔ)語(yǔ)法、面向?qū)ο蠡靖拍詈驮O(shè)計(jì)思想、JAVA 標(biāo)準(zhǔn)庫(kù)調(diào)用方法等。常見(jiàn)的JAVA 課程實(shí)驗(yàn)教學(xué)方法包括微課教學(xué)、案例驅(qū)動(dòng)教學(xué)、CDIO 模式教學(xué)等[2-4]。
JAVA SE 一般不能直接應(yīng)用到項(xiàng)目研發(fā)和工程實(shí)踐中。在JAVA SE 基礎(chǔ)上、以輕量級(jí)MVC 模式為核心的JAVA 企業(yè)版(JAVA EE)[5-8]是主流的JAVA 平臺(tái)開(kāi)發(fā)架構(gòu),許多學(xué)校也開(kāi)設(shè)了JAVA EE 的實(shí)驗(yàn)課程,并研究了一些實(shí)驗(yàn)教學(xué)方法[9-12],主要集中于案例教學(xué)和實(shí)驗(yàn)指導(dǎo)過(guò)程中的新方法探索。但JAVA EE 架構(gòu)復(fù)雜、代碼量大、能力要求高,大部分JAVA EE 實(shí)驗(yàn)由于學(xué)時(shí)限制,再加上學(xué)生大多沒(méi)有企業(yè)項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn),導(dǎo)致實(shí)驗(yàn)課程效果不佳,很難在短期內(nèi)培養(yǎng)和提高學(xué)生的JAVA EE 實(shí)踐能力,因此迫切需要進(jìn)行實(shí)驗(yàn)教學(xué)改革。
本文通過(guò)技術(shù)創(chuàng)新,積極探索新型JAVA EE 開(kāi)發(fā)和實(shí)驗(yàn)教學(xué)模式,將基于MVC 模式的輕量級(jí)JAVA EE架構(gòu)進(jìn)行組件化設(shè)計(jì),并通過(guò)自動(dòng)構(gòu)建技術(shù),快速完成JAVA EE 應(yīng)用開(kāi)發(fā)過(guò)程,避免了傳統(tǒng)逐行代碼的編程方式,既提高了實(shí)驗(yàn)課程效率,又提升了學(xué)生JAVA EE 的編程實(shí)踐能力,取得了較好的實(shí)驗(yàn)教學(xué)效果。
基于“模型—視圖—控制(MVC)”模式的輕量級(jí)JAVA EE 是目前主流的軟件體系,JAVA EE 實(shí)驗(yàn)也基于MVC 層次架構(gòu)開(kāi)展。要實(shí)現(xiàn)全棧MVC 體系,必然需要編寫(xiě)前端界面(常?;贖TML 和JavaScript等技術(shù))、后臺(tái)控制邏輯和數(shù)據(jù)庫(kù)模型,因此采用MVC實(shí)現(xiàn)一個(gè)完整的業(yè)務(wù)邏輯,包括常見(jiàn)的數(shù)據(jù)增、刪、改、查操作,需要花費(fèi)較長(zhǎng)的時(shí)間和較大的精力,短短的實(shí)驗(yàn)課時(shí)很難高質(zhì)量地完成全部操作過(guò)程,學(xué)生普遍感覺(jué)知識(shí)點(diǎn)多、編程復(fù)雜、上手困難,因此實(shí)踐效果不佳。
為了改革JAVA EE 實(shí)驗(yàn)教學(xué),我們提出了創(chuàng)新的MVC 組件概念,摒棄從底層開(kāi)始直接編寫(xiě)代碼的傳統(tǒng)模式,將復(fù)雜業(yè)務(wù)邏輯組件化,再通過(guò)積木式的組件拼接和組合,形成組件庫(kù),從而構(gòu)建出完整的業(yè)務(wù)系統(tǒng),達(dá)到了更高效的實(shí)踐效果。
JAVA EE 組件,簡(jiǎn)稱組件,是符合MVC 規(guī)范的細(xì)粒度的業(yè)務(wù)模塊,包含前端界面和后臺(tái)業(yè)務(wù)邏輯。一個(gè)MVC 組件由組件名、組件描述和組件代碼實(shí)現(xiàn)三部分構(gòu)成。
按照規(guī)模劃分,組件可分為小型組件,如刪除、新增等功能按鈕;以及大型組件,如查詢列表、數(shù)據(jù)表單等組件。一些小型組件可組合成為大型組件。
組件的標(biāo)識(shí)符稱為組件名,各組件的名稱必須唯一,且組件命名應(yīng)當(dāng)符合JAVA 標(biāo)識(shí)符命名規(guī)范,如數(shù)據(jù)新增按鈕組件可命名為:dataAddButton。
組件描述是對(duì)組件功能和屬性的形式化定義,我們采用了XML 語(yǔ)言對(duì)組件進(jìn)行描述,將每個(gè)組件映射為一個(gè)XML 標(biāo)簽(tag),既增加了可讀性,又便于編寫(xiě)計(jì)算機(jī)程序解析。典型的組件定義如圖1 所示。
圖1 組件XML 定義
不同組件通過(guò)定義不同的屬性,具有不同的功能和表現(xiàn)形式,同一組件的不同實(shí)例具有不同的屬性值,也能表現(xiàn)出不同的界面和功能。 以 文 本 輸 入 框(textbox)組件為例,XML 定義如圖2 所示。組件的實(shí)現(xiàn)過(guò)程如圖3 所示。
首先將組件XML 定義輸入到XML 解析器中,一般可采用開(kāi)源框架Dom4J 作為解析器[13-15],然后根據(jù)組件樣式編寫(xiě)前端界面,再根據(jù)組件功能編寫(xiě)后臺(tái)JAVA 邏輯代碼。在編寫(xiě)過(guò)程中,需要讀取XML 的組件屬性作為參數(shù),最終生成完整的組件邏輯,輸出可用的JAVA EE 組件供使用。
圖2 textbox 組件XML 定義
圖3 JAVA EE 組件實(shí)現(xiàn)過(guò)程
一個(gè)完整的JAVA EE 組件至少包括前端HTML頁(yè)面和后臺(tái)JAVA 代碼,結(jié)構(gòu)如圖4 所示。
圖4 JAVA EE 組件結(jié)構(gòu)示意圖
前端頁(yè)面主要包括標(biāo)準(zhǔn)HTML 標(biāo)簽(如按鈕對(duì)應(yīng)的標(biāo)簽為
后端控制邏輯采用JAVA 語(yǔ)言實(shí)現(xiàn),包括三個(gè)核心方法:①loadComponentXML()。調(diào)用XML 解析器加載并解析組件XML 定義。②saveData()/loadData()。將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)或者從數(shù)據(jù)庫(kù)中加載數(shù)據(jù)。③renderHtml()。根據(jù)組件XML 定義的屬性控制頁(yè)面在前端HTML 顯示,如果需要,還可將loadData 方法讀取的數(shù)據(jù)在頁(yè)面中進(jìn)行展現(xiàn)。
由于組件功能單一,規(guī)模較小,根據(jù)XML 描述,實(shí)現(xiàn)單個(gè)組件的業(yè)務(wù)功能并不復(fù)雜。教師可帶領(lǐng)學(xué)生在實(shí)驗(yàn)課堂上完成組件的設(shè)計(jì)與編寫(xiě)。
單個(gè)組件無(wú)法獨(dú)立工作,必須將多個(gè)組件進(jìn)行組合形成組件庫(kù),才能實(shí)現(xiàn)完整的業(yè)務(wù)功能。
組件庫(kù)是由若干組件按照指定結(jié)構(gòu)共同組成的、可構(gòu)建完整業(yè)務(wù)功能的組件集合。組件之間可以是包含或并列關(guān)系。
組件庫(kù)仍然采用XML 語(yǔ)言定義組件與組件之間的關(guān)系。XML 描述語(yǔ)法如圖5 所示。
圖5 組件庫(kù)XML 定義
一個(gè)組件庫(kù)由若干組件構(gòu)成,組件與組件之間可以是父子包含關(guān)系,如圖5 中的組件1 和組件2,也可以是兄弟并列關(guān)系。每個(gè)組件的屬性值放到相應(yīng)XML 節(jié)點(diǎn)的屬性列表中,屬性名稱由圖1 中的tag 定義給出。
以較為復(fù)雜的數(shù)據(jù)查詢組件庫(kù)(dataQuery)為例,要實(shí)現(xiàn)的功能界面如圖6 所示。
圖6 用于數(shù)據(jù)查詢的組件庫(kù)dataQuery 的功能界面
該組件庫(kù)包括搜索欄、工具欄和數(shù)據(jù)列表,共同構(gòu)成完整的數(shù)據(jù)查詢及數(shù)據(jù)操作相關(guān)業(yè)務(wù)功能,其XML 定義如圖7 所示。
圖7 dataQuery 組件庫(kù)XML 定義
完成組件庫(kù)XML 定義后,需要載入到自動(dòng)構(gòu)建引擎,由引擎完成組件解析,最終輸出完整的業(yè)務(wù)功能,包括前端界面和后臺(tái)業(yè)務(wù)邏輯。
組件庫(kù)定義僅僅是XML 格式的文檔,不能直接提供給用戶使用,需要組件引擎(component engine)讀取組件庫(kù)結(jié)構(gòu),并加載相應(yīng)組件的定義與實(shí)現(xiàn),最終構(gòu)建輸出成為包含前端界面和后臺(tái)控制邏輯的可用的業(yè)務(wù)系統(tǒng)。這個(gè)過(guò)程自動(dòng)完成,對(duì)用戶透明,因此稱為自動(dòng)構(gòu)建引擎,這是一個(gè)非常關(guān)鍵的部件。
組件引擎本質(zhì)上是一個(gè)控制器(controller),運(yùn)行在JAVA EE 服務(wù)器內(nèi)存中,可通過(guò)URL 訪問(wèn),其工作原理與過(guò)程如圖8 所示。
圖8 組件構(gòu)建引擎工作過(guò)程
用戶通過(guò)URL 訪問(wèn)組件引擎,URL 中包含了需要調(diào)用的組件庫(kù)參數(shù),引擎根據(jù)參數(shù)調(diào)用相關(guān)組件的定義與實(shí)現(xiàn),從而激活組件構(gòu)建流程,最終輸出完整的業(yè)務(wù)邏輯,組件引擎結(jié)構(gòu)如圖9 所示。
圖9 構(gòu)建引擎結(jié)構(gòu)
引擎類 ComponentEngine 核心方法包括:①loadComponentLib()。讀取組件庫(kù)XML 文檔,并加載指定的組件庫(kù)到內(nèi)存。②resolveComponent()。調(diào)用XML 解析庫(kù),解析組件庫(kù)結(jié)構(gòu),得到組件之間的父子或兄弟關(guān)系。③renderComponent()。加載對(duì)應(yīng)的組件定義和實(shí)現(xiàn),并按照組件庫(kù)結(jié)構(gòu)進(jìn)行組合,包括前端HTML 界面生成和后臺(tái)控制邏輯調(diào)用,通過(guò)該過(guò)程完成組件庫(kù)構(gòu)建,最終得到完整的業(yè)務(wù)邏輯代碼和運(yùn)行結(jié)果。
值得注意的是,由于各組件已經(jīng)實(shí)現(xiàn)了前端界面和后臺(tái)邏輯的定義與實(shí)現(xiàn),組件庫(kù)的構(gòu)建過(guò)程并不需要重復(fù)編寫(xiě)前后臺(tái)業(yè)務(wù)代碼,只需分析組件庫(kù)結(jié)構(gòu)并調(diào)用和加載對(duì)應(yīng)的組件即可,實(shí)現(xiàn)過(guò)程并不復(fù)雜,可由教師帶領(lǐng)學(xué)生在實(shí)驗(yàn)課堂上設(shè)計(jì)并編程完成。
為了將基于組件庫(kù)技術(shù)的JAVA EE 實(shí)驗(yàn)教學(xué)與傳統(tǒng)編程實(shí)驗(yàn)教學(xué)進(jìn)行對(duì)比,我們選擇兩個(gè)各約30 人的小班分別采用這兩種不同的教學(xué)方式,目標(biāo)是讓學(xué)生掌握J(rèn)AVA EE 編程方法,并達(dá)到可獨(dú)立開(kāi)發(fā)完整業(yè)務(wù)系統(tǒng)的水平。
按照MVC 架構(gòu)要求,傳統(tǒng)JAVA EE 編程包括編寫(xiě)以下部分:
(1)視圖層。包括HTML 頁(yè)面、JavaScript 代碼和CSS 樣式等頁(yè)面元素,主要職責(zé)是提供可視化的用戶界面。
(2)控制層。后臺(tái)控制邏輯,主要功能是調(diào)用服務(wù)接口獲取數(shù)據(jù)結(jié)果,并輸送到視圖層展現(xiàn)。
(3)服務(wù)層。與界面無(wú)關(guān)的后臺(tái)數(shù)據(jù)查詢、加載和分析模塊,一般包括接口和實(shí)現(xiàn)類,主要職責(zé)是為控制器提供服務(wù)接口。
(4)數(shù)據(jù)模型層。將數(shù)據(jù)庫(kù)的表結(jié)構(gòu)映射為JAVA對(duì)象,并提供數(shù)據(jù)查詢和操作方法,為服務(wù)層提供數(shù)據(jù)操作來(lái)源。
為了讓學(xué)生掌握J(rèn)AVA EE 編程過(guò)程,教師結(jié)合一個(gè)示例業(yè)務(wù)系統(tǒng),先用大約12 學(xué)時(shí)講解各個(gè)層次的編程技術(shù),再用大約4 學(xué)時(shí)整合MVC 各層,最終完成業(yè)務(wù)系統(tǒng)開(kāi)發(fā)。
示例系統(tǒng)講解完成后,布置了3~5 個(gè)新項(xiàng)目讓學(xué)生進(jìn)行自主開(kāi)發(fā)實(shí)踐。從實(shí)際教學(xué)過(guò)程看,由于涉及代碼量大,80%以上的學(xué)生無(wú)法獨(dú)立完成前2 個(gè)實(shí)踐項(xiàng)目,從第3 個(gè)項(xiàng)目開(kāi)始略有好轉(zhuǎn),大約70%以上可以獨(dú)立完成后續(xù)項(xiàng)目開(kāi)發(fā)。至此,總共需要大約50~60 學(xué)時(shí)。
基于組件庫(kù)技術(shù),實(shí)驗(yàn)過(guò)程有所變化,整個(gè)實(shí)驗(yàn)過(guò)程分為4 個(gè)階段,特別是第1 階段,并不需要編寫(xiě)業(yè)務(wù)系統(tǒng),而是對(duì)組件進(jìn)行設(shè)計(jì)和開(kāi)發(fā)。實(shí)驗(yàn)過(guò)程如下:
(1)常用組件編寫(xiě)。共編寫(xiě)了大約20 個(gè)常用組件,包括前端頁(yè)面和后臺(tái)控制邏輯,并使用XML 語(yǔ)言進(jìn)行描述。此過(guò)程大約需要28 學(xué)時(shí)。
(2)組件引擎設(shè)計(jì)與實(shí)現(xiàn)。組件引擎是非常重要的模塊,但其邏輯代碼并不復(fù)雜,教師帶領(lǐng)學(xué)生大約用2 學(xué)時(shí)可以完成。
(3)組件庫(kù)設(shè)計(jì)。根據(jù)業(yè)務(wù)系統(tǒng)功能設(shè)計(jì)組件庫(kù),并使用XML 描述,由于組件已編寫(xiě)完成,此階段僅需要定義XML 文檔,大約需要3 學(xué)時(shí)。
(4)系統(tǒng)構(gòu)建與運(yùn)行。組件庫(kù)設(shè)計(jì)完成后,啟動(dòng)引擎,運(yùn)行業(yè)務(wù)系統(tǒng),并進(jìn)行功能驗(yàn)證。此階段大約需要2 學(xué)時(shí)。
從以上過(guò)程可以看出,花費(fèi)時(shí)間最多的是組件編寫(xiě),從教學(xué)效果看,由于每個(gè)組件本身也是符合JAVA EE 規(guī)范的MVC 模塊,但功能更單一,學(xué)生更容易理解和掌握編程實(shí)現(xiàn)過(guò)程,對(duì)編程能力提升較傳統(tǒng)方式更為顯著。
從實(shí)際教學(xué)進(jìn)度看,從組件編寫(xiě)到完成組件庫(kù)設(shè)計(jì)大約需要30 學(xué)時(shí),該階段后,不同業(yè)務(wù)系統(tǒng)可直接構(gòu)建生成,后續(xù)新項(xiàng)目不需要重復(fù)編寫(xiě)組件。因此,多數(shù)學(xué)生可以在短時(shí)間內(nèi)構(gòu)建新的業(yè)務(wù)系統(tǒng),整體效率明顯高于采用傳統(tǒng)實(shí)驗(yàn)教學(xué)方法的班級(jí)。
為了直觀地比較兩種不同實(shí)驗(yàn)教學(xué)方式的效果,圖10 顯示了隨著教學(xué)課時(shí)推進(jìn),可獨(dú)立編寫(xiě)JAVA EE系統(tǒng)人數(shù)百分比的變化情況。
圖10 實(shí)驗(yàn)教學(xué)效果對(duì)比
兩個(gè)班級(jí)選擇的實(shí)踐項(xiàng)目完全相同。從圖10 可以看出,大約前30 學(xué)時(shí),傳統(tǒng)班學(xué)生可獨(dú)立編寫(xiě)項(xiàng)目模塊人數(shù)比例更高,但隨著組件庫(kù)的完善,組件化班的構(gòu)建速度明顯提高,掌握獨(dú)立開(kāi)發(fā)能力的人數(shù)迅速增加,40 學(xué)時(shí)后穩(wěn)超傳統(tǒng)班級(jí),組件化班級(jí)的實(shí)驗(yàn)教學(xué)效果和效率都高于傳統(tǒng)班級(jí)。
JAVA EE 實(shí)驗(yàn)教學(xué)是許多計(jì)算機(jī)軟件工程類院校相關(guān)專業(yè)必不可少的課程。為了提高教學(xué)效率,提升學(xué)生實(shí)踐能力,本文提出了組件化架構(gòu),并應(yīng)于教學(xué)實(shí)踐。與傳統(tǒng)JAVA EE 實(shí)驗(yàn)教學(xué)相比,具有明顯優(yōu)勢(shì),不僅學(xué)生的編程能力提升更顯著,教學(xué)效率和課時(shí)利用率也更高,可作為一種新型的JAVA EE 實(shí)驗(yàn)教學(xué)方法進(jìn)行推廣。