ASP Lecture Series (8) การใช้คอลเลกชัน
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-05-30 19:59:11
ออบเจ็กต์บิวท์อิน ASP ส่วนใหญ่สนับสนุนคอลเลกชัน คอลเลกชันคือที่จัดเก็บสตริง ตัวเลข วัตถุ และค่าอื่นๆ คอลเลกชันจะคล้ายกับอาร์เรย์มาก ยกเว้นว่าคอลเลกชันจะขยายและค้นหาโดยอัตโนมัติเมื่อมีการจัดเก็บหรือเรียกข้อมูลรายการ ไม่เหมือนกับอาร์เรย์ เมื่อมีการแก้ไขคอลเลกชัน ตำแหน่งของรายการจะย้าย สามารถเข้าถึงไอเท็มได้ด้วยชื่อ ดัชนี หรือโดยการสำรวจไอเท็มทั้งหมดในคอลเลกชัน
การเข้าถึงรายการตามชื่อและดัชนี คุณสามารถเข้าถึงรายการเฉพาะในคอลเลกชันได้โดยใช้ชื่อรายการ ตัวอย่างเช่น คอลเลกชันเนื้อหาเก็บตัวแปรทั้งหมดที่จัดเก็บไว้ในออบเจ็กต์เซสชัน ยังเป็นเจ้าของวัตถุทั้งหมดที่สร้างโดย Server.CreateObject สมมติว่าข้อมูลผู้ใช้ต่อไปนี้ถูกเก็บไว้ในวัตถุเซสชัน:
-
Session.Contents("FirstName") = "แซม"
Session.Contents("LastName") = "วู"
Session.Contents("อายุ") = 29
-
สามารถเข้าถึงรายการได้โดยใช้ชื่อที่เกี่ยวข้องกับรายการเมื่อถูกจัดเก็บไว้ในคอลเลกชัน ตัวอย่างเช่น นิพจน์ต่อไปนี้ส่งคืนสตริง "Sam":
<%= เซสชันเนื้อหา ("ชื่อ") %>
ยังสามารถเข้าถึงรายการได้โดยใช้ดัชนีหรือหมายเลขที่เกี่ยวข้องกับรายการ ตัวอย่างเช่น นิพจน์ต่อไปนี้ดึงข้อมูลที่จัดเก็บไว้ในช่องจัดเก็บข้อมูลที่สองของอ็อบเจ็กต์เซสชันและส่งกลับ "Woo":
<%= เซสชันเนื้อหา (2) %>
คอลเลกชัน ASP มีหมายเลขเริ่มต้นจาก 1 เมื่อมีการเพิ่มหรือลบรายการออกจากคอลเลกชัน ดัชนีที่เกี่ยวข้องกับรายการจะเปลี่ยนไป ดังนั้นจึงไม่สามารถสรุปได้ว่าดัชนีของรายการยังคงไม่เปลี่ยนแปลง ดังที่จะอธิบายไว้ในหัวข้อต่อไปนี้ โดยทั่วไปแล้ว การเข้าถึงโดยใช้ดัชนีจะถูกใช้เพื่อสำรวจคอลเลกชัน หรือเพื่อเข้าถึงรายการในคอลเลกชันแบบอ่านอย่างเดียว
เข้าถึงโครงการได้โดยใช้ชื่อชวเลข ASP ค้นหาคอลเลกชันที่เกี่ยวข้องกับวัตถุตามลำดับเฉพาะ หากรายการที่มีชื่อเฉพาะเกิดขึ้นเพียงครั้งเดียวในคอลเลกชันของออบเจ็กต์ คุณสามารถกำจัดชื่อของคอลเลกชันได้:
<%= เซสชัน("ชื่อ") %>
เมื่อเข้าถึงรายการที่จัดเก็บไว้ในออบเจ็กต์แอปพลิเคชันหรือเซสชัน โดยทั่วไปจะปลอดภัยที่จะกำจัดชื่อคอลเลกชัน อย่างไรก็ตาม สำหรับออบเจ็กต์คำขอ ควรระบุชื่อคอลเลกชันเนื่องจากคอลเลกชันมีแนวโน้มที่จะมีชื่อที่ซ้ำกัน
การสำรวจคอลเลกชัน การสำรวจรายการทั้งหมดของคอลเลกชันเพื่อเรียนรู้เกี่ยวกับรายการที่จัดเก็บไว้ในคอลเลกชันหรือเพื่อแก้ไขรายการ เมื่อสำรวจคอลเลกชัน จะต้องระบุชื่อคอลเลกชัน ตัวอย่างเช่น คุณสามารถใช้คำสั่ง For...Each ใน VBScript เพื่อเข้าถึงรายการที่จัดเก็บไว้ในออบเจ็กต์เซสชัน:
-
'ประกาศตัวแปรตัวนับ'
รายการติ่มซำ
'สำหรับแต่ละรายการในคอลเลกชัน ให้แสดงมูลค่าของมัน
สำหรับแต่ละรายการในเซสชันเนื้อหา
Response.Write Session.Contents (รายการ) & "<BR>"
ต่อไป
-
คุณสามารถใช้คำสั่ง For...Next ใน VBScript เพื่อวนซ้ำผ่านคอลเลกชัน ตัวอย่างเช่น หากต้องการแสดงรายการสามรายการที่จัดเก็บไว้ในเซสชันในตัวอย่างข้างต้น คุณจะต้องใช้คำสั่งต่อไปนี้
-
'ประกาศตัวแปรตัวนับ'
รายการติ่มซำ
'ทำซ้ำลูปจนกระทั่งค่าของตัวนับเท่ากับ 3
สำหรับรายการ = 1 ถึง 3
Response.Write Session.Contents (รายการ) & "<BR>"
ต่อไป
-
เนื่องจากโดยทั่วไปไม่ทราบจำนวนรายการที่จัดเก็บไว้ในคอลเลกชัน ASP จึงสนับสนุนคุณสมบัติ Count ของคอลเลกชัน ซึ่งจะส่งกลับจำนวนรายการในคอลเลกชัน คุณสามารถใช้คุณสมบัติ Count เพื่อระบุค่าสุดท้ายของตัวนับได้
-
'ประกาศตัวแปรตัวนับ'
รายการติ่มซำ
'ทำซ้ำลูปนี้จนกว่าตัวนับจะเท่ากับจำนวนรายการ
'ในคอลเลกชัน.
สำหรับรายการ = 1 ถึง Session.Contents.Count
Response.Write Session.Contents (รายการ) & "<BR>"
ต่อไป
-
คุณสามารถใช้คำสั่ง for ในสคริปต์เพื่อวนซ้ำคอลเลกชันได้ เมื่อใช้คุณสมบัติ Count ใน JScript สำหรับคำสั่ง เพื่อให้ได้ผลลัพธ์ที่ดียิ่งขึ้น คุณควรกำหนดค่า Count ให้กับตัวแปรภายในเครื่อง และใช้ตัวแปรนั้นเพื่อตั้งค่าตัวนับสุดท้าย ด้วยวิธีนี้ กลไกจัดการสคริปต์ไม่จำเป็นต้องค้นหาค่าของ Count ทุกครั้งที่วนซ้ำ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงเทคนิคนี้:
-
รายการ var, ตัวเลข;
numitems = เซสชันเนื้อหานับ;
สำหรับ (รายการ = 1; รายการ <= numitems; รายการ ++) {
Response.Write(Session.Contents(item) + "<BR>")
-
-
Microsoft JScript 3.0 แนะนำวัตถุ Enumerator คุณสามารถใช้วัตถุนี้เพื่อสำรวจคอลเลกชัน ASP เมธอด atEnd ระบุว่ายังมีรายการอยู่ในคอลเลกชันหรือไม่ วิธีการ moveNext จะย้ายไปยังรายการถัดไปในคอลเลกชัน
-
// สร้างวัตถุตัวแจงนับ
var mycoll = ตัวแจงนับใหม่ (เซสชันเนื้อหา);
// วนซ้ำคอลเลกชันและแสดงแต่ละรายการ
ในขณะที่ (!mycoll.atEnd()) {
var x = mycoll.item();
Response.Write(เซสชัน.เนื้อหา(x) + "<BR>");
mycoll.moveNext();
-
-
สคริปต์ที่วนซ้ำผ่านคอลเลกชันคีย์ย่อยจะฝังค่าที่เกี่ยวข้องไว้ในคุกกี้ตัวเดียวเพื่อลดจำนวนคุกกี้ที่ส่งระหว่างเบราว์เซอร์และเว็บเซิร์ฟเวอร์ ดังนั้นคอลเลกชัน Cookies ของออบเจ็กต์ Request และ Response จึงสามารถมีหลายค่าในรายการเดียวได้ รายการย่อยหรือคีย์เวิร์ดย่อยเหล่านี้สามารถเข้าถึงได้ทีละรายการ เฉพาะคอลเลกชัน Request.Cookies และ Response.Cookies เท่านั้นที่รองรับคีย์ย่อย (คีย์ย่อย) Request.Cookies รองรับเฉพาะการดำเนินการอ่านเท่านั้น Response.Cookies รองรับเฉพาะการดำเนินการเขียนเท่านั้น
คุณสามารถระบุคุกกี้ทั้งหมดในคอลเลกชัน Request.Cookie และคีย์ย่อยทั้งหมด (คีย์ย่อย) ในคุกกี้ อย่างไรก็ตาม การวนซ้ำคีย์ย่อยบนคุกกี้โดยไม่มีคีย์ย่อยจะไม่สร้างผลลัพธ์ คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยใช้ไวยากรณ์ .HasKeys เพื่อตรวจสอบว่าคุกกี้มีคีย์ย่อยหรือไม่ ตัวอย่างด้านล่างแสดงให้เห็นถึงเทคนิคนี้
-
'ประกาศตัวแปรตัวนับ
คุกกี้ติ่มซำ, ซับคีย์
'แสดงคอลเลกชันคุกกี้ทั้งหมด
สำหรับคุกกี้แต่ละรายการในคำขอ คุกกี้
Response.เขียนคุกกี้ & "<BR>"
ถ้า Request.Cookies(Cookie).HasKeys แล้ว
'แสดงคีย์ย่อย
สำหรับแต่ละคีย์ย่อยใน Request.Cookies (คุกกี้)
Response.Write Subkey & "=" & Request.Cookies (คุกกี้) (คีย์ย่อย) & "<BR>"
ต่อไป
อื่น
Response.Write "ไม่มีคีย์ย่อยในคุกกี้นี้ <BR>"
สิ้นสุดถ้า
ต่อไป
-
วนซ้ำคอลเลกชันของวัตถุ
คอลเลกชันเซสชันและแอปพลิเคชันสามารถเก็บตัวแปรเชิงปริมาณหรืออินสแตนซ์ของวัตถุได้ คอลเลกชันเนื้อหาเก็บตัวแปรปริมาณและอินสแตนซ์ของวัตถุที่สร้างขึ้นโดยการเรียก Server.CreateObject คอลเลกชัน StaticObjects เก็บอ็อบเจ็กต์ที่สร้างขึ้นโดยใช้องค์ประกอบ HTML <OBJECT> ในไฟล์ Global.asa
เมื่อวนซ้ำคอลเลกชันที่มีวัตถุ คุณสามารถเข้าถึงตัวระบุของวัตถุหรือวิธีการและคุณสมบัติของวัตถุได้ ตัวอย่างเช่น สมมติว่าแอปพลิเคชันของคุณใช้วัตถุจำนวนหนึ่งเพื่อสร้างบัญชีผู้ใช้ และแต่ละวัตถุมีวิธีการกำหนดค่าเริ่มต้น คุณสามารถวนซ้ำคอลเลกชัน StaticObjects เพื่อเรียกใช้วิธีการเริ่มต้นแต่ละวิธี:
-
สำหรับแต่ละออบเจ็กต์ใน Session.StaticObjects
Session.StaticObjects(Object).InitializeUser
ต่อไป
-
คอลเลกชัน ASP แตกต่างกันอย่างไร
แม้ว่าคอลเลกชัน ASP ที่กล่าวถึงในหัวข้อนี้จะคล้ายกับวัตถุคอลเลกชันของ Visual Basic มาก แต่ก็มีความแตกต่างบางประการ คอลเลกชัน ASP สนับสนุนคุณสมบัติการนับและวิธีการรายการ แต่ไม่ใช่วิธีการเพิ่มและเอาออก