陳 印,周 蓉,朱 倩
(四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川 遂寧 629000)
ASP.NET頁(yè)面臨時(shí)數(shù)據(jù)共享需求與解決方案研究
陳 印,周 蓉,朱 倩
(四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川 遂寧 629000)
探討ASP.NET站點(diǎn)中WEB頁(yè)面對(duì)應(yīng)用程序、會(huì)話以及頁(yè)面級(jí)別的臨時(shí)數(shù)據(jù)共享需求,提出基于Application、Session以及ViewState等技術(shù)的數(shù)據(jù)共享解決方案.
ASP.NET;Application;Session;ViewState;數(shù)據(jù)共享
在A S P.NE T站點(diǎn)中,使用數(shù)據(jù)庫(kù)是核心數(shù)據(jù)共享的最佳方案.然而,除了核心數(shù)據(jù)以外,站點(diǎn)頁(yè)面中頻繁使用的變量、頁(yè)面交互中使用的參數(shù)等臨時(shí)數(shù)據(jù)同樣需要共享,而且這些數(shù)據(jù)的共享并不適合使用數(shù)據(jù)庫(kù).縱觀A S P.NE T站點(diǎn)中的臨時(shí)數(shù)據(jù)共享技術(shù),不僅包含了傳統(tǒng)的F o rm和Q u e r y S t r in g技術(shù),更包括了.NE T F ram e W o rk框架下面向?qū)ο蟮腁 ppl i ca t tion、S ession以及V ie wS t a te等一系列特有的技術(shù).然而不同級(jí)別的數(shù)據(jù)共享需求所適用的共享技術(shù)并非等同,因此,本文從共享需求角度來(lái)分析不同場(chǎng)合下頁(yè)面臨時(shí)數(shù)據(jù)的共享解決方案.
2.1 WEB應(yīng)用程序級(jí)別
在W EB項(xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)遇到整個(gè)站點(diǎn)都需要共用某些數(shù)據(jù)的情況.比如,某些論壇網(wǎng)站需要統(tǒng)計(jì)站點(diǎn)訪問(wèn)量,通常情況下應(yīng)該是不同時(shí)刻每個(gè)訪問(wèn)站點(diǎn)的瀏覽器進(jìn)程都應(yīng)該能獲取到當(dāng)前訪問(wèn)量并對(duì)數(shù)據(jù)進(jìn)行增加,然后再通過(guò)某種方式儲(chǔ)存起來(lái)供下一次訪問(wèn).又比如常見(jiàn)的購(gòu)物網(wǎng)站對(duì)在線人數(shù)的統(tǒng)計(jì),一般情況下應(yīng)該是有新的用戶進(jìn)程訪問(wèn)站點(diǎn)就應(yīng)該對(duì)在線人數(shù)進(jìn)行加一操作,有用戶進(jìn)程過(guò)期就應(yīng)該對(duì)在線人數(shù)進(jìn)行減一操作.這里的“站點(diǎn)訪問(wèn)量”和“在線人數(shù)”就屬于W EB應(yīng)用程序級(jí)別需要共享的數(shù)據(jù).
2.2 會(huì)話級(jí)別
在限定時(shí)間范圍內(nèi)訪問(wèn)W EB站點(diǎn)的同一客戶端的請(qǐng)求稱為一個(gè)會(huì)話[1],在會(huì)話期間,某些數(shù)據(jù)可能需要在同一會(huì)話內(nèi)的訪問(wèn)頁(yè)面中共享使用.比如,某個(gè)用戶訪問(wèn)站點(diǎn)并登錄后,需要在訪問(wèn)期間能共享其登錄的賬戶名、賬戶類型以及訪問(wèn)級(jí)別等數(shù)據(jù),這就需要將這些數(shù)據(jù)進(jìn)行會(huì)話級(jí)別的共享,以供本次訪問(wèn)站點(diǎn)的會(huì)話自己使用.
2.3 頁(yè)面級(jí)別
W EB站點(diǎn)從一個(gè)頁(yè)跳轉(zhuǎn)到另一個(gè)頁(yè)是最常見(jiàn)的頁(yè)面交互方式.如果兩個(gè)頁(yè)面在訪問(wèn)前后需要用到相同的數(shù)據(jù),這些數(shù)據(jù)就需要進(jìn)行頁(yè)面級(jí)別的共享.頁(yè)面跳轉(zhuǎn)交互在A S P.NE T中有兩種情況:
一種是不同頁(yè)面進(jìn)行跳轉(zhuǎn)交互.比如,在新聞?wù)军c(diǎn)的新聞列表頁(yè)中點(diǎn)擊新聞標(biāo)題后跳轉(zhuǎn)到該新聞的詳情頁(yè),這兩個(gè)頁(yè)面在訪問(wèn)前后需要對(duì)新聞的關(guān)鍵數(shù)據(jù)(如新聞編號(hào))進(jìn)行共享,否則新聞詳情頁(yè)就無(wú)法獲知需要呈現(xiàn)哪條新聞.
另一種是同一頁(yè)面在刷新前后交互.比如,在查詢頁(yè)面點(diǎn)擊服務(wù)器控件(如B u t ton)按照指定條件找到查詢結(jié)果之后,又需要用服務(wù)器控件(如L in k B u t ton)實(shí)現(xiàn)上一頁(yè)和下一頁(yè)導(dǎo)航,這就需要在導(dǎo)航過(guò)程中對(duì)搜索條件進(jìn)行共享.
3.1 WEB應(yīng)用程序級(jí)別
在A S P.NE T中,站點(diǎn)應(yīng)用程序級(jí)別的數(shù)據(jù)共享可以使用A ppl i ca tion對(duì)象來(lái)進(jìn)行設(shè)置.A ppl i cation是應(yīng)用程序級(jí)的對(duì)象,它通過(guò)在服務(wù)器上建立一個(gè)狀態(tài)變量來(lái)存儲(chǔ)信息,該變量創(chuàng)建在內(nèi)存中,可供該應(yīng)用程序中的任何一個(gè)頁(yè)面訪問(wèn)[2].A ppl ica tion對(duì)象變量一般在全局配置文件(G l o bal.a s ax)的A ppl i ca tion_S t ar t事件中進(jìn)行初始化,然后在其他頁(yè)面直接訪問(wèn):
設(shè)置方法:A ppl i ca tion["變量名"]="值";
取值方法:字符變量名=A ppl i ca tion["參數(shù)名"].T o S t r in g();
A ppl i ca tion對(duì)象共享的數(shù)據(jù)是o bj e c t類型,取值時(shí)需要根據(jù)需要進(jìn)行類型轉(zhuǎn)換。如前文提到的站點(diǎn)訪問(wèn)量、在線人數(shù)等,可以分別在G l o bal. a s ax文件的S ession_S t ar t和S ession_E nd事件中獲取共享的A ppl i ca tion對(duì)象變量進(jìn)行操作,并回存修改后的變量值:
A ppl i ca tion.L o ck();//開(kāi)啟排他鎖
A ppl i ca tion["c o u nt O n"]=(int)A ppl i ca tion ["c o u nt O n"]+1;//在線人數(shù)增加
A ppl i ca tion.U n L o ck();//關(guān)閉排他鎖
此外,A S P.NE T還提供了Cac he對(duì)象用于應(yīng)用程序級(jí)別緩存臨時(shí)數(shù)據(jù),其用法與A ppl i ca tion相似,但更靈活,可以設(shè)置緩存有效時(shí)間及優(yōu)先次序.
設(shè)置方法:Cac he["變量名"]="值";
取值方法:字符變量名=Cac he["變量名"]. T o S t r in g();
設(shè)置Cac he緩存變量時(shí),可以使用以下方法設(shè)置過(guò)期策略:
Cac he.I nse r t("變量名","變量值",n ul l, D a te T i m e.N o w.Add M in u tes (10), Cac he. N o Sl idin g E xp i ra tion);
以上設(shè)置緩存變量的過(guò)期時(shí)間為現(xiàn)在開(kāi)始的10分鐘.如果緩存在N o Sl idin g E xp i ra tion設(shè)定的時(shí)間內(nèi)沒(méi)有被訪問(wèn),緩存過(guò)期,否則就不過(guò)期.
3.2 會(huì)話級(jí)別
會(huì)話級(jí)別的數(shù)據(jù)共享一般使用S ession,它是A S P.NE T中存儲(chǔ)會(huì)話級(jí)別共享數(shù)據(jù)的特有對(duì)象。
設(shè)置方法:S ession["變量名"]="值";
取值方法:字符變量=S ession["變量名"]. T o S t r in g();
如,用戶登錄成功以后可以將其賬戶名、賬戶類型和訪問(wèn)級(jí)別等數(shù)據(jù)設(shè)置到S ession對(duì)象中,在其他頁(yè)面直接從S ession中取值即可.在會(huì)話的有效期內(nèi),該數(shù)據(jù)能且僅能被該會(huì)話獨(dú)自使用.
此外,C oo k ie也可以用作會(huì)話級(jí)別的對(duì)象來(lái)共享數(shù)據(jù),用法與S ession類似,不同的是前者存儲(chǔ)在客戶端,后者存儲(chǔ)在服務(wù)器端.
3.3 頁(yè)面級(jí)別
在A S P.NE T中,不同頁(yè)面跳轉(zhuǎn)前后的數(shù)據(jù)共享與同一頁(yè)面刷新前后的數(shù)據(jù)共享視需求的不同可以采取不同的解決方案.
(1)不同頁(yè)面跳轉(zhuǎn)前后的數(shù)據(jù)共享解決方案.
通過(guò)超級(jí)鏈接或R edi r e c t方法發(fā)生的不同頁(yè)面跳轉(zhuǎn)后數(shù)據(jù)的共享(更多屬于參數(shù)的傳遞)可以使用F o rm表單或Q u e r y S t r in g來(lái)實(shí)現(xiàn),這與傳統(tǒng)的Post或Get方法使用原理比較類似.F o rm表單適合于前一頁(yè)向后一頁(yè)發(fā)送(共享)大量數(shù)據(jù)的需求,而Q u e r y S t r in g則適合少量數(shù)據(jù)的共享需求.
①F o rm表單共享數(shù)據(jù)的方法:
a.a s px頁(yè)面:R u nAt="S e rv e r"的表單中放置W EB服務(wù)器控件及數(shù)據(jù).
b.a s px頁(yè)面:通過(guò)R e q u est.F o rm["控件名"]獲取數(shù)據(jù)。
②Q u e r y S t r in g的數(shù)據(jù)共享方法:
a.a s px頁(yè) 面 :R es p onse.R edi r e c t("ne w s-De a t a i l.a s px?ne w s I D="+ne w s I D);
b.a s px頁(yè)面:st r in g ne w s I D=R e q u est.Q u e r y S-t r in g["ne w s I D"];
(2)同一頁(yè)面刷新前后的數(shù)據(jù)共享解決方案.
A S P.NE T中的V ie wS t a te對(duì)象為同一頁(yè)面在刷新前后的數(shù)據(jù)共享提供了良好的解決方案:
設(shè)置方法:V ie wS t a te["變量名"]="值";
取值方法:字符變量=V ie wS t a te["變量名"].T o S t r in g();
同樣,V ie wS t a te存儲(chǔ)的也是o bj e c t類型的數(shù)據(jù),支持復(fù)合數(shù)據(jù)的存儲(chǔ).
A S P.NE T中頁(yè)面?zhèn)髦档姆椒ǘ喾N多樣,必須分清楚頁(yè)面值傳遞的具體應(yīng)用需求、掌握不同范圍數(shù)據(jù)共享技術(shù)的適用場(chǎng)合,我們才能在W EB項(xiàng)目開(kāi)發(fā)中做到胸有成竹,找到合適的解決方案.
[1]張俊鎖.A S P.NE TS ession的原理和用法[J].信息通信, 2014,(11).
[2]郭清菊.A S P.NE T中頁(yè)面間傳值方法的實(shí)現(xiàn)[J].軟件導(dǎo)判,2010,9(7).
責(zé)任編輯:張隆輝
TP31
A
1672-2094(2016)02-0162-02
2016-01-13
四川省教育廳自然科學(xué)一般科研項(xiàng)目13Z B0031.
陳 印(1979-),男,四川渠縣人,四川職業(yè)技術(shù)學(xué)院副教授,碩士.研究方向:計(jì)算機(jī)軟件技術(shù).