แนะนำ: วิธีการจัดรูปแบบการแบ่งหน้า ASP และวันที่เป็นรูปแบบ RFC822 คำนวณหน้าเว็บฮิฮิคุณไม่จำเป็นต้องตัดสินเนื้อหาที่อ้างอิงต่อไปนี้: intnumpage = abs (int (-(intnumrecord/intperpage))) จัดรูปแบบวันที่
หากห้องคอมพิวเตอร์กำลังจะปิดหรือหากคุณกำลังรีบไปวันที่มม. โปรดข้ามไปยังวรรคที่สี่โดยตรง
สคริปต์ที่อธิบายไว้ด้านล่างรวมถึงสคริปต์ฝั่งเซิร์ฟเวอร์และสคริปต์ฝั่งไคลเอ็นต์ สคริปต์ฝั่งเซิร์ฟเวอร์อ้างถึงส่วนหนึ่งของสคริปต์ที่ทำงานบนเซิร์ฟเวอร์ ตัวอย่างเช่นการตอบสนองทั่วไปการเขียนจะทำงานบนเซิร์ฟเวอร์อย่างชัดเจน สคริปต์ฝั่งเซิร์ฟเวอร์สามารถเขียนได้ในภาษา VBScript และ JScript ในบทความนี้ใช้ VBScript JScript เป็นหลักการเดียวกัน
สคริปต์ไคลเอนต์ยังสามารถพิจารณาให้รวมสองภาษา: VBScript และ JavaScript ซึ่งเป็นภาษาสคริปต์ที่ทำงานบนเบราว์เซอร์ไคลเอนต์ ตัวอย่างเช่นเมื่อเราเยี่ยมชมเว็บเพจกล่องข้อความจะปรากฏขึ้นซึ่งทำโดยใช้สคริปต์ไคลเอนต์ (การแจ้งเตือน, msgbox, ฯลฯ ) และเห็นได้ชัดว่าไม่ใช่สิ่งที่สคริปต์ฝั่งเซิร์ฟเวอร์สามารถทำได้ มีความแตกต่างอย่างมากระหว่างสคริปต์ไคลเอนต์และสคริปต์เซิร์ฟเวอร์ (ในเบราว์เซอร์เช่น IE และ Firefox) นั่นคือสคริปต์ไคลเอนต์สามารถเข้าถึงโมเดลวัตถุเอกสาร (DOM) และใช้งานวัตถุในหน้า (เช่นการแก้ไขชื่อหน้า
ก่อนอื่นให้เข้าใจกระบวนการดำเนินการหน้า ASP
1.IIS ค้นหาไฟล์ ASP และส่งไปยังเอ็นจิ้น ASP (ปกติ ASP.DLL) สำหรับการประมวลผล
2. เอ็นจิ้นเปิดไฟล์ ASP นี้และค้นหาเนื้อหาระหว่าง < % และ %> และแน่นอนเนื้อหาระหว่าง <script runat = server> และ </script> ที่สอดคล้องกัน เนื้อหาเหล่านี้เรียกว่าบล็อกสคริปต์ เฉพาะเนื้อหาในบล็อกสคริปต์เท่านั้นที่แยกวิเคราะห์โดยเครื่องยนต์และเนื้อหาอื่น ๆ จะถูกละเว้นและถูกแทรกระหว่างบล็อกสคริปต์เป็นอักขระที่ไม่มีความหมาย มีความจำเป็นที่จะต้องชี้แจงว่าในความเป็นจริงมีมากกว่าเนื้อหานี้ถูกแยกวิเคราะห์ ไฟล์ที่รวมอยู่ด้านเซิร์ฟเวอร์ของ <!-#รวม ***-> คลาสจะรวมอยู่ด้วยและประมวลผลโดยเครื่องยนต์ด้วย หากคุณอ่านโปรแกรมเพิ่มเติมคุณจะรู้ว่าวัตถุ <Ojrop> บางอย่างที่ทำเครื่องหมายเป็นเซิร์ฟเวอร์ที่มีแอตทริบิวต์ Runat จะถูกประมวลผลด้วยดังนั้นฉันจะไม่พูดถึงมันในเชิงลึกที่นี่
3. เอ็นจิ้นดำเนินการสคริปต์ในบล็อกสคริปต์ สคริปต์ฝั่งเซิร์ฟเวอร์เหล่านี้ดำเนินการโดยรวมนั่นคือรหัสต่อไปนี้สามารถเขียนได้:
| ต่อไปนี้เป็นเนื้อหาที่ยกมา: - หรอกฉัน สำหรับ i = 1 ถึง 5 %> Hello World! < % ถัดไป %> |
เครื่องยนต์ไม่ได้แยกวิเคราะห์บล็อกสคริปต์เหล่านี้แยกกันทำให้เกิดข้อผิดพลาดทางไวยากรณ์ในบล็อกสคริปต์ทั้งสอง ดังนั้นเราจึงได้ข้อสรุปต่อไปนี้: รหัสสคริปต์ที่ไม่ใช่เซิร์ฟเวอร์ทั้งหมดจะถูกส่งไปยังลูกค้าและเป็นไปได้ว่ารหัสสคริปต์ที่ไม่ใช่เซิร์ฟเวอร์นี้ถูก จำกัด โดยบล็อกสคริปต์ เซิร์ฟเวอร์จะไม่ต้องกังวลเกี่ยวกับการดำเนินการของสคริปต์ไคลเอนต์ แต่สคริปต์ไคลเอนต์ที่แตกต่างกันสามารถส่งออกผ่านสคริปต์เซิร์ฟเวอร์
4. ในท้ายที่สุดเอ็นจิ้นจะสร้างสตรีมข้อความหรือผลการดำเนินการของสคริปต์ซึ่งถือได้ว่าเป็นสตริงซึ่งเป็นรหัสที่ส่งไปยังหน้าเว็บของเบราว์เซอร์ไคลเอนต์ เบราว์เซอร์ไคลเอนต์จะแสดงหน้า ในเวลานี้ซอร์สโค้ด (ไฟล์ต้นฉบับ) ของหน้าไม่มีสคริปต์ฝั่งเซิร์ฟเวอร์ แต่มีผลการดำเนินการของสคริปต์ฝั่งเซิร์ฟเวอร์ (ชัดเจน)
< % … %> และ <script runat = เซิร์ฟเวอร์> … </script>
พวกเขาทั้งหมดเป็นสคริปต์ฝั่งเซิร์ฟเวอร์ที่ประมวลผลและดำเนินการในเวลาเดียวกัน พวกเขาถูกประหารชีวิตโดยรวม
< % … %> และ <ภาษาสคริปต์ = …> … </script>
อดีตเป็นสคริปต์ฝั่งเซิร์ฟเวอร์และหลังเป็นสคริปต์ฝั่งไคลเอ็นต์ อดีตจะถูกดำเนินการก่อนและหลังจะดำเนินการในภายหลัง
ในความเป็นจริงมันไม่เป็นความจริงทั้งหมด สคริปต์ของทั้งสองอาจถูกดำเนินการในเวลาเดียวกัน แต่พื้นที่แตกต่างกันและยังคงเป็น: อดีตถูกดำเนินการบนเซิร์ฟเวอร์และหลังถูกดำเนินการในเบราว์เซอร์ไคลเอนต์ อดีตจะต้องดำเนินการอย่างมีเหตุผลล่วงหน้าโดยหลัง ในขณะเดียวกันเราก็สรุปว่าในระหว่างการดำเนินการของหน้าเดียวกันสคริปต์ไคลเอนต์ไม่สามารถป้อนกลับไปยังสคริปต์เซิร์ฟเวอร์ได้ แต่อย่างใด นั่นคือไคลเอนต์เรียกดูสมุดข้อความของคุณและส่งข้อความใหม่หรือค่าที่ได้จากสคริปต์ไคลเอนต์ใด ๆ ไม่สามารถประมวลผลในการตอบกลับเซิร์ฟเวอร์เดียวกัน
เกี่ยวกับการโทรขององค์ประกอบ
โปรดทราบว่าสคริปต์ฝั่งเซิร์ฟเวอร์และสคริปต์ฝั่งไคลเอ็นต์เป็นสคริปต์ทั้งสองดังนั้นคุณสามารถสร้างส่วนประกอบ XMLHTTP โดยธรรมชาติส่วนประกอบ ADODB.Connection ฯลฯ แต่ไม่ใช่ที่ใดก็ได้
หาก XMLHTTP ถูกใช้สำหรับการรวบรวมข้อมูลหน้าเว็บ (เช่นคอลเลกชัน) บนเซิร์ฟเวอร์จะต้องสร้างในสคริปต์เซิร์ฟเวอร์ หากใช้สำหรับ AJAX สำหรับไคลเอนต์และแบ็กเอนด์จะเข้าถึงหน้าเว็บบนเซิร์ฟเวอร์โดยไม่ต้องรีเฟรชมันจะทำงานบนไคลเอนต์และสร้างขึ้นตามธรรมชาติบนไคลเอนต์
ส่วนประกอบ ADODB.Connection ใช้เพื่อเข้าถึงฐานข้อมูล โดยทั่วไปจะถูกสร้างขึ้นทางฝั่งเซิร์ฟเวอร์ ท้ายที่สุดโปรแกรม ASP ฝั่งเซิร์ฟเวอร์กำลังเรียกใช้ข้อมูลฐานข้อมูล อย่างไรก็ตามหากฐานข้อมูลของคุณเชื่อมต่อกับไคลเอนต์จริงๆ (เช่น http://bbs.bccn.net/thread-224966-1-2.html) ดังนั้นมันจะถูกสร้างขึ้นอย่างไม่ต้องสงสัยในสคริปต์ไคลเอนต์
ในระยะสั้นสิ่งที่ขัดแย้งและแง่มุมต่าง ๆ ของพวกเขามีลักษณะของตัวเอง สิ่งต่าง ๆ มีความขัดแย้งที่แตกต่างกัน สิ่งเดียวกันมีความขัดแย้งที่แตกต่างกันในกระบวนการและขั้นตอนการพัฒนาที่แตกต่างกัน ความขัดแย้งที่แตกต่างกันในสิ่งเดียวกันและสองแง่มุมที่แตกต่างกันของความขัดแย้งเดียวกันมีลักษณะของตัวเอง (ถ้าคุณไม่เข้าใจพวกเขาคุณสามารถเพิกเฉยต่อพวกเขา ... ) หลักการนี้กำหนดให้เราปฏิบัติตามหลักการของการวิเคราะห์เฉพาะของปัญหาเฉพาะและภายใต้การแนะนำของหลักการของความเป็นสากลของความขัดแย้งเราควรวิเคราะห์ความเฉพาะเจาะจงของความขัดแย้งโดยเฉพาะและค้นหาวิธีที่ถูกต้องในการแก้ไขพวกเขา คัดค้านการยอมรับขนาดเดียวกันของวิธีเดียวเพื่อแก้ไขความขัดแย้งระหว่างสิ่งต่าง ๆ นี่คือสิ่งที่คุณพูดเมื่อคุณเปิดกุญแจและร้องเพลงเมื่อคุณไปที่ภูเขา
สคริปต์ VBScript ฝั่งเซิร์ฟเวอร์ใช้เมธอด Server.CreateObject (className) เพื่อสร้างวัตถุและสคริปต์ VBScript ฝั่งไคลเอ็นต์ใช้เมธอด CreateObject (className) เพื่อสร้างวัตถุ
ข้อผิดพลาดทั่วไป
| ต่อไปนี้เป็นเนื้อหาที่ยกมา: - ฟังก์ชั่น tsize (b) 'นี่คือฟังก์ชั่นที่กำหนดเองของฉัน tsize = จีน ฟังก์ชันสิ้นสุด - <a href = JavaScript: <%tsize ('ตัวแปร')%>> คลิกที่นี่เพื่อใช้ฟังก์ชั่นที่ฉันกำหนด </a> (http://bbs.bccn.net/thread-225244-1-1.html) |
การวิเคราะห์ข้อผิดพลาด:
สับสนความแตกต่างระหว่างสคริปต์ฝั่งเซิร์ฟเวอร์และสคริปต์ฝั่งไคลเอ็นต์ เมื่อดำเนินการจริงเราจะพบว่าไคลเอนต์ไม่ได้รับรหัสใด ๆ เช่น tsize เลยเพราะ TSize เป็นโปรแกรมฝั่งเซิร์ฟเวอร์ หลังจากถูกประมวลผลโดยเครื่องยนต์ (โปรดทราบว่าการประมวลผลฟังก์ชั่นของเอ็นจิ้นนั้นถูกเรียกอย่างหมดจดโดยสคริปต์ฝั่งเซิร์ฟเวอร์และจะไม่ถูกส่งกลับไปยังไคลเอนต์) และมันจะหายไปและไม่สามารถทำงานกับไคลเอนต์ได้ ซึ่งหมายความว่าสคริปต์ไคลเอนต์ไม่สามารถเรียกฟังก์ชันของสคริปต์ฝั่งเซิร์ฟเวอร์ได้โดยตรง
อันที่จริงโปรแกรมนี้มีข้อผิดพลาดทางไวยากรณ์ เมื่อเครื่องยนต์ประมวลผลเนื้อหานี้จะพบเนื้อหาระหว่าง <%ถึง%> นั่นคือ <%tsize ('ตัวแปร')%> เห็นได้ชัดว่าเนื้อหานี้ไม่สอดคล้องกับกฎไวยากรณ์ของ VBScript การเปลี่ยนเป็น <%= tsize (ตัวแปร)%> ไม่มีข้อผิดพลาดทางไวยากรณ์ในสคริปต์ฝั่งเซิร์ฟเวอร์ ในเวลานี้ฟังก์ชั่น TSIZE สามารถส่งคืนค่าไปยังประเทศจีนได้ตามปกติดังนั้นแอตทริบิวต์ HREF ที่ลูกค้าได้รับจะถูกเขียนขึ้นเช่นนี้: JavaScript: จีนไม่สามารถดำเนินการได้
ผลกระทบของสคริปต์ฝั่งเซิร์ฟเวอร์ต่อสคริปต์ฝั่งไคลเอ็นต์
ดังที่ได้กล่าวไว้ก่อนหน้านี้สคริปต์ฝั่งเซิร์ฟเวอร์จะดำเนินการอย่างมีเหตุผลล่วงหน้าของสคริปต์ฝั่งไคลเอ็นต์ดังนั้นรหัสดังกล่าวจึงเป็นไปได้:
| ต่อไปนี้เป็นเนื้อหาที่ยกมา: - หรอกฉัน สำหรับ i = 1 ถึง 5 response.write <script type = text/javascript> _ & Alert ('Hello World! & i &') </script> ต่อไป - เกี่ยวกับการดำเนินการของการตอบสนอง REDIRECT และ JAVASCRIPT โปรดทราบว่ารหัสต่อไปนี้ถูกเขียนอย่างไม่ถูกต้อง: - Response.redirect index.asp response.write <script type = text/javascript> _ & แจ้งเตือน ('ข้อผิดพลาดรหัสผ่าน!') </script> - |
นี่เป็นความผิดพลาดทั่วไป นักเขียนมักคิดว่าการเขียนโค้ดด้วยวิธีนี้อาจทำให้ไคลเอนต์ปรากฏตัวพร้อมท์ข้อผิดพลาดรหัสผ่านแล้วหันไปหา index.asp อันที่จริงสิ่งนี้ไม่สามารถเกิดขึ้นได้ แม้ว่าจะมีการแลกเปลี่ยนรหัสสองบรรทัดตามลำดับ แต่ก็เป็นไปไม่ได้ที่จะบรรลุเอฟเฟกต์นี้
เหตุผลเกี่ยวข้องกับวิธีที่เซิร์ฟเวอร์จัดการรหัสสองบรรทัด รหัสสองบรรทัดนี้ไม่สามารถทำงานได้ในเวลาเดียวกัน
Response.write ส่งข้อความถึงไคลเอนต์ เนื้อหาของข้อความนี้อาจเป็นสคริปต์ เบราว์เซอร์ไคลเอนต์สามารถเรียกใช้สคริปต์นี้หลังจากได้รับ โปรดทราบว่าสามารถดำเนินการได้หลังจากได้รับเท่านั้น
Response.redirect ส่งส่วนหัว HTTP ไปยังไคลเอนต์ (ส่วนหัว HTTP คืออะไรลองมาด้วยวิธีนี้ตัวอย่างเช่นการเขียนถึงคุกกี้ไคลเอนต์คือข้อมูลส่วนหัว HTTP และข้อมูลส่วนหัว HTTP จะถูกส่งกลับไปที่หัวเรื่อง HTTP ข้อมูล.) เนื้อหาของข้อมูลจะบอกให้เบราว์เซอร์ลูกค้าข้ามไปที่หน้าเพื่อเรียกดู โปรดทราบว่าข้อมูลการเปลี่ยนเส้นทางนี้ทำงานได้ทันทีนั่นคือข้อมูลการเปลี่ยนเส้นทางนี้เป็นเอกสิทธิ์ เมื่อเปิดบัฟเฟอร์ไม่ว่าจะมีการเขียนเนื้อหาลงในบัฟเฟอร์มากน้อยเพียงใดโดยใช้ Response.write เมื่อมีการตอบสนองการถูกเรียกใช้แล้วบัฟเฟอร์จะถูกล้างและคำสั่งส่วนหัวจะถูกส่งไปยังเบราว์เซอร์ไคลเอนต์ หากเราติดตามการดำเนินการของโปรแกรมแบบไดนามิกเราจะพบว่าหลังจากการตอบกลับการตอบกลับโปรแกรมจะหยุดการดำเนินการดังนั้นโปรดทราบว่าโปรแกรมฝั่งเซิร์ฟเวอร์จะต้องปิดการเชื่อมต่อข้อมูลและการดำเนินการอื่น ๆ ก่อนที่จะโทรตอบกลับ
ดังนั้นตัวอย่างข้างต้นควรแก้ไขอย่างไร? หากคุณไม่เต็มใจที่จะแก้ไข index.asp เพื่อเพิ่มพรอมต์สคริปต์คุณสามารถใส่คำสั่งพวงมาลัยลงในสคริปต์ไคลเอ็นต์เพื่อดำเนินการเช่นนี้:
| ต่อไปนี้เป็นเนื้อหาที่ยกมา: - response.write <script type = text/javascript> _ & Alert ('!'); location.href = 'index.asp' </script> - |
แบ่งปัน: การเขียนโปรแกรมขั้นสูง ASP 3.0 (33) 7.4.2 การจัดการข้อผิดพลาด VBScript ใน VBScript, Interpreter สคริปต์ไม่สามารถจัดการกับข้อผิดพลาดใด ๆ ที่พบและดำเนินการต่อเพื่อเรียกใช้คำสั่งถัดไปโดยใช้คำสั่ง ON ERROR RESUME NEXT เมื่อคำสั่งนี้ได้รับการประมวลผลแล้วเอ็นจิ้นสคริปต์จะดำเนินการต่อไปเพื่อเรียกใช้โปรแกรมที่ตามมา