แหล่งที่มาของบทความ: Programming Notes
http://blog.csdn.net/nhconch โปรดสนับสนุนฉัน
นักพัฒนาทุกคนที่ออกแบบแอปพลิเคชัน ASP-Web ขนาดใหญ่อาจมีประสบการณ์ดังต่อไปนี้: โค้ด ASP และ HTML ของเพจสับสนและแยกแยะได้ยาก และตรรกะทางธุรกิจ เชื่อมโยงกับโหมดการแสดงผลทำให้โค้ดเข้าใจและแก้ไขได้ยาก การเขียนโปรแกรมต้องเขียนตามงานศิลปะซึ่งกลายเป็นคอขวดของโครงการ เมื่อรวมโค้ดโปรแกรมและหน้าสแตติก HTML จะใช้เวลานานในการรับ ผลลัพธ์ที่ต้องการ และมันก็เพิ่มเป็นสองเท่าของงานศิลปะ แท้จริงแล้วไม่ใช่เรื่องง่ายที่จะแยกการประมวลผลข้อมูลและการแสดงผลข้อมูลเมื่อพัฒนาแอปพลิเคชันเว็บโดยใช้ภาษาสคริปต์ อย่างไรก็ตาม ในกรณีของการทำงานร่วมกันแบบหลายบุคคล หากไม่สามารถแยกข้อมูลและการแสดงผลได้ จะส่งผลอย่างมากต่อประสิทธิภาพของการพัฒนาและ การแบ่งงานอย่างมืออาชีพ
ภาษาสคริปต์อื่นๆ เช่น JSP และ PHP มีโซลูชันของตนเอง ASP.NET ซึ่งเป็นผลิตภัณฑ์รุ่นหลังของ ASP ก็ใช้โค้ดและเพจต่างๆ เช่นกัน ดูเหมือนว่าการเปลี่ยนไปใช้ ASP โดยตรงเป็นทางเลือกที่ดี แต่มีเหตุผลไม่ทางใดก็ทางหนึ่งอยู่เสมอที่ทำให้เราไม่สามารถละทิ้ง ASP หรือมุ่งตรงไปที่ค่าย .NET ในขณะนี้ จากมุมมองของบริษัท การเปลี่ยนภาษาเป็นการลงทุนมหาศาล ซึ่งรวมถึงการจ้างโปรแกรมเมอร์ .NET ที่มีประสบการณ์ การฝึกอบรมโปรแกรมเมอร์ที่มีอยู่ การเปลี่ยนแปลงเครื่องมือในการพัฒนา การเปลี่ยนแปลงรูปแบบการพัฒนา การเปลี่ยนแปลงรูปแบบอินเทอร์เฟซ รูปแบบอินเทอร์เฟซ สถาปัตยกรรมซอฟต์แวร์ เอกสาร กระบวนการพัฒนา ฯลฯ นอกจากนี้ยังหมายความว่าโค้ดต้นฉบับจะต้องถูกเขียนใหม่ในสภาพแวดล้อมภาษาใหม่เพื่อให้ได้ผลและความเสถียรที่ดีที่สุด ในเวลาเดียวกันจะส่งผลโดยตรงต่อความคืบหน้าของโครงการในช่วงเวลานี้และมีแนวโน้มมากขึ้น ส่งผลให้โปรแกรมเมอร์แต่ละคนลาออก ดูเหมือนว่าก่อนที่คุณจะตัดสินใจเปลี่ยนภาษา วิธีที่ดีที่สุดคือหาวิธีแก้ปัญหาจากพื้นฐานเดิม
PHP ใช้โค้ดและเพจผ่านเทมเพลต มี FastTemplate, PHPLIB, Smarty ฯลฯ ให้เลือก โดยที่ PHPLIB มีอิทธิพลมากที่สุดและถูกใช้มากที่สุด ในกรณีนี้ เราจะย้ายไปยัง ASP โดยตรง ซึ่งมีประโยชน์อย่างมากสำหรับบริษัทที่ใช้ทั้ง PHP และ ASP: 1. เมื่อศิลปินประมวลผลเพจ ไม่ว่าจะใช้ PHP หรือ ASP วิธีการประมวลผลจะเหมือนกันและไม่มีการฝึกอบรม 2. เมื่อโปรแกรมเมอร์เขียนโค้ด แนวคิดระหว่างสองภาษาจะใกล้เคียงกันหรือสอดคล้องกัน เมื่อมีการนำฟังก์ชันเดียวกันไปใช้ในทั้งสองภาษา พวกเขาเพียงแค่คัดลอกและทำการแก้ไขเพียงเล็กน้อยเท่านั้นเพื่อให้มั่นใจถึงประสิทธิภาพการทำงานและโครงการ ความคืบหน้า.
1. การออกแบบคลาสเทมเพลตใช้การห่อหุ้มโค้ดในคลาสเทมเพลต ซึ่งไม่เพียงแต่เข้ากันได้กับ PHPLIB เท่านั้น แต่ยังทำให้โค้ดง่ายต่อการจัดการและขยายอีกด้วย
เป้าหมายของคลาสเทมเพลตคือการอ่านโค้ด HTML ที่แสดงจากไฟล์เทมเพลต แทนที่ส่วนของโค้ดแสดงผลที่ต้องการข้อมูลไดนามิกด้วยข้อมูลที่คำนวณโดยโปรแกรม ASP จากนั้นจึงเอาต์พุตออกมาในลำดับที่แน่นอน ในหมู่พวกเขาชิ้นส่วนทดแทนสามารถตั้งค่าได้อย่างอิสระ จึงต้องดำเนินการดังต่อไปนี้ให้เสร็จสิ้น:
·อ่านโค้ด HTML เพื่อแสดงผลจากไฟล์เทมเพลต
·รวมไฟล์เทมเพลตเข้ากับข้อมูลที่สร้างขึ้นจริงเพื่อสร้างผลลัพธ์เอาต์พุต
·อนุญาตให้ประมวลผลหลายเทมเพลตพร้อมกัน
·อนุญาตให้ซ้อนเทมเพลต
·อนุญาตให้ประมวลผลแต่ละส่วนของเทมเพลต
วิธีการดำเนินการ:
ใช้ FSO เพื่ออ่านไฟล์เทมเพลต
ใช้การแทนที่เป็นประจำเพื่อรวมไฟล์เทมเพลตและข้อมูล
การประมวลผลเทมเพลตหลายรายการถูกนำมาใช้โดยใช้ที่เก็บข้อมูลอาเรย์
แนวคิดหลักเบื้องหลังการนำการซ้อนเทมเพลตไปใช้คือการจัดการเทมเพลตและเอาต์พุต (ผลการวิเคราะห์ระดับกลางใดๆ ก็ตาม) อย่างเท่าเทียมกัน และทั้งสองอย่างสามารถถูกแทนที่ได้ ก็แค่นั้นแหละ
การประมวลผลแต่ละส่วนจะถูกควบคุมโดยการตั้งค่าคำอธิบายประกอบในไฟล์เทมเพลต จากนั้นจึงรวมคำอธิบายประกอบในการแทนที่ปกติเพื่อให้ได้การแทนที่บางส่วน
2. ก่อนที่จะให้โค้ดเฉพาะสำหรับการใช้งานคลาสเทมเพลต ก่อนอื่นเรามาแสดงรายการฟังก์ชันหลักๆ กันก่อน เพื่อน ๆ ที่เคยใช้ PHPLIB ควรคุ้นเคยกับสิ่งนี้:
1) Public Sub set_root(ByVal Value) ตั้งค่าไดเร็กทอรีเริ่มต้นของเทมเพลต 2) Public Sub set_file(ByVal handle,ByVal filename) อ่านไฟล์ 3) Public Sub set_var(ByVal Name, ByVal Value, ByVal Append) ตั้งค่าการแทนที่ข้อมูลการแมป ตัวแปร 4) Public Sub unset_var(ByVal Name) ยกเลิกการแมปข้อมูล 5) Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name) ตั้งค่าบล็อกข้อมูล 6) Public Sub set_unknowns(ByValknowns) ตั้งค่าวิธีการประมวลผลแท็กสำหรับการแมปที่ไม่ระบุ 7) แยกย่อยสาธารณะ (ชื่อ ByVal, ByVal BlockTag, ByVal ผนวก) ดำเนินการการรวมกันของไฟล์เทมเพลตและข้อมูล 8) Public Sub p (ชื่อ ByVal) ส่งออก
รหัสการใช้งานผลการประมวลผล:
-
'=================================================' = ======================= = ======================
' วิธีการตั้งชื่อเช่น set_var และ set_block ถูกใช้ในอ็อบเจ็กต์นี้เพื่อให้เข้ากันได้กับ phplib
'=================================================' = ======================= = ======================
'www.downcodes.com
คลาส kktTemplate'
ส่วนตัว m_FileName, m_Root, m_Unknowns, m_LastError, m_HaltOnErr
m_ValueList ส่วนตัว, m_BlockList
m_RegExp ส่วนตัว
'คอนสตรัคเตอร์
คลาสย่อยส่วนตัว_เริ่มต้น
ตั้งค่า m_ValueList = CreateObject("Scripting.Dictionary")
ตั้งค่า m_BlockList = CreateObject("Scripting.Dictionary")
ตั้ง m_RegExp = RegExp ใหม่
m_RegExp.IgnoreCase = จริง
m_RegExp.Global = จริง
m_FileName = ""
m_Root = ""
m_Unknowns = "ลบ"
m_LastError = ""
m_HaltOnErr = จริง
จบหมวดย่อย
'ผู้ทำลาย
Class_Terminate ย่อยส่วนตัว
ตั้งค่า m_RegExp = ไม่มีเลย
ตั้งค่า m_BlockMatches = ไม่มีเลย
ตั้งค่า m_ValueMatches = ไม่มีเลย
จบหมวดย่อย
ทรัพย์สินสาธารณะ GetClassName()
ชื่อคลาส = "kktTemplate"
สิ้นสุดคุณสมบัติ
ทรัพย์สินสาธารณะรับเวอร์ชัน ()
เวอร์ชัน = "1.0"
สิ้นสุดคุณสมบัติ
ย่อยสาธารณะ เกี่ยวกับ()
Response.Write("คลาสเทมเพลตเพจ kktTemplate ASP<br>" & vbCrLf &_
"การเขียนโปรแกรม: Peng Guohui2004-07-05<br>" & vbCrLf &_
"เว็บไซต์ส่วนตัว: <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>" & vbCrLf &_
"อีเมล: <a href='mailto:[email protected]'>[email protected]</a><br>")
จบหมวดย่อย
'ตรวจสอบว่ามีไดเร็กทอรีอยู่หรือไม่'
ฟังก์ชั่นสาธารณะ FolderExist (เส้นทาง ByVal)
ติ่มซำ
ตั้งค่า fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists (Server.MapPath (เส้นทาง))
ตั้งค่า fso = ไม่มีเลย
ฟังก์ชันสิ้นสุด
'อ่านเนื้อหาไฟล์
ฟังก์ชั่นส่วนตัว LoadFile()
ชื่อไฟล์ Dim, fso, hndFile
ชื่อไฟล์ = m_Root
ถ้าขวา(ชื่อไฟล์, 1)<>"/" และขวา(ชื่อไฟล์, 1)<>"" ดังนั้นชื่อไฟล์ = ชื่อไฟล์ & "/"
ชื่อไฟล์ = Server.MapPath (ชื่อไฟล์ & m_FileName)
ตั้งค่า fso = CreateObject("Scripting.FileSystemObject")
หากไม่ใช่ fso.FileExists (ชื่อไฟล์) ดังนั้น ShowError ("ไฟล์เทมเพลต" & m_FileName & "ไม่มีอยู่!")
ตั้งค่า hndFile = fso.OpenTextFile (ชื่อไฟล์)
LoadFile = hndFile.ReadAll
ตั้ง hndFile = ไม่มีเลย
ตั้งค่า fso = ไม่มีเลย
ถ้า LoadFile = "" ดังนั้น ShowError("ไม่สามารถอ่านไฟล์เทมเพลต" & m_FileName & "หรือไฟล์ว่างเปล่า!")
ฟังก์ชันสิ้นสุด
'จัดการข้อความแสดงข้อผิดพลาด
ShowError ส่วนตัวย่อย (ByVal msg)
m_LastError = ข้อความ
Response.Write "<font color=red style='font-size;14px'><b>ข้อผิดพลาดของเทมเพลต:" & msg & "</b></font><br>"
ถ้า m_HaltOnErr แล้ว Response.End
จบหมวดย่อย
'ตั้งค่าไดเรกทอรีเริ่มต้นสำหรับไฟล์เทมเพลต
'เช่น: kktTemplate.set_root("/tmplate")
' kktTemplate.Root = "/tmplate"
' รูท = kktTemplate.get_root()
' รูต = kktTemplate.Root
'การใช้วิธีการตั้งชื่อเช่น set_root นั้นเพื่อให้เข้ากันได้กับ phplib ซึ่งจะไม่มีการทำซ้ำด้านล่าง
สาธารณะย่อย set_root (ค่า ByVal)
ถ้าไม่ใช่ FolderExist(ค่า) ดังนั้น ShowError(ค่า & "ไม่ใช่ไดเร็กทอรีที่ถูกต้องหรือไดเร็กทอรีไม่มีอยู่!")
m_Root = ค่า
จบหมวดย่อย
ฟังก์ชั่นสาธารณะ get_root()
get_root = m_Root
ฟังก์ชันสิ้นสุด
ทรัพย์สินสาธารณะให้รูท (มูลค่า ByVal)
set_root (ค่า)
สิ้นสุดคุณสมบัติ
ทรัพย์สินสาธารณะ GetRoot()
รูท = m_รูท
สิ้นสุดคุณสมบัติ
'ตั้งค่าไฟล์เทมเพลต
'เช่น: kktTemplate.set_file("hndTpl", "index.htm")
'คลาสนี้ไม่รองรับไฟล์เทมเพลตหลายไฟล์ ตัวจัดการสงวนไว้สำหรับความเข้ากันได้กับ phplib
set_file ย่อยสาธารณะ (ตัวจัดการ ByVal, ชื่อไฟล์ ByVal)
m_FileName = ชื่อไฟล์
m_BlockList.Add Handle, LoadFile()
จบหมวดย่อย
ฟังก์ชั่นสาธารณะ get_file()
get_file = m_FileName
ฟังก์ชันสิ้นสุด
' Public Property Let File(ตัวจัดการ, ชื่อไฟล์)
'ตัวจัดการ set_file ชื่อไฟล์'
'สิ้นสุดคุณสมบัติ
'รับไฟล์ทรัพย์สินสาธารณะ ()
'ไฟล์ = m_FileName
'สิ้นสุดคุณสมบัติ
'ตั้งค่าวิธีการประมวลผลสำหรับแท็กที่ไม่ระบุ รวมทั้งเก็บ ลบ และแสดงความคิดเห็น
สาธารณะย่อย set_unknowns (ไม่ทราบ ByVal)
m_Unknowns = ไม่ทราบ
จบหมวดย่อย
ฟังก์ชั่นสาธารณะ get_unknowns()
get_unknowns = m_Unknowns
ฟังก์ชันสิ้นสุด
ทรัพย์สินสาธารณะให้ไม่ทราบ (ไม่ทราบ ByVal)
m_Unknowns = ไม่ทราบ
สิ้นสุดคุณสมบัติ
ทรัพย์สินสาธารณะได้รับ Unknowns()
ไม่ทราบ = m_ไม่ทราบ
สิ้นสุดคุณสมบัติ
set_block ย่อยสาธารณะ (ผู้ปกครอง ByVal, ByVal BlockTag, ชื่อ ByVal)
การแข่งขันสลัว
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
หากไม่ใช่ m_BlockList.Exists (พาเรนต์) ดังนั้น ShowError ("แท็กบล็อกที่ไม่ระบุ" & พาเรนต์)
ตั้งค่าการจับคู่ = m_RegExp.Execute (m_BlockList.Item (พาเรนต์))
สำหรับการแข่งขันแต่ละครั้งในการแข่งขัน
m_BlockList.Add BlockTag, Match.SubMatches(0)
m_BlockList.Item(Parent) = แทนที่(m_BlockList.Item(Parent), Match.Value, "{" & ชื่อ & "}")
ต่อไป
ตั้งค่าการจับคู่ = ไม่มีเลย
จบหมวดย่อย
สาธารณะย่อย set_var (ชื่อ ByVal, ค่า ByVal, ByVal ผนวก)
ดิม วาล
ถ้า IsNull(Value) ดังนั้น Val = "" Else Val = Value
ถ้า m_ValueList.Exists(Name) แล้ว
หากผนวกแล้ว m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
อื่น m_ValueList.Item(ชื่อ) = Val
อื่น
m_ValueList.เพิ่มชื่อ, ค่า
สิ้นสุดถ้า
จบหมวดย่อย
สาธารณะย่อย unset_var (ชื่อ ByVal)
ถ้า m_ValueList.Exists(ชื่อ) ดังนั้น m_ValueList.Remove(ชื่อ)
จบหมวดย่อย
ฟังก์ชั่นส่วนตัว InstanceValue (ByVal BlockTag)
กุญแจสลัวฉัน
InstanceValue = m_BlockList.Item (BlockTag)
คีย์ = m_ValueList.Keys
สำหรับ i=0 ถึง m_ValueList.Count-1
InstanceValue = แทนที่ (InstanceValue, "{" & คีย์ (i) & "}", m_ValueList.Item (คีย์ (i)))
ต่อไป
ฟังก์ชันสิ้นสุด
แยกย่อยสาธารณะ (ชื่อ ByVal, ByVal BlockTag, ByVal ผนวก)
หากไม่ใช่ m_BlockList.Exists (BlockTag) ดังนั้น ShowError ("แท็กบล็อกที่ไม่ระบุ" & พาเรนต์)
ถ้า m_ValueList.Exists(Name) แล้ว
ถ้าผนวกแล้ว m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
อื่น m_ValueList.Item (ชื่อ) = InstanceValue (BlockTag)
อื่น
m_ValueList.Add ชื่อ, InstanceValue (BlockTag)
สิ้นสุดถ้า
จบหมวดย่อย
ฟังก์ชั่นส่วนตัวเสร็จสิ้น (เนื้อหา ByVal)
เลือกกรณี m_Unknowns
กรณี "keep" เสร็จสิ้น = เนื้อหา
กรณี "ลบ"
m_RegExp.Pattern = "{[^ trn}]+}"
เสร็จสิ้น = m_RegExp.Replace (เนื้อหา "")
กรณี "แสดงความคิดเห็น"
m_RegExp.Pattern = "{([^ trn}]+)}"
finish = m_RegExp.Replace(เนื้อหา, "<!-- ตัวแปรเทมเพลต $1 ไม่ได้กำหนด -->")
Case Else เสร็จสิ้น = เนื้อหา
สิ้นสุดการเลือก
ฟังก์ชันสิ้นสุด
ย่อยสาธารณะ p (ชื่อ ByVal)
ถ้าไม่ใช่ m_ValueList.Exists (ชื่อ) ดังนั้น ShowError ("ไม่มีอยู่" & ชื่อ)
Response.Write(เสร็จสิ้น(m_ValueList.Item(ชื่อ)))
จบหมวดย่อย
จบคลาส
%>
3. ตัวอย่างการใช้งาน ต่อไปนี้เป็นสามตัวอย่างสำหรับการอธิบาย
1) ไฟล์เทมเพลตการแทนที่ค่าอย่างง่ายคือ myTemple.tpl เนื้อหา:
<html><title>การแทนที่เทมเพลต ASP อย่างง่าย</title><body>
ขอแสดงความยินดี! คุณได้รับรางวัลเฟอร์รารี {some_color} คันหนึ่ง!
</body>
ต่อไปนี้คือโค้ด ASP (kktTemplate.inc.asp คือคลาสเทมเพลตที่ระบุด้านบน):
<!--#รวม VIRTUAL="kktTemplate.inc.asp"-->
-
หรี่ my_color, kkt
my_color = "สีแดง"
set kkt = new kktTemplate 'สร้างวัตถุเทมเพลต'
kkt.set_file "hndKktTemp", "myTemple.tpl" 'ตั้งค่าและอ่านไฟล์เทมเพลต myTemple.tpl
kkt.set_var "some_color", my_color, false 'ตั้งค่าของตัวแปรเทมเพลต some_color = my_color
kkt.parse "out", "hndKktTemp", false 'ตัวแปรเทมเพลต out = ไฟล์ที่ประมวลผล
kkt.p "out" 'ส่งออกเนื้อหาของออก
set kkt = none 'ทำลายวัตถุเทมเพลต'
%>
ผลลัพธ์หลังการดำเนินการคือ:
<html><title>การแทนที่เทมเพลต ASP อย่างง่าย</title><body>
ขอแสดงความยินดี! คุณชนะรางวัลเฟอร์รารี่สีแดง!
</ร่างกาย>
2) ไฟล์เทมเพลตตัวอย่างการสาธิต Loop block myTemple2.tpl:
<html><title>การสาธิตบล็อกเทมเพลต ASP</title><body>
<table cellspacing="2" border="1"><tr><td>สัตว์ชนิดใดที่คุณชอบดังต่อไปนี้</td></tr>
<!-- เริ่มรายการสัตว์ -->
<tr><td><input type="radio" name="chk">{animal}</td></tr>
<!-- จบรายการสัตว์ -->
</ตาราง>
</body>
รหัส ASP:
<!--#รวม VIRTUAL="kktTemplate.inc.asp"-->
-
สัตว์สลัว kkt ฉัน
สัตว์ = Array("หมูน้อย", "ลูกสุนัข", "เสี่ยวเฉียง")
ตั้งค่า kkt = kktTemplate ใหม่
kkt.set_file "hndKktTemp", "myTemple2.tpl"
kkt.set_block "hndKktTemp", "AnimalList", "รายการ"
สำหรับ i=0 ถึง UBound (สัตว์)
kkt.set_var "สัตว์" สัตว์ (i) เท็จ
kkt.parse "รายการ", "AnimalList" จริง
ต่อไป
kkt.parse "ออก", "hndKktTemp", เท็จ
kkt.p "ออก"
ตั้งค่า kkt = ไม่มีอะไร
-
ผลการดำเนินการ:
<html><title>การสาธิตบล็อกเทมเพลต ASP</title><body>
<table cellspacing="2" border="1"><tr><td>สัตว์ชนิดใดที่คุณชอบดังต่อไปนี้</td></tr>
<tr><td><input type="radio" name="chk">หมูน้อย</td></tr>
<tr><td><input type="radio" name="chk">ลูกสุนัข</td></tr>
<tr><td><input type="radio" name="chk">เสี่ยวเฉียง</td></tr>
</ตาราง>
</ร่างกาย>
3) ไฟล์เทมเพลตสาธิตบล็อกที่ซ้อนกัน myTemple3.tpl:
<html><title>เทมเพลต ASP - การสาธิตบล็อกที่ซ้อนกัน</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">การทดสอบ {myname}</div></td></tr>
<tr><td>สวนสัตว์และสวนพฤกษศาสตร์ของฉัน: </td> </tr>
<!-- เริ่มรายการสัตว์ -->
<tr><td>{สัตว์</td></tr>
<!-- เริ่มต้น plantList -->
<tr><td> {plant}</td></tr>
<!-- จบรายการพืช -->
<!-- จบรายการสัตว์ -->
</ตาราง>
</ร่างกาย>
</html>
รหัส ASP:
<!--#รวม VIRTUAL="kktTemplate.inc.asp"-->
-
หรี่ my_color, kkt, myname, สัตว์, พืช
ตั้งค่า kkt = kktTemplate ใหม่
myname = "การทดสอบบล็อก kktTemplate..."
สัตว์ = อาร์เรย์ ("สัตว์", "พืช")
plant = array(array("หมูน้อย", "Xiaobai", "Xiaoqiang"), array ("Rose", "ดอกทานตะวัน"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "myname", myname, เท็จ
kkt.set_block "hndKktTemp", "animalList", "a"
kkt.set_block "animalList", "plantList", "p"
สำหรับ i=0 ถึง UBound(animal)
kkt.set_var "สัตว์" สัตว์ (i) เท็จ
kkt.unset_var "p"
'kkt.set_var "p", "", เท็จ
สำหรับ j=0 ถึง UBound(plant(i))
kkt.set_var "พืช", พืช (i) (j), เท็จ
kkt.parse "p", "plantList" จริง
ต่อไป
kkt.parse "a", "animalList" จริง
ต่อไป
kkt.parse "ออก", "hndKktTemp", เท็จ
kkt.p "ออก"
%>
ผลการดำเนินการ:
<html><title>เทมเพลต ASP - การสาธิตบล็อกที่ซ้อนกัน</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">การทดสอบบล็อก kktTemplate...ทดสอบ</div></td></tr>
<tr><td>สวนสัตว์และสวนพฤกษศาสตร์ของฉัน: </td> </tr>
<tr><td>สัตว์</td></tr>
<tr><td> หมูน้อย</td></tr>
<tr><td> เสี่ยวไป๋</td></tr>
<tr><td> เสี่ยวเฉียง</td></tr>
<tr><td>พืช</td></tr>
<tr><td> กุหลาบ</td></tr>
<tr><td> ดอกทานตะวัน</td></tr>
</ตาราง>
</ร่างกาย>
</html>
รหัสทั้งหมดที่กล่าวถึงในบทความนี้สามารถดาวน์โหลดได้ที่นี่: