เมื่อใช้ ASP เพื่อเขียนชุมชนเสมือน การช็อปปิ้งออนไลน์ และโปรแกรมอื่นๆ แอปพลิเคชันและอ็อบเจ็กต์เซสชันจะมีบทบาทสำคัญ และสามารถใช้งานได้อย่างยืดหยุ่นและมีเหตุผล
วัตถุนี้เป็นกุญแจสำคัญในการปรับปรุงคุณภาพของโปรแกรม ฉันขอให้คำแนะนำเชิงลึกเกี่ยวกับอ็อบเจ็กต์ในตัวทั้งสองของ ASP ตามประสบการณ์ของฉันในด้านนี้
1. ภาพรวมของสมาชิกของออบเจ็กต์แอปพลิเคชัน
สมาชิกของออบเจ็กต์แอปพลิเคชันประกอบด้วยคอลเลกชันออบเจ็กต์แอปพลิเคชัน วิธีการ และเหตุการณ์
⒈ชุดของออบเจ็กต์แอปพลิเคชัน
การรวบรวมเนื้อหา: คอลเลกชันของตัวแปรทั้งหมดที่จัดเก็บไว้ในวัตถุ Applicaiton ที่ไม่ได้กำหนดไว้โดยใช้องค์ประกอบ <OBJECT>
StaticObjects: ชุดของตัวแปรทั้งหมดที่จัดเก็บไว้ในวัตถุ Application ที่กำหนดโดยใช้องค์ประกอบ <OBJECT>
ตัวอย่าง: มีการกำหนดต่อไปนี้ใน default.asp
ใบสมัคร(ก)=ก
ใบสมัคร(ข)=128
แอปพลิเคชัน (c) = เท็จ
จากนั้นก็มีการรวบรวมเนื้อหา
application.contents(1)=a 'สามารถเขียนเป็น application.contents(a)=a ได้ด้วย
application.contents(2)=128 'สามารถเขียนเป็น application.contents(b)=128 ได้เช่นกัน
application.contents(3)=false 'ยังสามารถเขียนเป็น application.contents(c)=false
ผู้เขียนขอแนะนำให้คุณใช้วิธีการเช่น application.contents(a) เมื่อโทร เนื่องจากเป็นวิธีที่ง่ายกว่า หากแสดงด้วยหมายเลขซีเรียล
พิจารณาลำดับการมอบหมายงาน
⒉วิธีการของวัตถุแอปพลิเคชัน
Contents.Remove(ชื่อตัวแปร): ลบตัวแปรที่ระบุออกจากคอลเลกชัน Application.Contents
Contents.RemoveAll(): ลบตัวแปรทั้งหมดในคอลเลกชัน Application.Contents
Lock(): ล็อคออบเจ็กต์ Application เพื่อให้เฉพาะเพจ ASP ปัจจุบันเท่านั้นที่สามารถเข้าถึงเนื้อหาได้
ปลดล็อค (): ปลดล็อควัตถุแอปพลิเคชัน
ตัวอย่าง: ใน default.asp:
ใบสมัคร(ก)=ก
ใบสมัคร(ข)=128
แอปพลิเคชัน (c) = เท็จ
response.write application.contents(1)&<br>
response.write application.contents(2)&<br>
response.write application.contents(3)&<br>
response.write หลังจากลบ b:
application.contents.remove(ข)
response.write application.contents(1)&<br>
response.write application.contents(2)&<br>
ผลการดำเนินการ:
ก
128
เท็จ
หลังจากลบ b:
ก
เท็จ
หากคุณต้องการลบตัวแปรทั้งหมดในคอลเลกชัน เพียงใช้ application.contents.removeall สำหรับวิธีการ Lock และ Unlock มักใช้ในทางปฏิบัติ Read
ผู้อ่านก็คุ้นเคยเช่นกันจึงไม่เป็นภาระที่นี่
⒊เหตุการณ์วัตถุแอปพลิเคชัน
OnStart: เกิดขึ้นเมื่อผู้ใช้รายแรกที่เข้าถึงเซิร์ฟเวอร์เข้าถึงเพจเป็นครั้งแรก
OnEnd: เกิดขึ้นเมื่อเซสชันของผู้ใช้คนสุดท้ายสิ้นสุดลงและมีการดำเนินการโค้ดทั้งหมดสำหรับเหตุการณ์ OnEnd ของเซสชัน หรือเมื่อผู้ใช้คนสุดท้ายเข้าถึง
เซิร์ฟเวอร์จะเกิดขึ้นหลังจากช่วงระยะเวลาหนึ่ง (ปกติคือ 20 นาที) เมื่อไม่มีใครเข้าถึงเซิร์ฟเวอร์
หากคุณต้องการกำหนดสิ่งที่ต้องทำในเหตุการณ์ OnStart และ OnEnd ของออบเจ็กต์แอปพลิเคชัน คุณต้องเขียนโค้ดในไฟล์ Global.asa (ตัวอย่างด้านล่าง) และ
และวางไฟล์ไว้ในไดเร็กทอรีรากของไซต์ (ปกติคือ Inetpubwwwroot)
2. ภาพรวมของสมาชิกของออบเจ็กต์เซสชัน
สมาชิกของวัตถุเซสชันมีแอตทริบิวต์มากกว่าหนึ่งรายการมากกว่าวัตถุแอปพลิเคชัน กล่าวคือ: คอลเลกชัน คุณสมบัติ วิธีการ และเหตุการณ์
⒈คอลเลกชันของวัตถุเซสชัน
สารบัญ: ชุดของตัวแปรทั้งหมดที่จัดเก็บไว้ในวัตถุเซสชันเฉพาะที่ไม่ได้กำหนดไว้โดยใช้องค์ประกอบ <OBJECT>
StaticObject: ชุดของตัวแปรทั้งหมดที่กำหนดโดยใช้องค์ประกอบ <OBJECT> และจัดเก็บไว้ในวัตถุเซสชัน
ตัวอย่าง: มีการกำหนดต่อไปนี้ใน default.asp
เซสชั่น(ก)=ก
เซสชัน(ข)=128
เซสชัน (ค) = เท็จ
จากนั้นก็มีการรวบรวมเนื้อหา
session.contents(1)=a 'สามารถเขียนเป็น session.contents(a)=a ได้ด้วย
session.contents(2)=128 'สามารถเขียนเป็น session.contents(b)=128 ได้เช่นกัน
session.contents(3)=false 'สามารถเขียนเป็น session.contents(c)=false ได้เช่นกัน
⒉คุณสมบัติของวัตถุเซสชัน
CodePage: อ่านได้/เขียนได้ ประเภทจำนวนเต็ม กำหนดโค้ดเพจที่ใช้แสดงเนื้อหาของเพจในเบราว์เซอร์ โค้ดเพจคือชุดอักขระของค่าตัวเลขที่ภาษาต่างๆ ใช้
โค้ดเพจที่แตกต่างกัน ตัวอย่างเช่น โค้ดเพจ ANSI คือ 1252 โค้ดเพจภาษาญี่ปุ่นคือ 932 และโค้ดเพจภาษาจีนตัวย่อคือ 936
LCID: อ่าน/เขียนได้ ประเภทจำนวนเต็ม กำหนดตัวระบุภาษาของเพจที่ส่งไปยังเบราว์เซอร์ LCID เป็นตัวย่อมาตรฐานสากลที่ระบุภูมิภาคโดยไม่ซ้ำกัน เช่น
2057 กำหนดสัญลักษณ์สกุลเงินของภูมิภาคปัจจุบันเป็น £
SessionID: อ่านอย่างเดียว แบบยาว. ส่งคืนตัวระบุเซสชันสำหรับเซสชันนี้ แต่ละครั้งที่มีการสร้างเซสชัน เซิร์ฟเวอร์จะกำหนดตัวระบุโดยอัตโนมัติ สามารถขึ้นอยู่กับมันได้
ค่านี้จะกำหนดว่าผู้ใช้รายใดในสองคนที่เข้าถึงเซิร์ฟเวอร์ก่อน
หมดเวลา: อ่านได้/เขียนได้ ประเภทจำนวนเต็ม กำหนดขีดจำกัดการหมดเวลาเป็นนาทีสำหรับเซสชัน หากผู้ใช้ไม่รีเฟรชหรือร้องขอสิ่งใดสิ่งหนึ่งภายในเวลานี้
หน้าเว็บ เซสชันที่สร้างโดยผู้ใช้จะสิ้นสุดโดยอัตโนมัติ ค่าเริ่มต้นคือ 20
คุณลักษณะข้างต้นมีประโยชน์เพียงเล็กน้อยในแอปพลิเคชันจริง และโดยพื้นฐานแล้วไม่จำเป็นต้องแก้ไขคุณลักษณะเหล่านี้
⒊วิธีการของวัตถุเซสชัน
Contents.Remove(ชื่อตัวแปร): ลบตัวแปรที่ระบุออกจากคอลเลกชัน Session.contents
Contents.Removeall(): ลบตัวแปรทั้งหมดในคอลเลกชัน Session.contents
Abandon(): สิ้นสุดเซสชันผู้ใช้ปัจจุบันและทำลายวัตถุเซสชันปัจจุบัน
เมธอด Contents.Remove (ชื่อตัวแปร) และ Contents.Removeall() ของอ็อบเจ็กต์ Session นั้นโดยพื้นฐานแล้วเหมือนกับของอ็อบเจ็กต์ Application
เพื่อช่วยให้เข้าใจ คุณสามารถดูตัวอย่างด้านบนเพื่อเปลี่ยน Application เป็น Session สิ่งที่ฉันต้องการอธิบายที่นี่คือ Contents.Removeall() และ Abandon()
ข้อแตกต่างก็คือการดำเนินการทั้งสองวิธีนี้จะปล่อยกระแสไฟฟ้าออกมา
ตัวแปรเซสชันทั้งหมดของเซสชันผู้ใช้ ข้อแตกต่างคือ Contents.Removeall() เพียงปล่อยค่าของตัวแปรเซสชันโดยไม่ยุติเซสชันปัจจุบัน
นอกเหนือจากการปล่อยตัวแปร Session แล้ว Abandon() ยังจะยุติเซสชันและทริกเกอร์เหตุการณ์ Session_OnEnd ฉันหวังว่าทุกคนจะใส่ใจกับความแตกต่างระหว่างทั้งสอง
⒋เหตุการณ์ของอ็อบเจ็กต์เซสชัน
OnStart: ทริกเกอร์เมื่อมีการสร้างเซสชันผู้ใช้ ASP เหตุการณ์นี้ถูกสร้างขึ้นเมื่อผู้ใช้ร้องขอเพจใดๆ จากเซิร์ฟเวอร์นี้
OnEnd: ทริกเกอร์เมื่อเซสชันผู้ใช้ ASP สิ้นสุดลง เหตุการณ์นี้จะถูกทริกเกอร์เช่นกันเมื่อมีการใช้เมธอด Abandon() หรือการหมดเวลา
เหตุการณ์ทั้งสองนี้เหมือนกับเหตุการณ์ OnStart และ OnEnd ของ Application และต้องอยู่ในไฟล์ Global.asa
เรามาเน้นศึกษาการใช้เหตุการณ์ทั้งสี่นี้กับคุณกันดีกว่า
3. Global.asa
วัตถุแอปพลิเคชันและเซสชันของ ASP รวมคุณลักษณะที่วัตถุในตัว ASP อื่น ๆ ไม่มี - เหตุการณ์ ทุกครั้งที่ผู้เยี่ยมชมเข้าถึงเซิร์ฟเวอร์ ก
เหตุการณ์ OnStart (ผู้เยี่ยมชมคนแรกจะทริกเกอร์เหตุการณ์ OnStart ของแอปพลิเคชันและเซสชันในเวลาเดียวกัน แต่แอปพลิเคชันอยู่ข้างหน้าเซสชัน) ผู้เยี่ยมชมแต่ละคน
เหตุการณ์ OnEnd จะถูกทริกเกอร์เมื่อแต่ละเซสชันสิ้นสุดลง (เหตุการณ์ OnEnd ของทั้งแอปพลิเคชันและเซสชันจะถูกทริกเกอร์เมื่อเซสชันผู้เยี่ยมชมครั้งล่าสุดสิ้นสุดลง แต่
เซสชันอยู่ก่อนแอปพลิเคชัน)
โดยทั่วไปแล้วทั้งสองเหตุการณ์ OnStart และ OnEnd จะใช้ในชุมชนเสมือนเพื่อนับจำนวนคนที่ออนไลน์ แก้ไขสถานะออนไลน์และออฟไลน์ของผู้ใช้ ฯลฯ เพื่อกำหนดสองสิ่งนี้โดยเฉพาะ
คุณต้องเขียนโค้ดในไฟล์ Global.asa และวางไฟล์ไว้ในไดเร็กทอรีรากของไซต์ (ค่าเริ่มต้นคือ Inetpubwwwroot) นอกจากนี้,
ออบเจ็กต์ Application และ Session ระบุออบเจ็กต์ ASP ในตัวอื่นๆ (Response, Request,
เซิร์ฟเวอร์, เซสชัน...) ไม่สามารถใช้งานได้ ต่อไปนี้คือตัวอย่างการนับจำนวนคนที่ออนไลน์ในชุมชนเสมือนเพื่อสาธิตวิธีการใช้ทั้งสองเหตุการณ์นี้
คำอธิบายไฟล์:
global.asa อยู่ในไดเร็กทอรี d:Inetpubwwwroot
default.asp อยู่ในไดเร็กทอรี d:Inetpubwwwroot ซึ่งเป็นหน้าล็อกอินชุมชนเสมือน
login.asp อยู่ในไดเร็กทอรี d:Inetpubwwwroot และใช้ในการตรวจสอบชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ป้อน
index.asp อยู่ในไดเร็กทอรี d:Inetpubwwwroot ซึ่งเป็นโฮมเพจของชุมชนเสมือน
bbs.mdb ตั้งอยู่ในไดเร็กทอรี d:Inetpubwwwroot และเป็นฐานข้อมูลที่เก็บข้อมูลผู้ใช้
โครงสร้างฐานข้อมูล (ACCESS):
===ตารางbbs===
ID ผู้ใช้ ID จำนวนเต็มยาว
ชื่อชื่อผู้ใช้ ประเภทข้อความ
รหัส รหัสผ่าน ประเภทข้อความ
สถานะออนไลน์ออนไลน์ ใช่/ไม่ใช่
===global.asa===
<script LANGUAGE=VBScript RUNAT=เซิร์ฟเวอร์>
Application_OnStart ย่อย
ใบสมัคร(ออนไลน์)=0
จบหมวดย่อย
แอปพลิเคชันย่อย_OnEnd
ครั้งที่ย่อย
SubSession_OnStart
จบหมวดย่อย
เซสชันย่อย_เมื่อสิ้นสุด
ถ้า session.contents (ผ่าน) จากนั้น 'ตรวจสอบว่าเป็น Session_OnEnd ของผู้ใช้ที่เข้าสู่ระบบหรือไม่
แอปพลิเคชันล็อค
แอปพลิเคชัน (ออนไลน์) = แอปพลิเคชัน (ออนไลน์) -1
แอปพลิเคชันปลดล็อค
สิ้นสุดถ้า
จบหมวดย่อย
</สคริปต์><
-
===login.asp===
...'การตรวจสอบรหัสผ่าน เชื่อมต่อกับฐานข้อมูล และตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ป้อนนั้นถูกต้องหรือไม่
หากการตรวจสอบรหัสผ่านผ่านแล้ว
เซสชัน (ชื่อ) = rs (ชื่อ)
เซสชั่น(id)=rs(id)
เซสชั่น(ผ่าน)=จริง
อื่น
RS.ปิด
เชื่อมต่อปิด
รหัสผ่าน response.write ผิด!
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
แอปพลิเคชันล็อค
แอปพลิเคชัน (ออนไลน์)=แอปพลิเคชัน (ออนไลน์)+1
conn.Execute (อัพเดต bbs set online=1 โดยที่ id=&session(id))'ตั้งค่าสถานะผู้ใช้เป็นออนไลน์
แอปพลิเคชันปลดล็อค
RS.ปิด
เชื่อมต่อปิด
response.redirect index.asp 'หลังจากเตรียมข้อมูลเบื้องต้นแล้ว ให้ข้ามไปที่หน้าแรกของชุมชน
-
ในตัวอย่างนี้ ให้ใช้ตัวแปรแอปพลิเคชัน (ออนไลน์) เพื่อบันทึกจำนวนผู้คนออนไลน์ที่ล็อกอินเข้าสู่ชุมชน เพราะเมื่อผู้ใช้เข้าถึงเซิร์ฟเวอร์แล้ว ก็ไม่สำคัญว่าผู้ใช้จะ
เมื่อคุณเข้าสู่ระบบ เหตุการณ์ OnStart จะถูกสร้างขึ้น ดังนั้นคุณไม่สามารถเพิ่ม Applicaiton (ออนไลน์) ได้หนึ่งรายการในเหตุการณ์ OnStart เพราะไม่ว่าจะเป็นเซสชั่นของผู้ใช้ที่ล็อกอินก็ตาม
กิจกรรม OnEnd จะถูกสร้างขึ้นเมื่อสิ้นสุด (หากผู้เยี่ยมชมเยี่ยมชมเซิร์ฟเวอร์แต่ไม่ได้เข้าสู่ระบบชุมชน กิจกรรม OnEnd จะถูกสร้างขึ้นหลังจากเซสชันของเขาสิ้นสุดลงด้วย) ดังนั้นใน
มีการใช้คำสั่ง if ในเหตุการณ์ Session_OnEnd เพื่อพิจารณาว่าเป็นเหตุการณ์ OnEnd สำหรับผู้ใช้ที่เข้าสู่ระบบหรือไม่ หากเป็นเช่นนั้น จำนวนคนที่ออนไลน์จะลดลงหนึ่งคน
นี่เป็นเพียงตัวอย่างง่ายๆ ของการนับจำนวนคนที่ออนไลน์อยู่ สำหรับชุมชนเสมือนที่สมบูรณ์แล้ว การนับจำนวนคนที่ออนไลน์อยู่นั้นไม่เพียงพอ
มีฟิลด์ออนไลน์ในฐานข้อมูลที่ใช้บันทึกสถานะออนไลน์ของผู้ใช้ เมื่อผู้ใช้เข้าสู่ระบบ ออนไลน์จะถูกตั้งค่าเป็น 1 ใน login.asp แต่จะไม่ปรากฏขึ้นเมื่อผู้ใช้ออฟไลน์
ออนไลน์ถูกตั้งค่าเป็น 0 หากต้องการปรับปรุง คุณต้องแก้ไขเหตุการณ์ Session_OnEnd และตั้งค่าออนไลน์เป็น 0 ในเหตุการณ์นี้
===loαl. ต้า===
<script LANGUAGE=VBScript RUNAT=เซิร์ฟเวอร์>
Application_OnStart ย่อย
ใบสมัคร(ออนไลน์)=0
ตั้งค่าแอปพลิเคชัน (conn) = Server.CreateObject (ADODB.Connection)
application(db)=Server.MapPath( bs.mdb) 'วิธีที่ดีที่สุดคือใช้พาธสัมบูรณ์ bs.mdb ที่นี่ ตามรายละเอียดด้านล่าง
จบหมวดย่อย
แอปพลิเคชันย่อย_OnEnd
ตั้งค่าแอปพลิเคชัน (conn) = ไม่มีอะไรเลย
จบหมวดย่อย
SubSession_OnStart
จบหมวดย่อย
เซสชันย่อย_เมื่อสิ้นสุด
ถ้า session.contents (ผ่าน) จากนั้น 'ตรวจสอบว่าเป็น Session_OnEnd ของผู้ใช้ที่เข้าสู่ระบบหรือไม่
application(con).open =driver={ไดรเวอร์ Microsoft Access (*.mdb)};dbq=&application(db)
แอปพลิเคชันล็อค
แอปพลิเคชัน (ออนไลน์) = แอปพลิเคชัน (ออนไลน์) -1
application(con).Execute (อัพเดตชุดเพื่อน online=0 โดยที่ id=&session.contents(id))
แอปพลิเคชันปลดล็อค
ใบสมัคร(แย้ง)ปิด
สิ้นสุดถ้า
จบหมวดย่อย
</สคริปต์>
-
ณ จุดนี้ รหัสทั้งหมดเสร็จสมบูรณ์แล้ว เนื่องจากวัตถุเซิร์ฟเวอร์ไม่สามารถใช้ในเหตุการณ์ OnEnd ของ Application และ Session ของฐานข้อมูลได้
ที่อยู่ทางกายภาพของการเชื่อมต่อและฐานข้อมูลบนเซิร์ฟเวอร์ (d:inetpubwwwroot bs.mdb) จะถูกเก็บไว้ในตัวแปรแอปพลิเคชันและ
ประมวลผลล่วงหน้าในเหตุการณ์ Application_OnStart ในทำนองเดียวกัน ไม่สามารถใช้ session(pass) แทน session.contents ในเหตุการณ์ Session_OnEnd ได้
(ผ่าน) (คำอธิบายโดยละเอียดด้านล่าง)
4. สองประเด็นที่ควรค่าแก่การเอาใจใส่ในตัวอย่างในบทความนี้
⒈session.contents ในเหตุการณ์ OnEnd
เพื่อนที่เพิ่งเริ่มติดต่อ global.asa มักจะอ้างถึงเหตุการณ์ Session_OnEnd ข้างต้น
ถ้า session.contents(pass) ให้เขียนเป็น
ถ้าเซสชั่น (ผ่าน) แล้ว,
ในกรณีนี้ ระบบจะไม่แสดงข้อผิดพลาด แต่เนื้อหาหลังจากนั้นจะไม่ถูกดำเนินการ เนื่องจากวัตถุเซสชันไม่ได้รับอนุญาตให้ใช้ในเหตุการณ์ OnEnd
แต่ตัวแปรเซสชันสามารถเรียกได้โดยใช้คอลเลกชันของวัตถุเซสชัน เนื่องจาก IIS ไม่แสดงข้อความแสดงข้อผิดพลาดใดๆ ผู้เขียนจึงเสียเวลากับเรื่องนี้ไปมาก
ระหว่าง. ฉันหวังว่าทุกคนจะได้เรียนรู้จากสิ่งนี้!
⒉เมื่อใช้ Server.MapPath เพื่อรับที่อยู่ทางกายภาพของฐานข้อมูลในเหตุการณ์ Application_OnStart ควรใช้ที่อยู่ที่แน่นอน เพื่ออธิบายปัญหานี้ คุณสามารถทำได้
มาทำการทดลองกัน: เปลี่ยนเหตุการณ์ Application_OnStart ด้านบน
application(db)=Server.MapPath( bs.mdb) เปลี่ยนเป็น:
แอปพลิเคชัน (db) = Server.MapPath (bbs.mdb)
จากนั้นสร้างไดเร็กทอรีย่อย test ในไดเร็กทอรี d:inetpubwwwroot และเขียน temp.asp ในไดเร็กทอรีทดสอบ
====test.asp====
<% แอปพลิเคชันตอบกลับเขียน (db)%>
-
จากนั้นคัดลอก temp.asp และวางไว้ในไดเร็กทอรีราก (d:inetpubwwwroot) เปิด global.asa ด้วยแผ่นจดบันทึก จากนั้นเปิดเบราว์เซอร์สองตัว เบราว์เซอร์ A
ป้อนที่อยู่ http://localhost/temp.asp แล้วกด Enter ข้อมูลต่อไปนี้จะแสดงผลบนเบราว์เซอร์:
d:inetpubwwwroot bs.mdb
จากนั้น คลิกเมนู File บนหน้าต่าง Notepad และเลือก Save (เพื่อเปลี่ยนเวลาแก้ไขของ global.asa ซึ่งจะทำให้ IIS เริ่มบริการทั้งหมดใหม่) จากนั้นคลิก
ป้อนที่อยู่ http://localhost/test/temp.asp ในเบราว์เซอร์ B แล้วกด Enter ผลลัพธ์บนเบราว์เซอร์คือ:
d:inetpubwwwrootestbs.mdb
แม้ว่าไฟล์ global.asa จะถูกวางในไดเร็กทอรีรากของไซต์ หากใช้แอดเดรสแบบสัมพันธ์ใน server.mappath Application_OnStart จะถูกทริกเกอร์
หากหน้าที่เข้าชมโดยผู้ใช้เหตุการณ์เป็นครั้งแรกไม่ได้อยู่ในไดเรกทอรีราก การได้รับที่อยู่ทางกายภาพของฐานข้อมูลจะไม่ใช่ผลลัพธ์ที่คาดหวัง ฉันหวังว่าทุกคนจะระมัดระวังเป็นพิเศษ