張文江,何政偉,李旭龍
(1.成都理工大學(xué)地質(zhì)災(zāi)害防治與地質(zhì)環(huán)境保護(hù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,四川成都610059;2.成都理工大學(xué)地球物理學(xué)院,四川成都610059)
數(shù)據(jù)采集實(shí)現(xiàn)屏幕顯示元素?cái)?shù)據(jù)到數(shù)據(jù)對(duì)象屬性的轉(zhuǎn)換,而數(shù)據(jù)顯示則實(shí)現(xiàn)數(shù)據(jù)對(duì)象屬性到屏幕顯示元素?cái)?shù)據(jù)的轉(zhuǎn)換,二者統(tǒng)稱界面元素與數(shù)據(jù)對(duì)象之間的數(shù)據(jù)交換。界面元素與數(shù)據(jù)對(duì)象之間的數(shù)據(jù)交換是各類系統(tǒng)的普遍功能,當(dāng)前有多種技術(shù)模式實(shí)現(xiàn)這些功能,比如“拷貝—粘貼—修改”模式、基于框架的模式、基于委托與事件方法的技術(shù)等。對(duì)于數(shù)據(jù)項(xiàng)少、界面簡(jiǎn)單的系統(tǒng),可以采用“拷貝—粘貼—修改”的編程模式;典型的框架,如Struts、Spring,都提供了表現(xiàn)層 (界面)和業(yè)務(wù)層 (數(shù)據(jù)對(duì)象)之間的自動(dòng)數(shù)據(jù)交換功能,并被廣泛用于Web系統(tǒng)的開(kāi)發(fā)[1-3];也有采用基于委托與事件方法的數(shù)據(jù)交換模式系統(tǒng)[4],但這類系統(tǒng)比較少。上述這些方法都具有比較大的局限性:在人機(jī)交互界面復(fù)雜、屏幕顯示的數(shù)據(jù)項(xiàng)很多的情況下,“拷貝—粘貼—修改”模式產(chǎn)生的代碼冗長(zhǎng)、相似度高,造成程序調(diào)試疲勞,隱含錯(cuò)誤難于發(fā)現(xiàn),調(diào)試、維護(hù)工作量大;而struts、spring是基于web系統(tǒng)的,不支持winform,另外,對(duì)單選、多選等復(fù)雜數(shù)據(jù)項(xiàng),struts、spring的支持較弱;基于委托與事件的方法太過(guò)復(fù)雜。
基于反射技術(shù)實(shí)現(xiàn)數(shù)據(jù)交換的公共函數(shù),各個(gè)窗體界面通過(guò)對(duì)公共函數(shù)的調(diào)用,完成winfrom窗體或web頁(yè)面的顯示界面元素與數(shù)據(jù)對(duì)象之間的數(shù)據(jù)交換。這種方法能夠極大減少?gòu)?fù)雜界面在數(shù)據(jù)顯示、數(shù)據(jù)修改方面的程序代碼,減少程序調(diào)試工作量,提高工作效率,提高系統(tǒng)的可靠性。
反射是本文提出的數(shù)據(jù)交換技術(shù)的基礎(chǔ),下面先從反射的概念開(kāi)始。
反射就是程序在運(yùn)行時(shí)刻能夠查詢類型的信息,包括類型狀態(tài) (屬性)、類型行為 (方法)、事件、構(gòu)造函數(shù)等信息。它本質(zhì)上是分析程序集中的元數(shù)據(jù)表的過(guò)程,發(fā)現(xiàn)程序集的類型和類型成員的信息[4]。它是一種晚綁定機(jī)制,程序員在寫代碼的時(shí)候還不知道或不能確定的一些信息,由代碼在運(yùn)行的時(shí)候確定。當(dāng)前軟件開(kāi)發(fā)的兩大體系,Java和.Net都具有強(qiáng)大的Reflection機(jī)制,并且得到了廣泛的應(yīng)用[5-10]。
下面以一個(gè)簡(jiǎn)單的例子,說(shuō)明反射的基本思想。設(shè)系統(tǒng)中有一個(gè)StudentClass類,其定義如圖1所示。
圖1 學(xué)生類
對(duì)象obj是程序運(yùn)行過(guò)程中自動(dòng)生成的,其類型在編譯的時(shí)候未知,所以程序代碼不知道obj的屬性、方法,也就不能直接訪問(wèn)obj的屬性和方法。但是程序在運(yùn)行時(shí)通過(guò)反射可以獲得obj的類型、屬性、方法等信息,通過(guò)屬性和方法的名稱實(shí)現(xiàn)對(duì)obj的管理。如果obj的類型為Student-Class,就可以通過(guò) StudentClass類的屬性名稱“No”、“Name”讀寫obj的No屬性值,通過(guò)“GetAge”方法訪問(wèn)obj的GetAge函數(shù),獲得學(xué)生的年齡信息。
由于本文實(shí)現(xiàn)的系統(tǒng)是基于C#的B/S系統(tǒng),因此,本文提供的算法將以基于C#語(yǔ)言的Asp.Net為例,實(shí)現(xiàn)Web頁(yè)面可視控件與C#數(shù)據(jù)對(duì)象之間的數(shù)據(jù)交換。數(shù)據(jù)庫(kù)中的數(shù)據(jù)與可視控件之間的數(shù)據(jù)交換問(wèn)題,可用類似的方式實(shí)現(xiàn),或者通過(guò)建立數(shù)據(jù)庫(kù)記錄與C#數(shù)據(jù)對(duì)象之間的映射關(guān)系,實(shí)現(xiàn)數(shù)據(jù)庫(kù)記錄與C#數(shù)據(jù)對(duì)象、C#數(shù)據(jù)對(duì)象與可視控件之間的雙層數(shù)據(jù)交換。
ASP.Net頁(yè)面對(duì)象,不管是標(biāo)準(zhǔn)的HTML對(duì)象,還是Asp.net封裝對(duì)象,只要加上Runat=Server,C#代碼就能訪問(wèn)該控件的屬性,在系統(tǒng)運(yùn)行的過(guò)程中動(dòng)態(tài)獲取頁(yè)面控件類型、對(duì)象嵌套關(guān)系等信息。實(shí)際上,C#能夠全面操控整個(gè)ASP.Net文檔:遍歷整個(gè)DOM文檔,并對(duì)DOM文檔的任意對(duì)象進(jìn)行控制。
另一方面,對(duì)于C#數(shù)據(jù)對(duì)象,采用反射技術(shù),按封裝的原則,通過(guò)屬性的getter、setter方法,實(shí)現(xiàn)屬性字段值的讀、寫操作。
由此可見(jiàn),ASP.Net頁(yè)面特點(diǎn)和C#反射技術(shù),為頁(yè)面元素與數(shù)據(jù)對(duì)象屬性之間的數(shù)據(jù)交換提供了可能。關(guān)鍵是如何在頁(yè)面元素與數(shù)據(jù)對(duì)象之間建立起通信的橋梁。
本文使用“名稱關(guān)聯(lián)法”建立頁(yè)面控件與數(shù)據(jù)對(duì)象屬性之間的關(guān)聯(lián),使Web頁(yè)面可視控件的ID與數(shù)據(jù)對(duì)象屬性名稱相同 (或者其它類似的規(guī)則),從而建立起它們之間的對(duì)應(yīng)關(guān)系。程序在遍歷Web頁(yè)面可視控件的時(shí)候,根據(jù)可視控件的ID,找到數(shù)據(jù)對(duì)象的屬性名稱,再通過(guò)C#提供的反射機(jī)制,查詢數(shù)據(jù)對(duì)象該屬性的相關(guān)信息,讀取、或設(shè)置該屬性的值,從而實(shí)現(xiàn)可視控件顯示值與數(shù)據(jù)對(duì)象屬性值之間的相互數(shù)據(jù)交換。
圖2是這種基于名稱對(duì)應(yīng)關(guān)系的簡(jiǎn)化圖示說(shuō)明,其中界面元素ID=Property1對(duì)應(yīng)類ObjectClass的屬性Property1,界面元素ID=Property2對(duì)應(yīng)類ObjectClass的屬性Property2,界面元素 ID=Property3對(duì)應(yīng)類ObjectClass的屬性Property3。
圖2 基于名稱對(duì)應(yīng)的顯示元素與數(shù)據(jù)對(duì)象關(guān)系
在闡述原理后,下面首先詳細(xì)分析各種顯示控件的處理方法,然后給出實(shí)現(xiàn)算法。
(1)簡(jiǎn)單控件
簡(jiǎn)單控件是指直接顯示數(shù)據(jù)屬性值的控件,這類控件使用最廣,如TextBox、HtmlInputText、Label等,這種顯示控件與數(shù)據(jù)對(duì)象之間的數(shù)據(jù)交換簡(jiǎn)單、直接。
顯示控件命名規(guī)則:ID名稱就是數(shù)據(jù)對(duì)象的屬性名稱。
如果屬性數(shù)據(jù)類型為字符串型,可以通過(guò)設(shè)置Max-Length屬性來(lái)限制顯示長(zhǎng)度。如果未設(shè)置MaxLength,或MaxLength設(shè)置為0,表示長(zhǎng)度不受限制。
如果屬性數(shù)據(jù)類型為小數(shù),可以通過(guò)設(shè)置精度屬性Precision來(lái)設(shè)置小數(shù)位數(shù)。
顯示對(duì)象事例:
<asp:TextBox ID="V1"runat="server"Max-Length="30" ></asp:TextBox>
<asp:TextBox ID="V2"runat="server"Precision="5.2"></asp:TextBox>
<asp:TextBox ID="V3"runat="server" ></asp:TextBox>
其中顯示對(duì)象ID名稱對(duì)應(yīng)數(shù)據(jù)對(duì)象屬性名稱。
(2)單選控件
單選控件也是常用的顯示控件,在屏幕上表現(xiàn)為一組單選按鈕,對(duì)應(yīng)一個(gè)數(shù)據(jù)對(duì)象屬性。與簡(jiǎn)單控件不一樣的是,簡(jiǎn)單控件與數(shù)據(jù)對(duì)象屬性是1對(duì)1的關(guān)系,而單選一般是多對(duì)1的關(guān)系:多個(gè)單選框?qū)?yīng)于一個(gè)數(shù)據(jù)對(duì)象屬性。
為了簡(jiǎn)化編程代碼,本方案用一個(gè)DIV容器包含這一組單選按鈕,由DIV容器代表這一組單選框。
該DIV命名規(guī)則:DIV的ID名稱設(shè)置為數(shù)據(jù)對(duì)象屬性名稱,同時(shí),為了標(biāo)識(shí)該DIV包含的是單選按鈕,該DIV增加一個(gè)固定屬性:groupClass="radiogroup"。
C#遍歷Web頁(yè)面時(shí),一旦發(fā)現(xiàn)屬性groupClass=radiogroup,就用DIV的ID作為數(shù)據(jù)對(duì)象屬性名稱,然后通過(guò)反射查找數(shù)據(jù)對(duì)象相應(yīng)屬性的值val,再遍歷DIV的radio子對(duì)象集,如果找到某radio的值與val相同,設(shè)置該單選按鈕的checked狀態(tài)為true。
顯示對(duì)象事例:
<div id="hazardType"runat="server"group-Class="radioGroup" >
<asp:RadioButton ID="sel1"Text="滑坡" runat="server"/>
<asp:RadioButton ID="sel2"Text="崩塌"runat="server"/>
<asp:RadioButton ID="sel3"Text="泥石流"runat="server"/>
</div>
要點(diǎn):
1)Div對(duì)應(yīng)數(shù)據(jù)對(duì)象屬性,單選按鈕作為div的子對(duì)象;
2)div的id名稱與數(shù)據(jù)對(duì)象的屬性名稱1:1對(duì)應(yīng);
3)groupClass="radioGroup"是固定屬性;
4)單選按鈕的ID命名沒(méi)有限制
(3)多選控件
與單選類似,一組多選按鈕對(duì)應(yīng)一個(gè)數(shù)據(jù)對(duì)象屬性,因此,在進(jìn)行Web頁(yè)面設(shè)計(jì)時(shí),也要用一個(gè)DIV容器把多個(gè)多選按鈕組織在一起,并且該DIV的ID名稱為數(shù)據(jù)對(duì)象屬性的名稱,該DIV也要增加一個(gè)固定變屬性:groupClass="checkgroup"。
C#遍歷Web頁(yè)面時(shí),一旦發(fā)現(xiàn)屬性groupClass=checkgroup,就用DIV的ID來(lái)查找數(shù)據(jù)對(duì)象的相應(yīng)屬性值val,再遍歷DIV的checkbotton子對(duì)象,如果該按鈕的值在val中,則設(shè)置該按鈕的Checked屬性為true,否則為false。
顯示對(duì)象事例:
<div id="scope"runat="server"groupClass="checkGroup" >
<asp:CheckBox ID="居民點(diǎn)" runat="server"/>
<asp:CheckBox ID="工廠"runat="server"/>
<asp:CheckBox ID="農(nóng)田"runat="server"/>
<asp:CheckBox ID="水利工程"runat="server"/>
</div>
要點(diǎn):
1)Div對(duì)應(yīng)數(shù)據(jù)對(duì)象屬性,多選按鈕作為div的子對(duì)象;
2)div的id名稱一定要與數(shù)據(jù)對(duì)象的屬性名稱對(duì)應(yīng);
3)groupClass="checkGroup"是固定屬性;
4)單選按鈕的ID命名沒(méi)有限制
(4)下拉列表
下拉列表是一種填充了數(shù)據(jù)的列表,填充的數(shù)據(jù)類型是一種“代碼—名稱”數(shù)據(jù)結(jié)構(gòu),其特點(diǎn)是下拉列表顯示名稱,數(shù)據(jù)對(duì)象保存代碼。
如果數(shù)據(jù)對(duì)象中保存的值就是顯示名稱,可以認(rèn)為是“代碼—名稱”的一種特殊情況:即代碼與名稱相同。
下拉列表可以在設(shè)計(jì)時(shí)通過(guò)人工輸入建立,也可以在程序運(yùn)行時(shí)由代碼動(dòng)態(tài)生成。
下拉列表與數(shù)據(jù)對(duì)象屬性具有1:1關(guān)系,下拉列表的ID名稱與對(duì)應(yīng)的數(shù)據(jù)對(duì)象屬性名稱相同。顯示對(duì)象事例:
<asp:DropDownList ID="scale"runat="server" >
<asp:ListItem Value="01" >特大型</asp:ListItem>
<asp:ListItem Value="02" >大型</asp:ListItem>
<asp:ListItem Value="03" >中小型</asp:ListItem>
</asp:DropDownList>
要點(diǎn):
(5)下拉列表的id名稱與數(shù)據(jù)對(duì)象的屬性名稱對(duì)應(yīng);
在本系統(tǒng)中,單選結(jié)果以單選按鈕顯示的名稱以字符串的形式保存在數(shù)據(jù)對(duì)象中,多選結(jié)果以多選按鈕顯示的名稱保存,并以逗號(hào) (,)分割多選值。為了算法敘述的方便,引入“規(guī)范子串”的概念,嚴(yán)格定義多選值的存儲(chǔ)格式。
定義1:字符串 s是字符串 f的規(guī)范子串的充要條件是:
f以 s結(jié)尾或者 s加逗號(hào) (,)形成的新串是 f的子串。
入口參數(shù):
WebControl:頁(yè)面控件,子控件命名規(guī)則符合上面提出的要求。
Obj:C#數(shù)據(jù)對(duì)象。
Function WebPageToEntity(WebControl,Obj)
{
通過(guò)反射,獲得數(shù)據(jù)對(duì)象Obj的類型T;
獲得WebControl的ID,并賦到變量pname;
如果ID不符號(hào)上面定義的規(guī)則
{
對(duì)WebControl的子對(duì)象,遞歸調(diào)用本函數(shù)
Return
}
取WebControl表示的數(shù)據(jù)類型,dataType;
如果dataType不是預(yù)定義的處理的數(shù)據(jù)類型,返回;
Case dataType是簡(jiǎn)單數(shù)據(jù):
取WebControl的值,并賦到val;
通過(guò)反射,把val保存到Obj的pname屬性;
Case dataType是單選數(shù)據(jù):
查詢WebControl的單選子控件,取選中的單選按鈕的值,并賦到val;
通過(guò)反射,把val保存到Obj的pname屬性;
Case dataType是多選數(shù)據(jù):
查詢WebControl的多選子控件,組合所有選中的多選按鈕的值,并賦到val;
通過(guò)反射,把val保存到Obj的pname屬性;
Case dataType是下拉列表數(shù)據(jù):
取下拉列表選擇的值,并賦到val;
通過(guò)反射,把val保存到Obj的pname屬性;
Case其它:
不予處理;
}
入口參數(shù):
WebControl:頁(yè)面控件,子控件命名規(guī)則符合上面提出的要求。
Obj:C#數(shù)據(jù)對(duì)象。
Function EntityToWebPage(WebControl,Obj)
{
通過(guò)反射,獲得數(shù)據(jù)對(duì)象Obj的類型T;
獲得WebControl的ID,并賦到變量pname;
如果ID不符號(hào)上面定義的規(guī)則
{
對(duì)WebControl的子對(duì)象,遞歸調(diào)用本函數(shù)
Return
}
取WebControl表示的數(shù)據(jù)類型,dataType;
如果dataType不是預(yù)定義的處理的數(shù)據(jù)類型,返回;
Case dataType是簡(jiǎn)單數(shù)據(jù):
通過(guò)反射,取Obj的pname屬性值,并賦值到val
把val設(shè)置WebControl控件;Case dataType是單選數(shù)據(jù):
通過(guò)反射,取Obj的pname屬性值,并賦值到val
查詢WebControl的單選子控件,如果某子控件的text屬性值與val相等,設(shè)置該子控件的Checked狀態(tài)為true;
Case dataType是多選數(shù)據(jù):
通過(guò)反射,取Obj的pname屬性值,并賦值到val
對(duì)WebControl的所有多選子控件執(zhí)行:
如果該子控件的text屬性是val的一個(gè)“規(guī)范子串”,
選中該子控件,否則不選中該子控件
Case dataType是下拉列表數(shù)據(jù):
通過(guò)反射,取Obj的pname屬性值,并賦值到val
把val賦值到下拉列表選擇的值
Case其它:
不予處理;
}
貴州省地質(zhì)災(zāi)害數(shù)據(jù)管理系統(tǒng)管理的災(zāi)害包括:滑坡、泥石流、崩塌、地裂縫、地面沉降、地面塌陷等6種,每種地質(zhì)災(zāi)害的屬性數(shù)量多達(dá)200個(gè)以上,并且屬性類型復(fù)雜,單選屬性、多選屬性、下拉屬性多,造成顯示界面非常復(fù)雜。在項(xiàng)目原型階段,采用“拷貝—粘貼—修改”方式,僅實(shí)現(xiàn)滑坡災(zāi)害數(shù)據(jù)對(duì)象到web頁(yè)面的顯示就寫了1850多行代碼,并且因?yàn)閷傩蕴啵a相似度又極高,導(dǎo)致代碼中存在很多難于發(fā)現(xiàn)的低級(jí)錯(cuò)誤,調(diào)試極其困難,最后只能徹底放棄這種方法。
通過(guò)討論,采用了基于反射的數(shù)據(jù)交換方法,只用了兩個(gè)公共函數(shù),就實(shí)現(xiàn)了所有地質(zhì)災(zāi)害屬性的顯示與修改工作。函數(shù)WebPageToEntity實(shí)現(xiàn)web頁(yè)面顯示內(nèi)容賦值到數(shù)據(jù)對(duì)象,代碼只有160行;函數(shù)EntityToWebPage實(shí)現(xiàn)數(shù)據(jù)對(duì)象到頁(yè)面的顯示,代碼只有158行。總共300多行代碼,實(shí)現(xiàn)了所有Web頁(yè)面與數(shù)據(jù)對(duì)象之間的數(shù)據(jù)交換功能。并且這300多行代碼結(jié)構(gòu)嚴(yán)謹(jǐn)、邏輯性強(qiáng),調(diào)試、排錯(cuò)也很容易,系統(tǒng)的正確性得到了極大提高。
數(shù)據(jù)對(duì)象通過(guò)代碼生成工具,直接從數(shù)據(jù)庫(kù)生成。設(shè)計(jì)人員只把頁(yè)面設(shè)計(jì)好,并按規(guī)范命名各種控件,最后通過(guò)調(diào)用WebPageToEntity和EntityToWebPage函數(shù),實(shí)現(xiàn)了數(shù)據(jù)對(duì)象與顯示元素之間的數(shù)據(jù)自動(dòng)交換。數(shù)據(jù)對(duì)象的持久化通過(guò)iBatis實(shí)現(xiàn)。這樣,CRUD部分的代碼量和測(cè)試量就變得很小了,極大減少了系統(tǒng)開(kāi)發(fā)的工作量。
文章提出了基于反射的顯示控件與數(shù)據(jù)對(duì)象之間的數(shù)據(jù)交換原理和方法,并對(duì)文本框、單選框、多選框、下拉列表等常用顯示控件的處理作了深入、詳細(xì)的討論,設(shè)計(jì)了實(shí)現(xiàn)數(shù)據(jù)交換的算法。
該方法具有普遍意義,適用于各種系統(tǒng)的CRUD操作,尤其對(duì)數(shù)據(jù)項(xiàng)多、界面復(fù)雜的系統(tǒng)能夠極大地減少編程代碼,減少程序錯(cuò)誤,提高系統(tǒng)的正確性和穩(wěn)定性。
該方法不局限于C#,可適用于支持反射機(jī)制的任何語(yǔ)言 (如Java),也不局限于Web系統(tǒng),還可適用于winform桌面系統(tǒng)。
[1]GUO Guangjun,XU Zhangfa,YANG Siqing.Digitized archives management system for teaching evaluation based on struts-hibemate architecture[J].Computer Engineering and Design,2010,31(10):2358-2362(in Chinese).[郭廣軍,徐章法,羊四清.基于Struts-Hibernate構(gòu)架的數(shù)字化教學(xué)評(píng)估檔案管理系統(tǒng)[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(10):2358-2362.]
[2]ZHOU Xiangbing,YANGXiaoping,YANGXingjiang.Application and implementation of general framework based on web layering structure[J].Computer Engineering and Design,2008,29(7):772-775(in Chinese).[任曉鵬,趙文兵,張春平.基于框架的Web系統(tǒng)開(kāi)發(fā)研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,29(7):772-775.]
[3]ZUO Wenming,WANG Qingqiang,WU Yingliang.Use land management information system based on struts[J].Computer Engineering and Design,2008,29(19):4972-4974(in Chinese).[左文明,王慶強(qiáng),吳應(yīng)良,等.基于Struts的用地管理信息系統(tǒng)[J],計(jì)算機(jī)工程與設(shè)計(jì),2008,29(19):4972-4974.]
[4]CHEN Nannan.Research and implementation of data transmission with C# [J].Computer and Information,2011(11):67-68(in Chinese).[陳南南.基于C#的對(duì)象間數(shù)據(jù)傳遞方法分析及實(shí)現(xiàn) [J].電腦與信息,2011(11):67-68.]
[5]ZHANG Zhi,DU Jingkang,ZUO Fengjun,Research on.Net reflection based GISplugin technology[J].Science of Surveying and Mapping,2011,36(4):151-152(in Chinese).[章志,都金康,卓鳳軍.基于.NET反射機(jī)制的GIS插件技術(shù)研究[J].測(cè)試科學(xué),2011,36(4):151-152.]
[6]ZHOU Xiangbing,YANG Xiaoping,YANGXingjiang.Application and implementation of general framework based on web layering structure[J].Computer Engineering and Design,2008,29(7):1859-1862(in Chinese).[周相兵,楊小平,楊興江.基于Web分層結(jié)構(gòu)的通用框架實(shí)現(xiàn)及應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(7):1859-1862.]
[7]QIN Pengtao,WANG Suwen.Application of simple factory pattern in data access layer [J].Computer Engineering and Design,2009,30(7):1799-1801(in Chinese).[秦澎濤,蘇文.簡(jiǎn)單工廠模式在數(shù)據(jù)訪問(wèn)層中的應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(7):1799-1801.]
[8]LOU Buye.Design of auto-marking software framework for Java programming questions [J].Computer Engineering and Design,2010,31(24):5343-5346(in Chinese).[婁不夜.Java編程題自動(dòng)判分軟件框架的設(shè)計(jì) [J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(24):5343-5346.]
[9]XIAO Lu,LONG Pengfei.The research of AOP based on Java dynamic proxy[J].Micro Computer Information,2011,27(2):211-213(in Chinese).[肖露,龍鵬飛.基于JAVA的動(dòng)態(tài)代理實(shí)現(xiàn)的AOP的研究 [J].微計(jì)算機(jī)信息,2011,27(2):211-213.]
[10]DUAN Chao,QIAN Gang,SUN Yijie.Practice and application of the technology of reflection ln database operation[J].Process Automation Instrumentation,2010,31(6):17-20(in Chinese).[段超,錢剛,孫怡劫.反射技術(shù)在數(shù)據(jù)庫(kù)操作方面的實(shí)踐與應(yīng)用[J].自動(dòng)化儀表,2010,31(6):17-20.]
[11]Nagel C.Professional C#[D].6nd ed.Beijing:Tsinghua University Press,2008:10-205(in Chinese).[(美)內(nèi)格爾(Nagel.C).C#高級(jí)編程[D].6版.北京:清華大學(xué)出版社,2008:10-205.]
[12]WANG Jianguo,WANG Jianyin,Struts+Spring+Hibernate frameworks and application development[D].Beijing:Tsinghua University Press,2011:1-638(in Chinese).[王建國(guó),王建英.Struts+Spring+Hibernate框架及應(yīng)用開(kāi)發(fā) [D].北京,清華大學(xué)出版社,2011:1-638.]