ASP การบรรยายที่ 3: Application Object และ Session Object
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-05-30 19:58:17
ในการบรรยายครั้งก่อน เราได้เรียนรู้เกี่ยวกับการรวบรวมข้อมูลแบบฟอร์ม การรวบรวมข้อมูล QueryString และการรวบรวมข้อมูล ServerVariables ของออบเจ็กต์ Request ก่อนที่จะดำเนินการศึกษาต่อไปนี้ ขอแนะนำให้คุณผ่อนคลายก่อน เนื่องจากวัตถุแอปพลิเคชันที่จะแนะนำถัดไปค่อนข้างเป็นนามธรรม และคุณอาจไม่สามารถแยกแยะสิ่งต่าง ๆ เมื่อคุณเข้าใจครั้งแรก ข้อควรจำ: เมื่อคุณหามันไม่เจอ อย่าคิดมากว่า Application object คืออะไร? ดังสุภาษิตโบราณว่า จงเรียนรู้ที่จะใช้มันก่อน
1. ทำความเข้าใจกับออบเจ็กต์ Application เพื่อให้จิตใจสดชื่น มาดูกิจวัตรตอบโต้กัน (คุณควรเรียกใช้เพื่อที่จะเข้าใจ):
ขั้นแรกให้แก้ไขไฟล์ wuf16.htm:
<html>
<ร่างกาย>
ตัวอย่างการบันทึกจำนวนคลิกบนเพจ: <a href="wuf17.asp">wuf17.asp</a>
</ร่างกาย>
</html>
รหัสของ wuf17.asp เป็นดังนี้:
<% @LANGUAGE = VBScript %>
<% 'wuf17.asp - บันทึกจำนวนการเข้าชมหน้าใดหน้าหนึ่ง (หลักการต่อต้าน)
ตัวเลือกที่ชัดเจน
Dim CountWeb
CountWeb = Request.ServerVariables("SCRIPT_NAME")
'เพื่อให้แน่ใจว่าแต่ละหน้ามีตัวแปรเฉพาะเพื่อหลีกเลี่ยงความสับสน
-
<HTML><BODY>
-
การตอบสนองเขียน CountWeb & "<Br><Br>" & vbcrlf
Application.Lock 'โปรดอ่านคำอธิบาย'
Application(CountWeb) = Application(CountWeb) + 1 'Accumulator เพิ่ม 1 ตามจำนวนคลิก
แอปพลิเคชั่นปลดล็อค
Response.Write "จำนวนการคลิกทั้งหมดในหน้านี้ก่อนที่เว็บเซิร์ฟเวอร์จะปิดและรีสตาร์ทคือ: " & Application(CountWeb)
-
</BODY></HTML>
เมื่อรันโปรแกรมนี้สำหรับคนส่วนใหญ่จะมีเครื่องเดียวเท่านั้นคือทั้งเว็บเซิร์ฟเวอร์และไคลเอนต์ จากนั้นคุณคงจินตนาการถึงสถานการณ์เช่นนี้ได้: ไฟล์โฮมเพจสองไฟล์ของคุณถูกวางไว้บนเว็บเซิร์ฟเวอร์ที่อยู่ห่างไกล และมีผู้ใช้ในประเทศและต่างประเทศจำนวนมากเข้าถึงไฟล์เหล่านี้ผ่านเบราว์เซอร์ เมื่อผู้ใช้แต่ละคนคลิก ค่าของ Application(CountWeb) จะเพิ่มขึ้น 1 และตราบใดที่เซิร์ฟเวอร์ที่จัดเก็บไฟล์ wuf17.asp ไม่ได้ถูกปิด Application(CountWeb) จะยังคงสะสมต่อไป แต่โปรดทราบว่าหากเซิร์ฟเวอร์ปิดแล้วรีสตาร์ท Application (CountWeb) จะเริ่มนับจาก 0 อีกครั้ง (ผมงงครับว่าเหตุใดจำนวนการเข้าชมเพจของผมจึงเป็นเลขหลักเดียวเสมอ) เพื่อหลีกเลี่ยงสถานการณ์การนับประเภทนี้ที่เริ่มต้นจากศูนย์เสมอ คุณต้องบันทึกค่าของ Application (CountWeb) ก่อนที่เซิร์ฟเวอร์จะปิดตัวลง และนำออกเมื่อจำเป็นในครั้งถัดไป เพื่อให้สามารถสะสมตามลำดับได้อย่างไร หากต้องการทำ โปรดฟัง Decompose หลังจาก N ครั้ง
คำถามต่อไปคือ Application.Lock และ UnLock หมายถึงอะไร เราเพิ่งตั้งสมมติฐานว่ามีผู้ใช้เข้าชมเพจจำนวนมาก และการคลิกของผู้ใช้แต่ละคนจะทำให้ Application (CountWeb) เพิ่มขึ้น 1 เท่า ลองคิดดูสิ นี่มันจะไม่เละเทะเหรอ? (อะไรนะ! คิดไม่ออกต้องเป็นคุณ (มีเพียงคุณเท่านั้นที่เป็นผู้สนับสนุนหน้าแรก) จึงต้องมีกฎมาก่อนได้ก่อน เมื่อผู้ใช้เยี่ยมชมเพจและต้องการแก้ไขค่าของ Application (CountWeb) ให้ใช้วิธีการล็อคเพื่อล็อคเพื่อป้องกันไม่ให้ผู้ใช้รายอื่นแก้ไขเสร็จให้ปลดล็อค
คุณเคยเห็นจากตัวอย่างข้างต้นหรือไม่ว่า Application object ให้ข้อมูลที่ใช้ร่วมกัน (Application (CountWeb)) ให้กับผู้ใช้ทุกคน และมุ่งเน้นไปที่ผู้ใช้ทุกคน (การเข้าถึงของผู้ใช้แต่ละคนจะทำให้ตัวนับเพิ่มขึ้น 1) ออบเจ็กต์ Application ยังมีสองเหตุการณ์คือ เหตุการณ์ Application_OnStart และเหตุการณ์ Application_OnEnd (อย่าสับสน นี่เป็นเพียงแนวคิดเริ่มต้นในภาษาการเขียนโปรแกรมเชิงวัตถุ) ไวยากรณ์เมื่อใช้จะเป็นดังนี้:
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
SubApplication_OnEnd
'เมื่อเซิร์ฟเวอร์เว็บปิด กิจกรรม Application_OnEnd จะถูกเปิดใช้งาน
'นั่นคือโปรแกรมจะดำเนินการโค้ดที่วางอยู่ที่นี่
'ดังนั้นก่อนที่เซิร์ฟเวอร์จะปิด เราสามารถเปลี่ยนค่า Application (CountWeb) ใน wuf17.asp ได้ที่นี่
'บันทึก เช่น ในไฟล์ข้อความ
จบหมวดย่อย
Application_OnStart ย่อย
'เมื่อผู้ใช้รายแรกเรียกดูเว็บเพจ ASP เหตุการณ์ Application_OnStart จะถูกเปิดใช้งาน แต่เมื่อผู้ใช้รายอื่นเรียกดูในอนาคต เหตุการณ์นี้จะไม่เกิดขึ้น
'นั่นคือโปรแกรมจะดำเนินการโค้ดที่วางอยู่ที่นี่
'ดังนั้นค่าของ Application(CountWeb) ที่บันทึกไว้ในไฟล์ข้อความจึงสามารถอ่านได้ที่นี่
จบหมวดย่อย
</สคริปต์>
ต่อไปนี้เป็นตัวอย่างแสดงวิธีการใช้งานกิจกรรม หน้าที่ของโปรแกรมนี้คือการนับจำนวนคลิกทั้งหมดในทุกหน้าของเว็บไซต์
รหัสของไฟล์ wuf18.asp (ไฟล์หน้าอื่นๆ ในไซต์คล้ายกับไฟล์นี้):
<% @LANGUAGE = VBScript %>
<% ตัวเลือกที่ชัดเจน
'ไฟล์หน้าทั้งหมดในไซต์ควรมีประโยคนี้ <!--#include file="wuf19.asp"-->%>
<!--#include file="wuf19.asp"-->
<HTML><BODY>
จำนวนการเข้าชมทั้งหมดบนทุกหน้าของไซต์ก่อนที่เซิร์ฟเวอร์จะปิดและรีสตาร์ท: <%= Application("CountAll") %>
</BODY></HTML>
รหัสไฟล์ wuf19.asp:
<% ' wuf19.asp
แอปพลิเคชั่นล็อค
แอปพลิเคชัน ("นับทั้งหมด") = แอปพลิเคชัน ("นับทั้งหมด") + 1
แอปพลิเคชั่นปลดล็อค
-
ไฟล์ wuf18.asp และ wuf19.asp อยู่ในไดเร็กทอรีเดียวกัน รหัสไฟล์ global.asa:
หมายเหตุ: ตัวจัดการเหตุการณ์จะต้องบันทึกเป็นไฟล์ข้อความชื่อ "global.asa" และต้องวางไว้ในไดเร็กทอรีรากของพาธเสมือน (โดยปกติจะอยู่ในไดเร็กทอรีเดียวกันกับไฟล์ index.htm หรือ default.htm เช่น: ยกตัวอย่างเครื่องของฉัน ในแง่ของเส้นทางสัมบูรณ์ global.asa อยู่ภายใต้ c:InetPubhome ในขณะที่ wuf18.asp และ wuf19.asp อยู่ภายใต้ c:InetPubhomeasp) เส้นทางเท่านั้น ไฟล์ global.asa ได้รับอนุญาตให้มีอยู่
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
'global.asa - wuf18.asp ชื่อไฟล์ในแพ็คเกจดาวน์โหลดคือ 18global.asa ซึ่งจำเป็นต้องเปลี่ยนชื่อเมื่อใช้งาน
Application_OnStart ย่อย
'เมื่อผู้ใช้รายแรกเรียกดูเว็บเพจ ให้ตั้งค่าเริ่มต้นของตัวนับเป็น 0
'เมื่อผู้ใช้รายอื่นเรียกดูในอนาคต รหัสต่อไปนี้จะไม่ถูกดำเนินการอีกต่อไป
แอปพลิเคชั่นล็อค
แอปพลิเคชัน ("นับทั้งหมด") = 0
แอปพลิเคชั่นปลดล็อค
จบหมวดย่อย
</สคริปต์>
เรียกดู wuf18.asp เพื่อดูผลการวิ่ง ดูเหมือนว่าการเรียนรู้การใช้ Application object ไม่ใช่เรื่องยาก
2. ทำความเข้าใจกับวัตถุเซสชัน ด้วยออบเจ็กต์ Application ก่อนหน้านี้เป็นการบอกล่วงหน้า ออบเจ็กต์ Session จะง่ายกว่ามาก มันคล้ายกับ Application object ยกเว้นว่ามันใช้เพื่อบันทึกข้อมูลที่เกี่ยวข้องกับผู้ใช้คนเดียวเท่านั้น ดังนั้นเราจึงสามารถใช้ Session object เพื่อเก็บข้อมูลเกี่ยวกับผู้ใช้คนเดียวได้
เช่นเดียวกับวัตถุแอปพลิเคชัน วัตถุเซสชันยังมีสองเหตุการณ์: เหตุการณ์ Session_OnStart และเหตุการณ์ Session_OnEnd ไวยากรณ์การใช้งานจะคล้ายกับวัตถุแอปพลิเคชัน
เป็นมูลค่าการกล่าวขวัญว่าก่อนที่จะใช้วัตถุเซสชัน คุณต้องยืนยันว่าได้เปิดใช้งานฟังก์ชันคุกกี้ของเบราว์เซอร์แล้ว (การตั้งค่าเริ่มต้นนั้นใช้ได้)
นี่คือตัวอย่าง ข้อกำหนดสำหรับไฟล์ global.asa เหมือนกับด้านบน ดังนั้น global.asa ในตัวอย่างด้านบนจะถูกเขียนทับโดย global.asa ในตัวอย่างนี้
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
' global.asa - wuf20.asp ชื่อไฟล์ในแพ็คเกจดาวน์โหลดคือ 20global.asa
SubSession_OnStart
Session("In") = Now 'Function Now รับเวลาปัจจุบัน
จบหมวดย่อย
เซสชันย่อย_เมื่อสิ้นสุด
เซสชั่น("ออก") = ตอนนี้
แอปพลิเคชั่นล็อค
แอปพลิเคชัน ("ออก") = เซสชัน ("ออก")
แอปพลิเคชัน ("ใน") = เซสชัน ("ใน")
แอปพลิเคชัน (“ออก”) ปลดล็อค
จบหมวดย่อย
</สคริปต์>
ไฟล์ wuf20.asp:
<%@ ภาษา=VBScript %>
<HTML>
<ร่างกาย>
<% 'wuf20.asp
Response.Write "การตั้งค่าการหมดเวลาเริ่มต้น:" & Session.Timeout & "นาที <Br>"
เซสชันหมดเวลา = 1
ตอบกลับเขียน "เวลาที่คุณเข้าสู่ไซต์นี้:" & Session("In") & "<Br>"
ตอบกลับเขียน "โปรดรีเฟรชหน้านี้ใน 1 นาที" & "<Br><Br>"
ถ้าไม่ใช่ IsEmpty(Application("Out")) แล้ว
ตอบกลับเขียน "ครั้งสุดท้ายที่คุณเข้าสู่ไซต์นี้:" & Application("In") & "<Br>"
ตอบกลับเขียน "ครั้งสุดท้ายที่คุณออกจากไซต์นี้:" & Application("Out") & "<Br>"
การตอบสนองเขียน "เวลาในการเรียกดู (นาที):" &_
Datediff("n",Application("ใน"),Application("ออก")) & "<Br><Br>"
สิ้นสุดถ้า
ถ้า IsEmpty(Session("Out")) แล้ว
ตอบกลับเขียน "ค่าของ Session(""Out"") ก่อนรีเฟรชและหลังรีเฟรชว่างเปล่า" & "<Br>"
สิ้นสุดถ้า
-
</ร่างกาย>
</HTML>
เมื่อผู้ใช้เรียกดูเว็บเพจเป็นครั้งแรก เหตุการณ์ Session_OnStart จะเกิดขึ้น โปรแกรมจะบันทึกเวลาที่ผู้ใช้เข้าสู่เว็บเพจ อย่างไรก็ตาม เหตุการณ์ Session_OnEnd จะไม่เกิดขึ้นในขณะนี้ ดังนั้น Application ("Out") ค่าว่างเปล่าและโปรแกรมไม่แสดงเวลาในการเรียกดู
เรารู้ว่าอายุการใช้งานของออบเจ็กต์ Application นั้นมาจากผู้ใช้คนแรกที่เรียกดูเว็บเพจจนกระทั่งเซิร์ฟเวอร์ปิดตัวลง อายุการใช้งานของออบเจ็กต์เซสชันคือตั้งแต่ครั้งแรกที่ผู้ใช้เรียกดูเว็บเพจ (จุดเริ่มต้นของเซสชัน) จนกระทั่งสิ้นสุดเซสชัน แล้วเซสชั่นจะสิ้นสุดเมื่อไหร่? โดยเฉพาะในตัวอย่างนี้ Session.Timeout = 1 จะตั้งค่าการหมดเวลาของเซสชันเป็น 1 นาที นั่นคือหากไม่มีการร้องขอไปยังเว็บเซิร์ฟเวอร์เป็นเวลา 1 นาที เซสชันจะหมดเวลา ทำให้เซสชันสิ้นสุดลง เหตุการณ์ Session_OnEnd จะเกิดขึ้น และโปรแกรมรันโค้ดใน Session_OnEnd ที่นี่เราใส่เวลาเข้าและออกลงใน Application("In") และ Application("Out") ตามลำดับ เนื่องจากหลังจากเซสชันสิ้นสุดลง วัตถุ Session จะไม่มีอยู่อีกต่อไป
จากกิจวัตรนี้เราจะเห็นได้ว่า:
1. ออบเจ็กต์แอปพลิเคชันและออบเจ็กต์เซสชันมีอายุการใช้งานที่แตกต่างกัน
2. ออบเจ็กต์เซสชันมีไว้สำหรับผู้ใช้คนเดียว และค่าของออบเจ็กต์จะถูกจัดเก็บไว้ในไคลเอ็นต์ การเรียกดูโดยผู้ใช้รายอื่นไม่มีผลกระทบต่อออบเจ็กต์เซสชันผู้ใช้รายเดียว ผู้ใช้รายเดียวสามารถอ่านและเขียนค่าของอ็อบเจ็กต์เซสชันของตนเองได้เท่านั้น (เช่น: Session("In"))
3. สังเกตการแสดงเครื่องหมายคำพูดคู่ใน Response.Write: (""Out"")
4. คำเตือนพิเศษ: โปรแกรมนี้ใช้งานไม่ได้จริงและมีไว้สำหรับการดีบั๊กเท่านั้น (เหมาะสำหรับการเรียกดูโดยผู้ใช้เพียงคนเดียวเท่านั้น) โปรดคิดว่าเหตุใดจึงเป็นเช่นนั้น คำตอบอยู่ท้ายบทความนี้
เคล็ดลับ: โปรดใส่ใจกับลักษณะของออบเจ็กต์ Application
3. ตัวอย่างคลาสสิก: วิธีแสดงจำนวนคนที่ออนไลน์บนหน้าเว็บ ในตัวอย่างต่อไปนี้ Application ("Online") ใช้เพื่อจัดเก็บจำนวนคนที่ออนไลน์ และใช้ Application ("CountAll") เพื่อ เก็บจำนวนผู้เข้าชมทั้งหมด
หลักการ: เมื่อผู้ใช้ใหม่เรียกดูเว็บเพจ เหตุการณ์ Session_OnStart จะเกิดขึ้น จำนวนผู้ใช้ออนไลน์เพิ่มขึ้น 1 คน และจำนวนผู้ใช้ที่เยี่ยมชมก็เพิ่มขึ้น 1 คนเช่นกัน เมื่อผู้ใช้ออกไป เหตุการณ์ Session_OnEnd จะเกิดขึ้นหลังจากหมดเวลาเซสชัน และจำนวนคนที่ออนไลน์จะลดลง 1 คน
รหัส Global.asa เป็นดังนี้:
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
'Global.asa-wuf21.asp
Application_OnStart ย่อย
แอปพลิเคชั่นล็อค
'อ่านค่าเริ่มต้นของ Application("CountAll") ที่นี่
แอปพลิเคชั่นปลดล็อค
จบหมวดย่อย
SubSession_OnStart
แอปพลิเคชั่นล็อค
แอปพลิเคชัน ("ออนไลน์") = แอปพลิเคชัน ("ออนไลน์") + 1
แอปพลิเคชัน ("นับทั้งหมด") = แอปพลิเคชัน ("นับทั้งหมด") + 1
แอปพลิเคชั่นปลดล็อค
จบหมวดย่อย
เซสชันย่อย_เมื่อสิ้นสุด
แอปพลิเคชั่นล็อค
แอปพลิเคชัน ("ออนไลน์") = แอปพลิเคชัน ("ออนไลน์") - 1
แอปพลิเคชั่นปลดล็อค
จบหมวดย่อย
SubApplication_OnEnd
แอปพลิเคชั่นล็อค
'Application("CountAll") ควรถูกบันทึกลงในไฟล์ที่นี่
แอปพลิเคชั่นปลดล็อค
จบหมวดย่อย
</สคริปต์>
รหัส Wuf21.asp เป็นดังนี้:
<%@ ภาษา=VBScript %>
<HTML>
<ร่างกาย>
<%เซสชัน.หมดเวลา = 5%>
<P>จำนวนคนที่ออนไลน์: <%= Application("Online")%></P>
<P>จำนวนผู้เยี่ยมชมทั้งหมด: <%= Application("CountAll")%></P>
</ร่างกาย>
</HTML>
โปรดทราบว่ารูทีนนี้เปรียบเทียบกับ wuf17.asp อย่างหลังจะนับจำนวนคลิก ในขณะที่อันแรกจะนับจำนวนผู้เยี่ยมชม
คำตอบ: เนื่องจากออบเจ็กต์ Application ใช้กับผู้ใช้ทุกคน ในกรณีที่มีผู้ใช้หลายคน การเรียกดูของผู้ใช้รายอื่นจะเปลี่ยนค่าของ Application ("In") และ Application ("Out") ด้วย