Board logo

標題: [教學] (ASP教學第9篇) Application 與 Session 物件 [打印本頁]

作者: 小誌    時間: 2010-5-12 17:55     標題: (ASP教學第9篇) Application 與 Session 物件

Application記錄物件
Application 物件是用來管理整個應用程式,可提供給客戶端使用者 共享資訊,在實務上會被用來追蹤目前使用中的人數及針對特定使用者顯示特定資料。

利用Application 物件來記錄變數內容,則網頁結束執行時其變數內容仍可保留,也就是說Application 物件是一個『靜態』變數,如下所示:
[attach]287[/attach]
  1. <%
  2. var=application("var")
  3. response.write "開始 var=" & var & "<br>"
  4. var=var+10
  5. response.write "結束 var=" & var & "<br>"
  6. application("var")=var
  7. %>
複製代碼
執行結果將如下圖:
[attach]288[/attach]

Application 物件為『共用資訊』,在不同瀏覽器執行或按重新整理時 ,其值是累加的,例如我們重新執行App01.asp 網頁,我們可以清楚的發現:var 變數內的值仍然為上一次執行後保留下來的執行結果,而會產生下圖的結果:
[attach]289[/attach]

Application 物件的生命週期:起始於 PWS/IIS 開始運作且有人開始連線時。 終止於 PWS/IIS 關閉或一定時間內(預設為20分鐘)沒人連線時。 也就是說 Application 物件並不是永遠存在的!除非我們將 Application 物件中的資料寫錄到檔案中將其保存起來,在後續的單元中,我們將會特別介紹檔案資料的寫錄與讀取。

雖然 Application 物件可以在網頁結束後,將其物件內的資料保留下來,但是,當有兩位甚至兩位以上的瀏覽者同時進行網頁鍊結時,則它們所獲得的資料值將是相同的,進而使我們統計的資料產生錯誤;為了避免兩位甚至兩位以上的瀏覽者同時進行網頁鍊結時造成ASP程式執行錯誤,可以利用Application 物件的操作方法: Application.Lock 物件上鎖 與Application.Unlock 取消物件上鎖 ,如下所示:
[attach]290[/attach]

如此可避免兩位瀏覽者同時瀏覽網頁時,count值加總少加。 即程式執行至『Application.lock』程式敘述後,就把 Application 物件上鎖,如此一來 Application 物件便不能被其他程式連線者所呼叫使用,須等到呼叫『Application.lock』的程式連線者再次呼叫了『Application.unlock』取消 Application 物件上鎖後,其它程式連線者才可呼叫 Application。
  1. <%
  2. application.lock
  3. application("count")=application("count")+1
  4. application.unlock
  5. %>
複製代碼

作者: 小誌    時間: 2010-5-12 18:05

Session記錄物件
Session 物件為紀錄使用者的相關資訊,提供使用者再次對此網頁伺服器要求時作確認,例如使用者帳號與密碼的確認,有 Session 物件的建立,來保留身分認證的結果,則使用者不用於每一頁網頁登錄時都需輸入密碼作確認。

Session 物件與 Application 物件相同,都是用來記錄『變數』值的,但是 Application 是一對多的;Session 物件則是一對一的,對於所有的連線瀏覽者而言,他們對於 Application 物件的使用是『共用』的,但是每個瀏覽連線者卻個別擁有一個『私用』的 Session 物件,若將上節 app01.asp 例子中之內容 application 改以 session替代,如下所示:
[attach]291[/attach]
  1. <%
  2. var=session("var")
  3. response.write "開始 var=" & var & "<br>"
  4. var=var+10
  5. response.write "結束 var=" & var & "<br>"
  6. session("var")=var
  7. %>
複製代碼
執行結果將會如Application物件一樣:
[attach]292[/attach]

雖然在表面上看來,結果是相同的,但是,Session 物件現在紀錄的變數資料只與目前瀏覽連線者有關,與其他的瀏覽連線者一點關係都沒有,也就是說目前所讀取的 Session 物件內容是讀取目前瀏覽連線者『私用』的 Session 物件。

Session 物件與 Application物件之不同點 :Application物件為共用之資訊,而Session卻是個別獨立 的,比較下兩圖,不同瀏覽器執行sess01.asp,其值是不累加的,由此更可證明:Session 物件紀錄的變數資料只與目前瀏覽連線者有關,與其他的瀏覽連線者一點關係都沒有。
[attach]293[/attach]

Session 物件的生命週期 起始於 PWS/IIS 瀏覽器第一次與伺服器連線時。 終止於 PWS/IIS 瀏覽器結束執行時或瀏覽器一段時間沒有向PWS/ IIS要求任何網頁時。

實做學習:
當我們利用 Application 來作為進站人數的計數器,是利用當有新的瀏覽連線者進入時就呼叫 Application 物件,將 Application 物件所儲存的變數資料值加一來達到計數的目的,但是,上網者只要按下瀏覽器上的『重新整理』按鈕後,你會發現計數器將會再次的自動加一,這似乎不是我們想要的。單純的 Application 計數器程式碼與執行結果,如下所列:
[attach]294[/attach]
  1. <%
  2. Application.Lock
  3. Application("counter") = Application("counter") + 1
  4. Application.UnLock
  5. %>

  6. <HTML>
  7. <BODY>
  8. <CENTER><H2>Application計數器<HR></H2>
  9. 進站人數 <%=Application("counter")%> 位
  10. </BODY>
  11. </HTML>
複製代碼
那我們該如何防制連線者按下『重新整理』按鈕使計數器自動加一所產生的錯誤呢?我們可以利用具有『私用』特性的 Session 物件來判斷瀏覽連線者是否是新的連線者,我們可以利用下列判斷式先檢驗一下,如果是新的連線者,則其Session物件是沒有任何資料的!
  1. If IsEmpty (Session("Conn")) Then
複製代碼
如果上列的判斷式是成立的(瀏覽連線者為新連線的,Session物件內沒有任何的資料),則我們就將Application 物件的紀錄資料加一,同時將瀏覽連線者的Session("Conn")資料值設為『True』,如此一來,當瀏覽連線者再次按下『重新整理』按鈕後,因為If IsEmpty (Session("Conn")) Then判斷式不成立(Session物件內已有連線紀錄的資料),則Application 物件的紀錄資料就不會再自動加一。使用 Application 物件與 Session 物件撰寫的計數器程式碼與執行結果,如下所列:
[attach]295[/attach]
  1. <%
  2. If IsEmpty(Session("Conn")) Then
  3. Application.Lock
  4. Application("counter") = Application("counter") + 1
  5. Application.UnLock
  6. End If
  7. Session("Conn") = True
  8. %>

  9. <HTML>
  10. <BODY>
  11. <CENTER><H2>Session計數器<HR></H2>
  12. 進站人數 <%=Application("counter")%> 位
  13. </BODY>
  14. </HTML>
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)