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