許多開發(fā)人員把應(yīng)用程序傳送到Web之前從來沒考慮狀態(tài)的概念。正如前面說過的,Web是一個無狀態(tài)的環(huán)境。因此應(yīng)該探討一下狀態(tài)是什么,了解能夠避免產(chǎn)生問題的方法。
狀態(tài)的準(zhǔn)確定義
在單用戶程序中,創(chuàng)建一個可執(zhí)行的應(yīng)用程序時,例如使用VB建立一個.exe文件,可以聲明一個全局(或Public)變量,然后在代碼中任何地方可對其進(jìn)行訪問。在應(yīng)用程序運(yùn)行的所有時刻,時刻值一直是有效,并且是可訪問的。
對于一個傳統(tǒng)的客戶機(jī)/服務(wù)器解決方案,例如一個基于客戶機(jī)的應(yīng)用程序?qū)σ粋€基于服務(wù)器的數(shù)據(jù)庫引擎進(jìn)行訪問的系統(tǒng),每個客戶端建立了一個與服務(wù)器和數(shù)據(jù)庫應(yīng)用程序的連接。這種連接通常是通過驗(yàn)證用戶的方法來建立的。
驗(yàn)證過程是典型的識別用戶身份的過程,通過一個用戶名和口令組合來證明是否為合法的用戶。
一旦通過驗(yàn)證,在客戶端和基于服務(wù)器的應(yīng)用程序之間就建立了連接,該連接在用戶使用該應(yīng)用程序的所有時間內(nèi)一直保持有效。當(dāng)用戶注冊到酵Windows 2000服務(wù)器上時,這一切便會發(fā)生。無論何時,管理員使用“Active Directory Users and Computers”實(shí)用程序(單擊“Start”菜單的“Administrative Tools”選項(xiàng)中的“Directory Management”項(xiàng))都可以觀察到活動的用戶連接。這個過程在許多系統(tǒng)中都相同,例如Microsoft SQL Server。
這種永久的連接意味著:當(dāng)用戶發(fā)送指令或請求到服務(wù)器上時,服務(wù)器會很容易地識別每個用戶。同樣服務(wù)器的響應(yīng)或任何其他用戶的信息也能直接返回用戶。要進(jìn)一步指出的是服務(wù)器可以比較容易地存儲與每個客戶相關(guān)的值和信息,并在需要的時候提供給相應(yīng)的客戶。當(dāng)然,服務(wù)器應(yīng)用程序能夠擁有主全局變量,以便于用戶在需要的時候進(jìn)行訪問。
這種識別每個客戶端的請求并在內(nèi)存中保存相關(guān)用戶的值的能力構(gòu)成狀態(tài)。可以認(rèn)為狀態(tài)代表應(yīng)用程序的值、環(huán)境以及用戶的內(nèi)部變量,并貫穿于應(yīng)用程序和用戶連接的整個過程。
狀態(tài)的重要性
如果打算創(chuàng)建與用戶進(jìn)行交互的基于Web站點(diǎn)的應(yīng)用程序,而不是僅顯示獨(dú)立頁面的Web網(wǎng)站,必須能夠?yàn)槊總€用戶提供獨(dú)立的狀態(tài)。這可能只是記住他們的名字,也可能要為每個用戶存儲對象引用或不同的記錄集。如果不能這樣做,ASP網(wǎng)頁就不能做更多的事情,因?yàn)樵擁撁鎴?zhí)行完成時,頁面中的變量和其他相關(guān)資料都破壞了。錄用戶請求下一個頁面時,這個頁面提供的所有信息將全部失去。
因此,需要找到一種方法,保存每個訪問者的狀態(tài)。能夠存儲對所有用戶而言的全局值是非常重要。例如,一個Web風(fēng)格的訪問或頁面點(diǎn)擊計(jì)數(shù)器,它不為每個用戶提供自己的計(jì)數(shù)器,用戶們通常想要看到訪問者的總數(shù),而不僅僅是他們自己訪問的次數(shù)。訪問者的數(shù)目需要與應(yīng)用程序級狀態(tài)一起存儲,而不是與用戶級狀態(tài)一起存儲。
這不是一個剛出現(xiàn)的問題,自從商用站點(diǎn)占據(jù)了Web,就已經(jīng)存在,甚至更早些。所以已有許多在Web上存儲狀態(tài)的傳統(tǒng)的解決方案。Web站點(diǎn)管理員想要了解訪問者以前是否曾訪問過他們的網(wǎng)站,如果訪問過,訪問過多少次?還定期訪問其他什么網(wǎng)站等。這樣可以更好地制定其廣告目標(biāo)。所有這些都要求一種方法來存儲有關(guān)用戶在訪問時所產(chǎn)生的網(wǎng)頁請求或每次訪問間的信息。
狀態(tài)的準(zhǔn)確定義
在單用戶程序中,創(chuàng)建一個可執(zhí)行的應(yīng)用程序時,例如使用VB建立一個.exe文件,可以聲明一個全局(或Public)變量,然后在代碼中任何地方可對其進(jìn)行訪問。在應(yīng)用程序運(yùn)行的所有時刻,時刻值一直是有效,并且是可訪問的。
對于一個傳統(tǒng)的客戶機(jī)/服務(wù)器解決方案,例如一個基于客戶機(jī)的應(yīng)用程序?qū)σ粋€基于服務(wù)器的數(shù)據(jù)庫引擎進(jìn)行訪問的系統(tǒng),每個客戶端建立了一個與服務(wù)器和數(shù)據(jù)庫應(yīng)用程序的連接。這種連接通常是通過驗(yàn)證用戶的方法來建立的。
驗(yàn)證過程是典型的識別用戶身份的過程,通過一個用戶名和口令組合來證明是否為合法的用戶。
一旦通過驗(yàn)證,在客戶端和基于服務(wù)器的應(yīng)用程序之間就建立了連接,該連接在用戶使用該應(yīng)用程序的所有時間內(nèi)一直保持有效。當(dāng)用戶注冊到酵Windows 2000服務(wù)器上時,這一切便會發(fā)生。無論何時,管理員使用“Active Directory Users and Computers”實(shí)用程序(單擊“Start”菜單的“Administrative Tools”選項(xiàng)中的“Directory Management”項(xiàng))都可以觀察到活動的用戶連接。這個過程在許多系統(tǒng)中都相同,例如Microsoft SQL Server。
這種永久的連接意味著:當(dāng)用戶發(fā)送指令或請求到服務(wù)器上時,服務(wù)器會很容易地識別每個用戶。同樣服務(wù)器的響應(yīng)或任何其他用戶的信息也能直接返回用戶。要進(jìn)一步指出的是服務(wù)器可以比較容易地存儲與每個客戶相關(guān)的值和信息,并在需要的時候提供給相應(yīng)的客戶。當(dāng)然,服務(wù)器應(yīng)用程序能夠擁有主全局變量,以便于用戶在需要的時候進(jìn)行訪問。
這種識別每個客戶端的請求并在內(nèi)存中保存相關(guān)用戶的值的能力構(gòu)成狀態(tài)。可以認(rèn)為狀態(tài)代表應(yīng)用程序的值、環(huán)境以及用戶的內(nèi)部變量,并貫穿于應(yīng)用程序和用戶連接的整個過程。
狀態(tài)的重要性
如果打算創(chuàng)建與用戶進(jìn)行交互的基于Web站點(diǎn)的應(yīng)用程序,而不是僅顯示獨(dú)立頁面的Web網(wǎng)站,必須能夠?yàn)槊總€用戶提供獨(dú)立的狀態(tài)。這可能只是記住他們的名字,也可能要為每個用戶存儲對象引用或不同的記錄集。如果不能這樣做,ASP網(wǎng)頁就不能做更多的事情,因?yàn)樵擁撁鎴?zhí)行完成時,頁面中的變量和其他相關(guān)資料都破壞了。錄用戶請求下一個頁面時,這個頁面提供的所有信息將全部失去。
因此,需要找到一種方法,保存每個訪問者的狀態(tài)。能夠存儲對所有用戶而言的全局值是非常重要。例如,一個Web風(fēng)格的訪問或頁面點(diǎn)擊計(jì)數(shù)器,它不為每個用戶提供自己的計(jì)數(shù)器,用戶們通常想要看到訪問者的總數(shù),而不僅僅是他們自己訪問的次數(shù)。訪問者的數(shù)目需要與應(yīng)用程序級狀態(tài)一起存儲,而不是與用戶級狀態(tài)一起存儲。
這不是一個剛出現(xiàn)的問題,自從商用站點(diǎn)占據(jù)了Web,就已經(jīng)存在,甚至更早些。所以已有許多在Web上存儲狀態(tài)的傳統(tǒng)的解決方案。Web站點(diǎn)管理員想要了解訪問者以前是否曾訪問過他們的網(wǎng)站,如果訪問過,訪問過多少次?還定期訪問其他什么網(wǎng)站等。這樣可以更好地制定其廣告目標(biāo)。所有這些都要求一種方法來存儲有關(guān)用戶在訪問時所產(chǎn)生的網(wǎng)頁請求或每次訪問間的信息。