محاضرة ASP 3: كائن التطبيق وكائن الجلسة
الكاتب:Eve Cole
وقت التحديث:2009-05-30 19:58:17
في المحاضرة السابقة، تعلمنا عن جمع بيانات النموذج وجمع بيانات QueryString وجمع بيانات ServerVariables لكائن الطلب. قبل الاستمرار في الدراسة التالية، يوصى بالاسترخاء أولاً، لأن كائن التطبيق الذي سيتم تقديمه بعد ذلك هو كائن تجريدي نسبيًا، وقد لا تتمكن من تمييز الأشياء عندما تفهمه لأول مرة. تذكر: عندما لا تتمكن من العثور عليه، ألا تفكر كثيرًا في ماهية كائن التطبيق؟ كما يقول المثل القديم، تعلم كيفية استخدامه أولا.
1. فهم كائن التطبيق. لتحديث عقلك، دعونا نلقي نظرة على روتين مضاد (يجب عليك تشغيله لفهمه):
قم أولاً بتحرير ملف wuf16.htm:
<أتش تي أم أل>
<الجسم>
مثال لتسجيل عدد النقرات على الصفحة: <a href="wuf17.asp">wuf17.asp</a>
</الجسم>
</html>
رمز wuf17.asp هو كما يلي:
<% @LANGUAGE = VBScript %>
<% 'wuf17.asp - تسجيل عدد الزيارات لصفحة معينة (مبدأ مضاد)
الخيار صريح
خافت الكونتويب
CountWeb = Request.ServerVariables("SCRIPT_NAME")
'وهذا يضمن أن كل صفحة تحتوي على متغير فريد لتجنب الارتباك
%>
<HTML><الجسم>
<%
Response.Write CountWeb & "<Br><Br>" & vbcrlf
Application.Lock 'يرجى قراءة الشرح
التطبيق(CountWeb) = التطبيق(CountWeb) + 1 'التراكم، أضف 1 إلى عدد النقرات
التطبيق.فتح
Response.Write "إجمالي عدد النقرات على هذه الصفحة قبل إيقاف تشغيل خادم الويب وإعادة تشغيله هو:" & Application(CountWeb)
%>
</BODY></HTML>
عند تشغيل هذا البرنامج، بالنسبة لمعظم الأشخاص، يوجد جهاز واحد فقط، وهو خادم الويب والعميل معًا. ثم لا يمكنك إلا أن تتخيل موقفًا مثل هذا: يتم وضع ملفي صفحتك الرئيسية على خادم ويب بعيد، ويقوم عدد كبير من المستخدمين المحليين والأجانب بالوصول إليهما من خلال المتصفحات. بمجرد نقر كل مستخدم، ستتم زيادة قيمة Application(CountWeb) بمقدار 1، وطالما أن الخادم الذي يقوم بتخزين الملف wuf17.asp ليس مغلقًا، فسيستمر Application(CountWeb) في التراكم. لكن لاحظ أنه إذا تم إغلاق الخادم ثم إعادة تشغيله، سيبدأ التطبيق (CountWeb) في العد من 0 مرة أخرى (أنا في حيرة من أمري، قلت لماذا يكون عدد زيارات صفحتي دائمًا رقمًا واحدًا). لتجنب هذا النوع من حالات العد التي تبدأ دائمًا من الصفر، يجب عليك حفظ قيمة التطبيق (CountWeb) قبل إيقاف تشغيل الخادم، وإخراجها عند الحاجة في المرة القادمة، بحيث يمكن تجميعها بشكل تسلسلي للقيام بذلك، يرجى الاستماع إلى التحلل بعد N مرات.
السؤال التالي هو ماذا يعني Application.Lock وUnLock؟ لقد افترضنا للتو أن عددًا كبيرًا من المستخدمين يزورون الصفحة، وأن كل نقرة يقوم بها المستخدم ستؤدي إلى زيادة التطبيق (CountWeb) بمقدار 1. فكر في الأمر، ألن يكون هذا فوضى (ماذا! يمكنني ذلك؟) لا تفكر في الأمر، يجب أن تكون أنت (أنت الوحيد الذي يرعى الصفحة الرئيسية)، لذلك يجب أن تكون هناك قاعدة لمن يأتي أولاً يخدم أولاً. عندما يزور المستخدم الصفحة ويحتاج إلى تعديل قيمة التطبيق (CountWeb)، استخدم طريقة القفل لقفلها لمنع المستخدمين الآخرين من تعديلها، ثم قم بإلغاء قفلها.
هل رأيت من المثال أعلاه أن كائن التطبيق يوفر معلومات مشتركة (Application(CountWeb)) لجميع المستخدمين، وهو موجه لجميع المستخدمين (سيؤدي وصول كل مستخدم إلى زيادة العداد بمقدار 1). يحتوي كائن التطبيق أيضًا على حدثين، الحدث Application_OnStart والحدث Application_OnEnd (لا تخلط بين هذا، فهذا مجرد مفهوم أولي في لغات البرمجة الموجهة للكائنات)، ويكون بناء الجملة كما يلي:
<لغة البرنامج النصي=VBScript RUNAT=الخادم>
SubApplication_OnEnd
'عند إغلاق خادم الويب، سيتم تنشيط حدث Application_OnEnd
"أي أن البرنامج سيقوم بتنفيذ التعليمات البرمجية الموضوعة هنا."
'لذلك قبل إيقاف تشغيل الخادم، يمكننا تغيير قيمة التطبيق (CountWeb) في wuf17.asp هنا
'احفظه، كما هو الحال في ملف نصي.
نهاية الفرعية
التطبيق الفرعي_OnStart
'عندما يستعرض المستخدم الأول صفحة ويب ASP، سيتم تنشيط حدث Application_OnStart، ولكن عندما يتصفح مستخدمون آخرون في المستقبل، لن يحدث هذا الحدث.
"أي أن البرنامج سيقوم بتنفيذ التعليمات البرمجية الموضوعة هنا."
'لذا يمكن قراءة قيمة التطبيق (CountWeb) المحفوظة في الملف النصي هنا.
نهاية الفرعية
</النص>
وفيما يلي مثال لتوضيح كيفية استخدام الأحداث. وظيفة هذا البرنامج هي حساب إجمالي عدد النقرات على جميع صفحات الموقع.
كود الملف wuf18.asp (ملفات الصفحات الأخرى في الموقع تشبه هذا الملف):
<% @LANGUAGE = VBScript %>
<% خيار صريح
'جميع ملفات الصفحات في الموقع يجب أن تتضمن هذه الجملة <!--#include file="wuf19.asp"-->%>
<!--#include file="wuf19.asp"-->
<HTML><الجسم>
إجمالي عدد الزيارات على كافة صفحات الموقع قبل إيقاف تشغيل الخادم وإعادة تشغيله: <%= Application("CountAll") %>
</BODY></HTML>
كود الملف wuf19.asp:
<%' wuf19.asp
التطبيق.القفل
التطبيق("CountAll") = التطبيق("CountAll") + 1
التطبيق.فتح
%>
يتم وضع الملفات wuf18.asp وwuf19.asp في نفس الدليل. كود الملف global.asa:
ملاحظة: يجب حفظ معالج الحدث كملف نصي باسم "global.asa" ويجب وضعه في الدليل الجذر للمسار الظاهري (عادةً في نفس الدليل مثل ملف Index.htm أو default.htm، على سبيل المثال: خذ جهازي كمثال. فيما يتعلق بالمسارات المطلقة، يتم وضع global.asa ضمن c:InetPubhome، بينما يتم وضع wuf18.asp وwuf19.asp ضمن c:InetPubhomeasp). المسار فقط يُسمح بوجود ملف global.asa.
<لغة البرنامج النصي=VBScript RUNAT=الخادم>
'global.asa - wuf18.asp اسم الملف الموجود في حزمة التنزيل هو 18global.asa، والذي يجب إعادة تسميته عند استخدامه.
التطبيق الفرعي_OnStart
'عندما يتصفح المستخدم الأول صفحة الويب، اضبط القيمة الأولية للعداد على 0.
'عندما يقوم مستخدمون آخرون بالتصفح في المستقبل، لن يتم تنفيذ التعليمات البرمجية التالية بعد الآن.
التطبيق.القفل
التطبيق ("CountAll") = 0
التطبيق.فتح
نهاية الفرعية
</النص>
تصفح wuf18.asp لعرض نتائج التشغيل. يبدو أنه ليس من الصعب تعلم كيفية استخدام كائن التطبيق.
2. فهم كائن الجلسة. باستخدام كائن التطبيق السابق كإنذار، يصبح كائن الجلسة أسهل بكثير. إنه مشابه لكائن التطبيق، إلا أنه يستخدم فقط لتسجيل المعلومات المتعلقة بمستخدم واحد، وهو موجه لمستخدم واحد، لذا يمكننا استخدام كائن الجلسة لتخزين معلومات حول مستخدم واحد.
مثل كائن التطبيق، يحتوي كائن الجلسة أيضًا على حدثين: حدث Session_OnStart وحدث Session_OnEnd. يشبه بناء جملة الاستخدام كائن التطبيق.
ومن الجدير بالذكر أنه قبل استخدام كائن الجلسة، يجب عليك التأكد من تمكين وظيفة ملفات تعريف الارتباط في المتصفح (الإعداد الافتراضي جيد).
فيما يلي مثال على ذلك، متطلبات الملف global.asa هي نفسها المذكورة أعلاه، لذلك سيتم استبدال global.asa في المثال أعلاه بـ global.asa في هذا المثال.
<لغة البرنامج النصي=VBScript RUNAT=الخادم>
' global.asa - wuf20.asp اسم الملف الموجود في حزمة التنزيل هو 20global.asa
SubSession_OnStart
Session("In") = الآن 'الوظيفة الآن تحصل على الوقت الحالي
نهاية الفرعية
SubSession_OnEnd
جلسة ("خارج") = الآن
التطبيق.القفل
التطبيق ("خارج") = الجلسة ("خارج")
التطبيق ("في") = الجلسة ("في")
التطبيق ("خارج").فتح
نهاية الفرعية
</النص>
ملف wuf20.asp:
<%@ اللغة=VBScript %>
<أتش تي أم أل>
<الجسم>
<% 'wuf20.asp
الاستجابة.اكتب "إعدادات المهلة الافتراضية:" و"مهلة الجلسة" و"الدقائق<Br>"
مهلة الجلسة = 1
Response.اكتب "الوقت الذي دخلت فيه هذا الموقع:" & Session("In") & "<Br>"
Response.اكتب "الرجاء تحديث هذه الصفحة خلال دقيقة واحدة" و"<Br><Br>"
إذا لم يكن فارغًا (التطبيق ("خارج")) إذن
Response.اكتب "آخر مرة دخلت فيها هذا الموقع:" & Application("In") & "<Br>"
Response.اكتب "آخر مرة غادرت فيها هذا الموقع:" & Application("Out") & "<Br>"
الاستجابة.اكتب "وقت التصفح (بالدقائق):" &_
Datediff("n"،Application("In")،Application("Out")) & "<Br><Br>"
نهاية إذا
إذا IsEmpty(Session("Out")) إذن
Response.اكتب "قيمة الجلسة(""خارج"") قبل التحديث وبعد التحديث فارغة" و"<Br>"
نهاية إذا
%>
</الجسم>
</HTML>
عندما يتصفح المستخدم صفحة الويب لأول مرة، يحدث حدث Session_OnStart، ويسجل البرنامج الوقت الذي يدخل فيه المستخدم إلى صفحة الويب، ومع ذلك، لا يحدث حدث Session_OnEnd في هذا الوقت، لذا فإن التطبيق ("Out") القيمة فارغة ولا يعرض البرنامج وقت التصفح.
نحن نعلم أن عمر كائن التطبيق يبدأ من أول مستخدم يتصفح صفحة الويب حتى يتم إيقاف تشغيل الخادم. عمر كائن الجلسة هو من المرة الأولى التي يتصفح فيها المستخدم صفحة الويب (بداية الجلسة) حتى نهاية الجلسة. إذن متى تنتهي الجلسة؟ على وجه التحديد في هذا المثال، Session.Timeout = 1 يضبط مهلة الجلسة على دقيقة واحدة، أي إذا لم يتم تقديم طلب إلى خادم الويب لمدة دقيقة واحدة، فستنتهي مهلة الجلسة، مما يتسبب في انتهاء الجلسة، ويحدث حدث Session_OnEnd، ويقوم البرنامج بتنفيذ التعليمات البرمجية في Session_OnEnd. نضع هنا أوقات الدخول والخروج في التطبيق ("In") والتطبيق ("Out") على التوالي، لأنه بعد انتهاء الجلسة، لن يعد كائن الجلسة موجودًا، وقد تحققنا من ذلك في نهاية الكود.
ومن هذا الروتين يمكننا أن نرى:
1. كائنات التطبيق وكائنات الجلسة لها عمر مختلف.
2. كائن الجلسة مخصص لمستخدم واحد، ويتم تخزين قيمته على العميل، وليس للتصفح من قبل المستخدمين الآخرين أي تأثير على كائن الجلسة للمستخدم الواحد. يمكن لمستخدم واحد فقط قراءة وكتابة قيمة كائن الجلسة الخاص به (على سبيل المثال: Session("In")).
3. لاحظ تمثيل علامات الاقتباس المزدوجة في Response.Write: (""Out"").
4. تذكير خاص: هذا البرنامج ليس له أي تطبيق عملي وهو مخصص لتصحيح الأخطاء فقط (مناسب للتصفح من قبل مستخدم واحد فقط). يرجى التفكير في سبب ذلك؟ الجواب في نهاية هذا المقال.
نصيحة: يرجى الانتباه إلى خصائص كائن التطبيق.
3. مثال كلاسيكي: كيفية عرض عدد الأشخاص المتصلين على صفحة ويب في المثال التالي، يتم استخدام التطبيق ("متصل") لتخزين عدد الأشخاص المتصلين، ويتم استخدام التطبيق ("CountAll") لتخزين عدد الأشخاص المتصلين بالإنترنت. تخزين العدد الإجمالي للزوار.
المبدأ: عندما يتصفح مستخدم جديد صفحة الويب، يقع حدث Session_OnStart، ويزداد عدد المستخدمين عبر الإنترنت بمقدار 1، كما يزيد عدد المستخدمين الزائرين أيضًا بمقدار 1. عندما يغادر المستخدم، يقع حدث Session_OnEnd بعد انتهاء مهلة الجلسة، ويتم تقليل عدد الأشخاص المتصلين بمقدار 1.
رمز Global.asa هو كما يلي:
<لغة البرنامج النصي=VBScript RUNAT=الخادم>
'Global.asa-wuf21.asp
التطبيق الفرعي_OnStart
التطبيق.القفل
'اقرأ القيمة الأولية للتطبيق ("CountAll") هنا
التطبيق.فتح
نهاية الفرعية
SubSession_OnStart
التطبيق.القفل
التطبيق ("أون لاين") = التطبيق ("أون لاين") + 1
التطبيق("CountAll") = التطبيق("CountAll") + 1
التطبيق.فتح
نهاية الفرعية
SubSession_OnEnd
التطبيق.القفل
التطبيق ("أون لاين") = التطبيق ("أون لاين") - 1
التطبيق.فتح
نهاية الفرعية
SubApplication_OnEnd
التطبيق.القفل
يجب حفظ التطبيق ("CountAll") في الملف هنا
التطبيق.فتح
نهاية الفرعية
</النص>
كود Wuf21.asp هو كما يلي:
<%@ اللغة=VBScript %>
<أتش تي أم أل>
<الجسم>
<%Session.Timeout = 5%>
<P>عدد الأشخاص المتصلين بالإنترنت: <%= Application("Online")%></P>
<P>إجمالي عدد الزوار: <%= Application("CountAll")%></P>
</الجسم>
</HTML>
يرجى ملاحظة أنه تتم مقارنة هذا الروتين مع wuf17.asp، حيث يحسب الأخير عدد النقرات، بينما يحسب الأول عدد الزوار.
الإجابة: بما أن كائن التطبيق ينطبق على جميع المستخدمين، في حالة تعدد المستخدمين، فإن تصفح المستخدمين الآخرين سيغير أيضًا قيم التطبيق ("الداخل") والتطبيق ("الخارج").