宋 微 李亞芬
摘 要:代碼生成工具的使用可以大幅度減少開(kāi)發(fā)人員編寫重復(fù)性代碼的工作量,提高Web應(yīng)用開(kāi)發(fā)的質(zhì)量和效率。在代碼生成系統(tǒng)中,設(shè)計(jì)一種基于MVC設(shè)計(jì)模式的新型Web應(yīng)用開(kāi)發(fā)框架,將Web應(yīng)用分為視圖層、控制層和模型層,每層各司其職,代碼結(jié)構(gòu)清晰,在此基礎(chǔ)上采用JET模板和Xpath相結(jié)合的代碼生成方法生成重復(fù)性代碼。實(shí)驗(yàn)證明,該系統(tǒng)可快速構(gòu)建Web應(yīng)用。
關(guān)鍵詞:代碼生成系統(tǒng);MVC;JET;Web應(yīng)用
中圖分類號(hào):TP311
0 引 言
早期Web應(yīng)用使用ASP,JSP等技術(shù)進(jìn)行編碼,將頁(yè)面顯示、業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)操作大部分都集中在頁(yè)面代碼中,維護(hù)困難,不利于分工協(xié)作。隨著Web技術(shù)的飛速發(fā)展,Web組件的開(kāi)發(fā)方式成為主導(dǎo),MVC設(shè)計(jì)模式是其中的典型,各種框架也紛紛出現(xiàn),如Struts,Spring框架等,在很大程度上降低了Web開(kāi)發(fā)的難度,但也存在很多不足,如難于掌握,配置復(fù)雜等,對(duì)于很多Web應(yīng)用項(xiàng)目并不適用。在此基于MVC模式,并結(jié)合大量設(shè)計(jì)模式,設(shè)計(jì)一種新型的Web應(yīng)用開(kāi)發(fā)框架,代碼結(jié)構(gòu)清晰,復(fù)雜度低,易于理解,并且配置簡(jiǎn)單,加強(qiáng)了系統(tǒng)的可擴(kuò)展性,降低了軟件開(kāi)發(fā)成本。
基于Web應(yīng)用本身的特點(diǎn),采用上述框架開(kāi)發(fā)Web應(yīng)用,對(duì)于不同模塊而言,各層次代碼在實(shí)現(xiàn)上有很大的相似性,開(kāi)發(fā)人員需要重復(fù)編寫大量代碼,嚴(yán)重影響了軟件開(kāi)發(fā)速度。代碼生成技術(shù)的引入,在很大程度上可以解決這一問(wèn)題,大大減少了軟件開(kāi)發(fā)中枯燥且重復(fù)的編碼工作,更進(jìn)一步加快了Web應(yīng)用的開(kāi)發(fā)。
在此采用模型驅(qū)動(dòng)(MDA)開(kāi)發(fā)的思想,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)面向Web應(yīng)用的代碼生成系統(tǒng),在開(kāi)發(fā)人員簡(jiǎn)單配置下,能夠快速構(gòu)建Web應(yīng)用,顯著提高了Web應(yīng)用的開(kāi)發(fā)效率。
1 Web應(yīng)用體系結(jié)構(gòu)
[BT3]1.1 MVC設(shè)計(jì)模式
MVC設(shè)計(jì)模式是基于J2EE的Web應(yīng)用開(kāi)發(fā)的首選模式,它強(qiáng)制性地將應(yīng)用程序的輸入、處理和輸出分開(kāi),使應(yīng)用程序分成模型層、控制器、視圖層,并各自處理自己的任務(wù)。
模型層封裝了數(shù)據(jù)和對(duì)數(shù)據(jù)的操作,是應(yīng)用程序的主體部分。MVC三個(gè)部件中,模型層擁有最多的處理任務(wù)。同一個(gè)模型可被多個(gè)視圖重用,提高了應(yīng)用的可重用性。通過(guò)模型層,可以確定需要操作的數(shù)據(jù)、業(yè)務(wù)處理方法以及需要設(shè)計(jì)什么樣的視圖層頁(yè)面[3]。
控制層用來(lái)處理業(yè)務(wù)邏輯,負(fù)責(zé)視圖和模型之間的交互,控制對(duì)用戶輸入響應(yīng)方式和流程。它主要負(fù)責(zé)兩方面的動(dòng)作:把用戶的請(qǐng)求分發(fā)到相應(yīng)的模型;將模型的改變及時(shí)反應(yīng)到視圖上[4]。
視圖層是模型的表示,用于管理用戶請(qǐng)求并做出相應(yīng)的響應(yīng)。對(duì)于Web應(yīng)用程序,視圖主要指HTML或JSP頁(yè)面。視圖向用戶顯示相關(guān)的數(shù)據(jù),并能接收用戶的輸入數(shù)據(jù),提交給Web服務(wù)器進(jìn)行處理。但是它并不進(jìn)行任何實(shí)際的業(yè)務(wù)處理[5]。
綜上,基于MVC的設(shè)計(jì)模式開(kāi)發(fā)Web應(yīng)用,┟懇徊悛在處理程序上都有明確的任務(wù)與功能,實(shí)現(xiàn)了系統(tǒng)結(jié)構(gòu)層次清晰及各層間的解耦,從而大大提高了代碼的靈活性和復(fù)用性。
[BT3]1.2 Web應(yīng)用框架結(jié)構(gòu)
本文框架結(jié)構(gòu)基于MVC設(shè)計(jì)模式,并使用了大量?jī)?yōu)秀的設(shè)計(jì)模式,如模板模式、工廠模式、適配器模式等,篇幅有限,不再贅述。
框架將目標(biāo)系統(tǒng)分為模型層、控制層、視圖層三層。其中,視圖層通過(guò)JSP實(shí)現(xiàn),控制層通過(guò)Servlet來(lái)實(shí)現(xiàn),而模型層則通過(guò)實(shí)體Entity來(lái)實(shí)現(xiàn)。三者之間的交互模式如圖1所示。
Servlet充當(dāng)控制的角色,它接收請(qǐng)求,并且根據(jù)請(qǐng)求信息將它們分發(fā)給適當(dāng)?shù)腏SP頁(yè)面來(lái)產(chǎn)生響應(yīng)[6]。Servlet控制器還根據(jù)JSP視圖的需求生成實(shí)體Entity的實(shí)例并輸出給JSP環(huán)境。JSP視圖可以通過(guò)直接調(diào)用Entity實(shí)例的方法得到Entity中的數(shù)據(jù)。
下面對(duì)各層次模型在Web系統(tǒng)中的作用以及實(shí)現(xiàn)方法進(jìn)行詳細(xì)闡述。
[BT4]1.2.1 模型層
Web應(yīng)用架構(gòu)模型層由實(shí)體實(shí)現(xiàn),如圖2所示。
CommonEntity執(zhí)行基本的實(shí)體操作,包含屬性table,property以及與數(shù)據(jù)庫(kù)的操作等。具體操作的實(shí)體均繼承自這個(gè)統(tǒng)一的抽象類CommonEntity,各業(yè)務(wù)對(duì)象的實(shí)體對(duì)應(yīng)于其具體對(duì)應(yīng)的數(shù)據(jù)庫(kù)表,包含數(shù)據(jù)庫(kù)表的基本屬性字段的表示信息。
各個(gè)具體的實(shí)體類在結(jié)構(gòu)上非常相似,都是get和set方法,只是具體的屬性不同,保持了良好的面向?qū)ο笤O(shè)計(jì)風(fēng)格。這樣,有利于從目標(biāo)代碼中抽象出統(tǒng)一的結(jié)構(gòu)作為模板,使模型層代碼的生成更為簡(jiǎn)單。
[BT4]1.2.2 控制層
對(duì)于系統(tǒng)的控制層,采用Servlet實(shí)現(xiàn),如圖3所示。通過(guò)CommonServlet設(shè)置一些基本功能,其中包括訪問(wèn)控制、日志處理等信息。然后由較具體的類繼承這個(gè)CommonServlet,它們實(shí)現(xiàn)各自的執(zhí)行方法,但是并不具體。例如,對(duì)于Web應(yīng)用的基本功能:增加、刪除、修改、查詢操作,與業(yè)務(wù)對(duì)象無(wú)關(guān)的實(shí)現(xiàn)操作都抽象在二級(jí)抽象類Addservlet,Deleteservlet,Updateservlet及Queryservlet中,各業(yè)務(wù)對(duì)象對(duì)應(yīng)的具體模塊中相應(yīng)操作的Servlet繼承二級(jí)抽象類,完成具體操作。這在很大程度上減少了代碼的重復(fù),提高了代碼的利用率。
各個(gè)模塊對(duì)應(yīng)的Servlet在結(jié)構(gòu)上具有很大的相似性,很容易提煉出統(tǒng)一結(jié)構(gòu)作為模板。應(yīng)用代碼生成器,可以使Web開(kāi)發(fā)速度得到很大提高。
[BT4]1.2.3 視圖層
視圖層為顯示提供一個(gè)數(shù)據(jù)模型,用于管理用戶的請(qǐng)求并做出相應(yīng)的響應(yīng)。不同的業(yè)務(wù)邏輯對(duì)應(yīng)不同的頁(yè)面,如添加頁(yè)面add.jsp、列表頁(yè)面list.jsp等,且根據(jù)用戶需求的不同,選擇多種頁(yè)面風(fēng)格,對(duì)于不同對(duì)象,只是顯示的內(nèi)容有所不同。本文框架的設(shè)計(jì)使視圖層大大簡(jiǎn)化,同一種類型的頁(yè)面對(duì)于各個(gè)模塊而言,包含大量的結(jié)構(gòu)相似代碼,同樣適于使用代碼生成工具實(shí)現(xiàn)。
通過(guò)以上分析可知,這里所采用的Web應(yīng)用框架結(jié)構(gòu),在根據(jù)MVC模式劃分的每一層中,都將大量的通用操作封裝在抽象類中,具體業(yè)務(wù)對(duì)象繼承抽象類實(shí)現(xiàn)具體的業(yè)務(wù)邏輯,在很大程度上減少了代碼的重復(fù)率。
具體業(yè)務(wù)對(duì)象的增加、刪除、修改、查詢等功能在系統(tǒng)各模塊中的處理方式相似,開(kāi)發(fā)人員手動(dòng)開(kāi)發(fā)重復(fù)率很高,交互頁(yè)面也存在大量的重復(fù)設(shè)計(jì)。這類代碼非常適合于使用代碼生成工具實(shí)現(xiàn),代碼生成技術(shù)的引入將大大地減少重復(fù)工作,減少開(kāi)發(fā)的工作量。
根據(jù)對(duì)目標(biāo)系統(tǒng)的分析,可最終確定需要生成哪些目標(biāo)代碼,主要有:
(1) 視圖層:各業(yè)務(wù)對(duì)象的add,list,update頁(yè)面(delete直接用Servlet實(shí)現(xiàn));
(2) 控制層:各業(yè)務(wù)對(duì)象進(jìn)行add,delete,update,query操作所對(duì)應(yīng)的Servlet;
(3) 模型層:各業(yè)務(wù)對(duì)象相應(yīng)的entity。
2 代碼生成器的設(shè)計(jì)
[BT3]2.1 代碼生成方式
由第1.2節(jié)可知,各層目標(biāo)代碼由代碼生成器自動(dòng)生成。關(guān)于代碼生成器,比較典型的幾種生成方式包括:
(1) 使用XSLT把XML轉(zhuǎn)為Java源代碼。
采用XSLT處理器完成模板解析和變量替換,并使用樣式表語(yǔ)言,免去為文本定制規(guī)范的工作[7]。
(2) 面向?qū)傩跃幊獭V饕荴Doclet,
XDoclet使用類似JavaDoc標(biāo)記的注釋向類、方法和字段等語(yǔ)言特征添加元數(shù)據(jù)。隨后,它利用這些額外的元數(shù)據(jù)自動(dòng)生成配置文件、源代碼等。
(3) 基于MDA。
主要是AndroMDA,它是在模板技術(shù)和XDoclet兩項(xiàng)技術(shù)的基礎(chǔ)上實(shí)現(xiàn)Code Generation的。
(4) 基于模板解析。
通過(guò)模板解析引擎將輸入數(shù)據(jù)替換模板文件中可變部分生成目標(biāo)代碼,能夠生成Java,C/C++,SQL等各種語(yǔ)言代碼。采用模板方式生成代碼,可減小復(fù)雜性和增加可讀性,是代碼生成的主要實(shí)現(xiàn)手段[8]。
在本文的代碼生成系統(tǒng)中,根據(jù)第1.2節(jié)中對(duì)目標(biāo)代碼的分析,需對(duì)每一層進(jìn)行模板的提取,輸入XML文件中包含具體的用戶需求信息,二者進(jìn)行相應(yīng)融合,即可逐層生成目標(biāo)代碼。
成熟的模板引擎主要有Velocity,JET等,Velocity通過(guò)調(diào)用JDOM完成對(duì)XML文檔的解析,編碼量大,而基于EMF框架的JET模板引擎采用Xpath查詢語(yǔ)言完成對(duì)XML文檔的解析,大大減少了編碼量,從而使代碼生成過(guò)程更為快速,已經(jīng)越來(lái)越多的被使用。
綜上,在本文代碼生成系統(tǒng)中,代碼生成器部分使用JET模板引擎,以XML文件為輸入數(shù)據(jù)模型,采用JET模板和XPath相結(jié)合的代碼生成方法。
[BT3]2.2 基于JET模板的代碼生成器
基于JET的代碼生成過(guò)程包括:加載以XML格式存儲(chǔ)的數(shù)據(jù)模型,通過(guò)XML Schema對(duì)模型進(jìn)行結(jié)構(gòu)完整性和語(yǔ)義一致性檢查,檢查通過(guò),則執(zhí)行模板引擎(控制文件),將模板文件與XML文件中的內(nèi)容合并以生成目標(biāo)代碼。生成過(guò)程如圖4所示。
下面對(duì)代碼生成器的各部分進(jìn)行說(shuō)明:
(1) XML文件驗(yàn)證(XML Validator)。
XML文件用來(lái)存儲(chǔ)和交換數(shù)據(jù),采用層化關(guān)系,允許每個(gè)節(jié)點(diǎn)具有屬性,使動(dòng)態(tài)參數(shù)容易被獲得。XML文件定義相關(guān)數(shù)據(jù)信息,標(biāo)簽名是模板中待替換參數(shù),標(biāo)簽值則用于代替模板中待替換的參數(shù)[9]。
利用XML Schema對(duì)XML文件的語(yǔ)法格式及有效性進(jìn)行驗(yàn)證,以保證代碼生成的質(zhì)量。XML Schema指定XML文檔所允許的組織結(jié)構(gòu)和必須包含的內(nèi)容,如:文檔中元素屬性、子元素的數(shù)量、屬性等。
(2) 模板文件。
在采用JET語(yǔ)言編寫模板文件時(shí),JET使用類JSP的語(yǔ)法,包括目標(biāo)代碼中的相同部分及各JET標(biāo)簽,可接受輸入對(duì)象作為參數(shù),可直接使用Java代碼執(zhí)行循環(huán)、聲明變量或執(zhí)行邏輯流程控制(腳本)[10] 。
JET支持Xpath查詢語(yǔ)言,標(biāo)簽中select屬性通過(guò)括號(hào)({ 和 })包含動(dòng)態(tài)的XPath表達(dá)式,對(duì)XML文檔中標(biāo)簽名和標(biāo)簽值進(jìn)行解析,讀取相關(guān)元素及屬性信息。
(3) 控制文件。
JET是功能強(qiáng)大且靈活的模板引擎,包裝在〦clipse建??蚣蹺MF之內(nèi),通過(guò)控制文件main.jet控制代碼的生成。JET編譯器為每一個(gè)代碼模板創(chuàng)建一個(gè)Java源文件,并在生成代碼之前自動(dòng)將代碼模板編譯成JavaClass文件,然后接受用戶輸入的參數(shù),產(chǎn)生目標(biāo)代碼??刂莆募凶钪匾臉?biāo)記是
3 代碼生成系統(tǒng)的實(shí)際驗(yàn)證
[BT3]3.1 代碼生成系統(tǒng)的總體結(jié)構(gòu)
以一個(gè)簡(jiǎn)單的Web信息發(fā)布系統(tǒng)為例,利用本文代碼生成系統(tǒng),可生成各層目標(biāo)代碼。當(dāng)業(yè)務(wù)對(duì)象發(fā)生變更或需要維護(hù)時(shí),只需要修改相關(guān)代碼生成系統(tǒng)的輸入模型就可以重新生成目標(biāo)代碼,使Web應(yīng)用的可維護(hù)性大大提高。
該代碼生成系統(tǒng)的總體結(jié)構(gòu)如圖5所示,主要包含模型庫(kù)、模板轉(zhuǎn)換庫(kù)、代碼生成器三大部分。
模型庫(kù)用于存放描述數(shù)據(jù)模型信息的XML文件,模板轉(zhuǎn)換庫(kù)中,以目錄樹(shù)的形式存放不同類別的模板;另外,模板轉(zhuǎn)換庫(kù)還存放有成熟的,具有特定功能的代碼片斷,有使用需要時(shí),將其綁定到模板中的相應(yīng)位置。代碼生成器通過(guò)控制文件,從模型庫(kù)選擇需要的XML文件,模板轉(zhuǎn)換庫(kù)選擇相應(yīng)的模板文件,從而生成Web應(yīng)用。
模型庫(kù)以及模板轉(zhuǎn)換庫(kù)的采用能夠提高XML文件和各類型模板文件的使用率,從而提高代碼生成系統(tǒng)的可維護(hù)性及可擴(kuò)展性。
[BT3]3.2 代碼生成系統(tǒng)各部分介紹
[BT4]3.2.1 數(shù)據(jù)模型的輸入及驗(yàn)證
數(shù)據(jù)模型包含用戶需求的所有數(shù)據(jù)源,前期的數(shù)據(jù)源越準(zhǔn)確、豐富,其結(jié)果也就越符合下一道工序的要求。因此,只有對(duì)系統(tǒng)的模型描述得準(zhǔn)確和完整,才能更準(zhǔn)確地生成Web應(yīng)用代碼。本代碼生成系統(tǒng)針對(duì)完整的Web應(yīng)用,因此XML文件中包含了用戶所提供的Web應(yīng)用各模塊全部信息。
以下所示的程序中XML文件按照用戶需求將數(shù)據(jù)對(duì)象的信息分成幾個(gè)模塊進(jìn)行描述,程序中展示了代碼生成系統(tǒng)輸入XML文件的部分內(nèi)容,包含欄目、文章、用戶等模塊。
對(duì)于每一個(gè)模塊,在具體描述上都與Web應(yīng)用的三層結(jié)構(gòu)相對(duì)應(yīng),分別從視圖層、控制層和模型層三方面對(duì)系統(tǒng)模型進(jìn)行描述。
據(jù)此,XML文件分為四層進(jìn)行描述,以欄目模塊的模型層為例,四層分別為Webinfo,App,Model,〢ttr。其中,標(biāo)簽名,如Attr層的name,type是模板中待替換的參數(shù),而標(biāo)簽值,如ColumnID,ColumnName,String則用于代替模板中待替換的參數(shù)。這些描述表示欄目模塊模型層代碼中包含兩個(gè)屬性,分別為ColumnID,ColumnName,類型都是String。
Webinfo[CD*2]PSM層指定系統(tǒng)XML文件中Schema 定義書(shū)的位置和名稱。只有通過(guò)Schema驗(yàn)證,生成過(guò)程才能順利進(jìn)行。
[BT4]3.2.2 模板文件
根據(jù)第1.2節(jié)對(duì)代碼生成系統(tǒng)目標(biāo)代碼的分析,可以歸納出需要抽象的模板,主要有:
視圖層:add,list,update頁(yè)面模板;
控制層:add,delete,update,query的Servlet模板;
模型層:entity模板。
[JP2]以模型層為例,對(duì)于XML文件中包含的幾個(gè)模塊,都對(duì)應(yīng)著相同的模板文件,如以下程序所示。select屬性包含Xpath路徑,通過(guò)路徑表達(dá)式可得到XML文件中的相應(yīng)信息。
[BT4]3.2.3 控制文件
代碼生成器控制文件如以下程序所示。
控制文件指定模板文件及生成代碼的路徑及名稱,執(zhí)行時(shí)選定輸入文件webinfo.xml,即可生成所需代碼文件。由第3.2.2節(jié)所示程序可知,根元素Webinfo[CD*2]PSM下包含三個(gè)app元素,則利用
同樣,對(duì)于控制層而言,利用寫好的模板文件delete.jet,add.jet,update.jet,query.jet,可以通過(guò)代碼生成器生成各個(gè)模塊的delete,add,update,query代碼文件;對(duì)于視圖層而言,利用模板文件jspadd.jet,list.jet,jspupdate.jet,即可生成相應(yīng)添加、列表、修改等頁(yè)面代碼。
這樣,通過(guò)代碼生成系統(tǒng)的使用,大大減少了手工編寫重復(fù)代碼,提高了軟件開(kāi)發(fā)的效率。
4 結(jié) 語(yǔ)
在此設(shè)計(jì)了一種基于MVC模式的新型Web應(yīng)用框架結(jié)構(gòu),將Web應(yīng)用分為視圖層、控制層、模型層,每一層都有明確分工,層次清晰,結(jié)構(gòu)明顯。在各層中,將大量的通用操作封裝在抽象類中,具體業(yè)務(wù)對(duì)象繼承抽象類實(shí)現(xiàn)功能,使代碼更為簡(jiǎn)潔、清晰。這樣,涉及到業(yè)務(wù)對(duì)象的代碼通過(guò)代碼生成器生成,進(jìn)一步減少重復(fù)性代碼的編碼量。
該代碼生成系統(tǒng)已經(jīng)在一個(gè)Web應(yīng)用系統(tǒng)的開(kāi)發(fā)項(xiàng)目中經(jīng)過(guò)測(cè)試和檢驗(yàn)。實(shí)踐證明,使用該代碼生成系統(tǒng)開(kāi)發(fā)Web應(yīng)用,可以大幅度提高Web應(yīng)用開(kāi)發(fā)的質(zhì)量和效率,但本文所研究的代碼生成系統(tǒng),只能生成具有增加、刪除、修改、查詢功能的Web應(yīng)用,對(duì)于更加復(fù)雜的需求,還需進(jìn)一步擴(kuò)充模板庫(kù),以及對(duì)XML文件的描述語(yǔ)言進(jìn)一步細(xì)化。
要實(shí)現(xiàn)可以滿足更多需求的Web應(yīng)用代碼生成系統(tǒng),還需要進(jìn)一步更深入的工作。
參 考 文 獻(xiàn)
[1]孫茂增,李鳳華,都婧.基于Velocity的J2EE應(yīng)用代碼生成系統(tǒng)[J].儀器儀表用戶,2008,15(1):105[CD*2]106.
[2]Hailpern B,Tarr P.Model[CD*2]driven Development: the Good,the Bad and the Ugly[J].IBM Systems Journal,2006,48(3):451[CD*2]461.
[3]李憲軍.基于J2EE的Web應(yīng)用框架研究[D].大連:大連海事大學(xué),2007.
[4]王廣峰.模型驅(qū)動(dòng)的J2EE Web應(yīng)用生成器的設(shè)計(jì)與實(shí)現(xiàn)[D].濟(jì)南:山東大學(xué),2006.
[JP2][5]Rod Johnson.J2EE Development Frameworks[J].〤omputer,2005,1(1):107[CD*2]110.[JP]
[JP2][6]Ken Kennedy,Bradley Broom,Arun Chauhan.Telescoping Languages:A System for Automatic Generation of Domain Languages[J].Procedding of the IEEE,2005,93(2):266[CD*2]297.[JP]
[7]陳翔,王學(xué)斌,吳泉源.代碼生成技術(shù)在MDA中的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2006(1):148[CD*2]149.
[JP2][8]Hugge N,Wagner B.A New Function Block Modeling Language Based on Petri Nets for Automatic Code Generation [J].IEEE Trans.on Industrial Informatics,2005,1(4):226[CD*2]237.[JP]
[9]戴周林.DaPerM:一種用MDA開(kāi)發(fā)數(shù)據(jù)持久層應(yīng)用的方法的設(shè)計(jì)與實(shí)現(xiàn)[D].上海:復(fù)旦大學(xué),2006.
[10]尹彥均.Web應(yīng)用代碼自動(dòng)生成平臺(tái)中代碼生成系統(tǒng)的研究與實(shí)現(xiàn)[D].北京:北京工業(yè)大學(xué),2007.
作者簡(jiǎn)介 宋 微 女,1982年出生,河北保定人,碩士研究生。研究方向?yàn)閃eb應(yīng)用與基礎(chǔ)。
李亞芬 女,1963年出生,北京人,高級(jí)工程師,碩士研究生。主要研究領(lǐng)域?yàn)閃eb應(yīng)用與基礎(chǔ)、數(shù)據(jù)庫(kù)、計(jì)算機(jī)控制系統(tǒng)。