عند استخدام ASP لكتابة المجتمعات الافتراضية والتسوق عبر الإنترنت والبرامج الأخرى، تلعب كائنات التطبيق والجلسة دورًا حاسمًا، ويمكن استخدامها بمرونة وعقلانية.
هذا الكائن هو المفتاح لتحسين جودة البرنامج. اسمحوا لي أن أقدم لكم مقدمة متعمقة لهذين الكائنين المدمجين في ASP بناءً على تجربتي في هذا المجال.
1. نظرة عامة على أعضاء كائن التطبيق
يتضمن أعضاء كائن التطبيق مجموعات كائنات التطبيق والأساليب والأحداث.
⒈مجموعة من كائنات التطبيق
مجموعة المحتويات: مجموعة من كافة المتغيرات المخزنة في كائن Applicaiton والتي لم يتم تعريفها باستخدام عنصر <OBJECT>.
StaticObjects: مجموعة من كافة المتغيرات المخزنة في كائن التطبيق المحدد باستخدام عنصر <OBJECT>
مثال: يوجد التعيين التالي في default.asp
التطبيق (أ) = أ
التطبيق (ب) = 128
التطبيق (ج) = خطأ
ثم هناك مجموعة المحتويات
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(): تأمين كائن التطبيق بحيث يمكن لصفحة ASP الحالية فقط الوصول إلى المحتوى.
فتح (): فتح كائن التطبيق
مثال: في default.asp:
التطبيق (أ) = أ
التطبيق (ب) = 128
التطبيق (ج) = خطأ
Response.write application.contents(1)&<br>
Response.write application.contents(2)&<br>
Response.write application.contents(3)&<br>
استجابة. الكتابة بعد إزالة ب:
application.contents.remove(ب)
Response.write application.contents(1)&<br>
Response.write application.contents(2)&<br>
نتيجة التنفيذ:
أ
128
خطأ شنيع
بعد الإزالة ب:
أ
خطأ شنيع
إذا كنت تريد حذف جميع المتغيرات في المجموعة، فما عليك سوى استخدام application.contents.removeall. أما بالنسبة لطرق القفل والفتح، فغالبًا ما يتم استخدامها عمليًا
والقارئ أيضًا على دراية به، لذا لن يكون عبئًا هنا.
⒊ حدث كائن التطبيق
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
⒉خصائص كائن الجلسة
صفحة الرموز: قابلة للقراءة/للكتابة. نوع عدد صحيح. يحدد صفحة الرموز المستخدمة لعرض محتوى الصفحة في المستعرض. صفحة الرموز هي مجموعة أحرف من القيم الرقمية التي تستخدمها اللغات المختلفة
صفحات رموز مختلفة. على سبيل المثال، صفحة الرموز ANSI هي 1252، وصفحة الرموز اليابانية هي 932، وصفحة الرموز الصينية المبسطة هي 936.
LCID: قابل للقراءة/للكتابة. نوع عدد صحيح. يحدد معرف لغة الصفحة المرسل إلى المتصفح. LCID هو اختصار قياسي دولي يحدد المنطقة بشكل فريد، على سبيل المثال.
2057 يحدد رمز العملة للمنطقة الحالية بالجنيه الاسترليني.
معرف الجلسة: للقراءة فقط. نوع طويل. إرجاع معرف الجلسة لهذه الجلسة. في كل مرة يتم إنشاء جلسة، يتم تعيين معرف تلقائيًا بواسطة الخادم. يمكن أن يرتكز عليه
تحدد القيمة أي من المستخدمين يصل إلى الخادم أولاً.
المهلة: قابلة للقراءة/للكتابة. نوع عدد صحيح. يحدد حد المهلة بالدقائق للجلسة. إذا لم يقوم المستخدم بالتحديث أو طلب أي واحد خلال هذا الوقت
صفحة الويب، ستنتهي الجلسة التي أنشأها المستخدم تلقائيًا. القيمة الافتراضية هي 20.
السمات المذكورة أعلاه قليلة الاستخدام في التطبيقات الفعلية، ولا تحتاج إلى تعديل بشكل أساسي.
⒊طرق كائن الجلسة
Contents.Remove (اسم المتغير): قم بإزالة المتغير المحدد من مجموعة Session.contents
Contents.Removeall(): إزالة كافة المتغيرات في مجموعة Session.contents
Abandon(): إنهاء جلسة المستخدم الحالية وتدمير كائن الجلسة الحالية.
إن أساليب Contents.Remove (اسم متغير) وContents.Removeall() لكائن الجلسة هي في الأساس نفس أساليب كائن التطبيق.
للمساعدة في الفهم، يمكنك الرجوع إلى المثال أعلاه لتغيير التطبيق إلى الجلسة. ما أريد شرحه هنا هو Contents.Removeall() و Abandon()
الفرق هو أن تنفيذ هاتين الطريقتين سيحرر التيار
كافة متغيرات الجلسة الخاصة بجلسة المستخدم، والفرق هو أن Contents.Removeall() يقوم ببساطة بتحرير قيمة متغير الجلسة دون إنهاء الجلسة الحالية.
بالإضافة إلى إطلاق متغير الجلسة، سينهي Abandon() أيضًا الجلسة ويطلق حدث Session_OnEnd، وآمل أن ينتبه الجميع إلى الفرق بين الاثنين.
⒋ أحداث كائن الجلسة
OnStart: يتم تشغيله عند إنشاء جلسة مستخدم ASP. يتم إنشاء هذا الحدث بمجرد أن يطلب أي مستخدم أي صفحة من هذا الخادم.
OnEnd: يتم تشغيله عند انتهاء جلسة مستخدم ASP. سيتم تشغيل هذا الحدث أيضًا عند استخدام أسلوب Abandon() أو المهلة.
هذين الحدثين هما نفس حدثي OnStart وOnEnd للتطبيق ويجب وضعهما في الملف Global.asa.
دعونا نركز على دراسة استخدام هذه الأحداث الأربعة معك.
3.Global.asa
تتضمن كائنات التطبيق والجلسة الخاصة بـ ASP ميزة لا تمتلكها كائنات ASP المضمنة الأخرى - وهي الأحداث. في كل مرة يقوم زائر بالوصول إلى الخادم، أ
أحداث OnStart (سيقوم الزائر الأول بتشغيل أحداث OnStart الخاصة بالتطبيق والجلسة في نفس الوقت، ولكن التطبيق يسبق الجلسة)، كل زائر
سيتم تشغيل حدث OnEnd عند انتهاء كل جلسة (سيتم تشغيل أحداث OnEnd لكل من التطبيق والجلسة عند انتهاء جلسة الضيف الأخيرة، ولكن
الجلسة تسبق التطبيق).
يتم استخدام الحدثين OnStart وOnEnd بشكل عام في المجتمعات الافتراضية لحساب عدد الأشخاص المتصلين بالإنترنت، وتعديل حالة المستخدمين المتصلين وغير المتصلين، وما إلى ذلك. لتحديد هذين الأمرين على وجه التحديد
الملف، فأنت بحاجة إلى كتابة التعليمات البرمجية في ملف Global.asa ووضع الملف في الدليل الجذر للموقع (الافتراضي هو Inetpubwwwroot). فضلاً عن ذلك،
تحدد كائنات التطبيق وجلسة العمل كائنات ASP مضمنة أخرى (الاستجابة، والطلب،
الخادم، الجلسة...) لا يمكن استخدامها. فيما يلي مثال لحساب عدد الأشخاص المتصلين بالإنترنت في مجتمع افتراضي لتوضيح كيفية استخدام هذين الحدثين.
وصف الملف:
يقع global.asa في الدليل d:Inetpubwwwroot
يقع default.asp في الدليل d:Inetpubwwwroot، وهو صفحة تسجيل الدخول للمجتمع الظاهري
يقع تسجيل الدخول.asp في الدليل d:Inetpubwwwroot ويستخدم للكشف عن اسم المستخدم وكلمة المرور التي أدخلها المستخدم.
يقع ملف Index.asp في الدليل d:Inetpubwwwroot، وهو الصفحة الرئيسية للمجتمع الافتراضي
يقع bbs.mdb في الدليل d:Inetpubwwwroot وهو عبارة عن قاعدة بيانات تقوم بتخزين معلومات المستخدم.
هيكل قاعدة البيانات (الوصول):
===جدول bbs===
معرف معرف المستخدم، عدد صحيح طويل
اسم اسم المستخدم، نوع النص
كلمة المرور رمز، نوع النص
حالة الاتصال بالإنترنت، نعم/لا
===global.asa===
<script LANGUAGE=VBScript RUNAT=الخادم>
التطبيق الفرعي_OnStart
التطبيق (عبر الإنترنت) = 0
نهاية الفرعية
subApplication_OnEnd
الفرعية الثانية
SubSession_OnStart
نهاية الفرعية
SubSession_OnEnd
إذا كانت session.contents(pass) ثم "حدد ما إذا كانت Session_OnEnd للمستخدم الذي قام بتسجيل الدخول
application.lock
التطبيق (عبر الإنترنت) = التطبيق (عبر الإنترنت)-1
application.unlock
نهاية إذا
نهاية الفرعية
</ نص >
=============
===login.asp===
...'التحقق من كلمة المرور، والاتصال بقاعدة البيانات، والتحقق من صحة اسم المستخدم وكلمة المرور التي أدخلها المستخدم.
إذا نجح التحقق من كلمة المرور بعد ذلك
الجلسة (الاسم) = rs (الاسم)
الجلسة (المعرف) = روبية (المعرف)
جلسة (تمرير) = صحيح
آخر
rs. Close
conn. Close
استجابة.كتابة كلمة المرور خاطئة!
Response.end
نهاية إذا
application.lock
التطبيق(على الانترنت)=التطبيق(على الانترنت)+1
conn.Execute (تحديث مجموعة bbs عبر الإنترنت=1 حيث id=&session(id))'قم بتعيين حالة المستخدم على الإنترنت
application.unlock
rs. Close
conn. Close
Response.redirect Index.asp 'بعد تهيئة البيانات، انتقل إلى الصفحة الرئيسية للمجتمع
===========
في هذا المثال، استخدم متغير التطبيق (عبر الإنترنت) لتسجيل عدد الأشخاص المتصلين بالإنترنت الذين قاموا بتسجيل الدخول إلى المجتمع، لأنه بمجرد وصول المستخدم إلى الخادم، لا يهم ما إذا كان المستخدم
عند تسجيل الدخول، سيتم إنشاء حدث OnStart، لذلك لا يمكنك زيادة Applicaiton (عبر الإنترنت) بمقدار واحد في حدث OnStart. لأنه بغض النظر عما إذا كانت جلسة مستخدم مسجل الدخول
سيتم إنشاء حدث OnEnd عند انتهائه (إذا قام زائر بزيارة الخادم ولكنه لم يسجل الدخول إلى المجتمع، فسيتم إنشاء حدث OnEnd أيضًا بعد انتهاء جلسته)، لذا
يتم استخدام عبارة if في حدث Session_OnEnd لتحديد ما إذا كان حدث OnEnd لمستخدم قام بتسجيل الدخول. إذا كان الأمر كذلك، فسيتم تقليل عدد الأشخاص المتصلين بمقدار واحد.
هذا مجرد مثال بسيط لحساب عدد الأشخاص المتصلين بالإنترنت، بالنسبة لمجتمع افتراضي كامل، لا يكفي مجرد حساب عدد الأشخاص المتصلين بالإنترنت
يوجد حقل متصل في قاعدة البيانات يُستخدم لتسجيل حالة اتصال المستخدم عندما يقوم المستخدم بتسجيل الدخول، ويتم تعيين متصل إلى 1 في login.asp، ولكنه لا يظهر عندما يكون المستخدم غير متصل بالإنترنت.
تم تعيين الاتصال بالإنترنت على 0. لتحسينه، تحتاج إلى تعديل حدث Session_OnEnd وتعيين الاتصال بالإنترنت على 0 في هذا الحدث.
===loal. sas===
<script LANGUAGE=VBScript RUNAT=الخادم>
التطبيق الفرعي_OnStart
التطبيق (عبر الإنترنت) = 0
تعيين التطبيق (conn) = Server.CreateObject (ADODB.Connection)
application(db)=Server.MapPath( bs.mdb) 'من الأفضل استخدام المسار المطلق bs.mdb هنا، كما هو مفصل أدناه
نهاية الفرعية
subApplication_OnEnd
تعيين التطبيق (كون) = لا شيء
نهاية الفرعية
SubSession_OnStart
نهاية الفرعية
SubSession_OnEnd
إذا كانت session.contents(pass) ثم "حدد ما إذا كانت Session_OnEnd للمستخدم الذي قام بتسجيل الدخول
application(con).open =driver={Microsoft Access Driver (*.mdb)};dbq=&application(db)
application.lock
التطبيق (عبر الإنترنت) = التطبيق (عبر الإنترنت)-1
application(con).تنفيذ (تحديث مجموعة الأصدقاء عبر الإنترنت=0 حيث id=&session.contents(id))
application.unlock
التطبيق (يخدع) .إغلاق
نهاية إذا
نهاية الفرعية
</ نص>
=============
في هذه المرحلة، تم الانتهاء من التعليمات البرمجية الكاملة. نظرًا لأنه لا يمكن استخدام كائن الخادم في حدث OnEnd الخاص بالتطبيق والجلسة، فإن قاعدة البيانات
يتم تخزين العنوان الفعلي للاتصال وقاعدة البيانات على الخادم (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) إلى:
application(db)=Server.MapPath(bbs.mdb)
ثم قم بإنشاء دليل فرعي اختبار في الدليل d:inetpubwwwroot ثم اكتب temp.asp في دليل الاختبار.
====test.asp====
<%response.write application(db)%>
===============
ثم انسخ temp.asp وضعه في الدليل الجذر (d:inetpubwwwroot). افتح global.asa باستخدام المفكرة، ثم افتح متصفحين، المتصفح A
أدخل العنوان http://localhost/temp.asp واضغط على Enter وسيتم إخراج ما يلي على المتصفح:
د:inetpubwwwroot bs.mdb
بعد ذلك، انقر فوق القائمة "ملف" في نافذة "المفكرة" وحدد "حفظ" (لتغيير وقت تعديل global.asa، مما يؤدي إلى قيام IIS بإعادة تشغيل كافة الخدمات)، ثم انقر فوق
أدخل العنوان http://localhost/test/temp.asp في المتصفح B واضغط على Enter. الإخراج على المتصفح هو:
d:inetpubwwwrootestbs.mdb
على الرغم من وضع الملف global.asa في الدليل الجذر للموقع، إذا تم استخدام عنوان نسبي في server.mappath، فسيتم تشغيل Application_OnStart.
إذا كانت الصفحة التي زارها مستخدم الحدث لأول مرة لا تنتمي إلى الدليل الجذر، فلن يكون الحصول على العنوان الفعلي لقاعدة البيانات هو النتيجة المتوقعة، وآمل أن يكون الجميع حذرين بشكل خاص.