برنامه نویسی مبتنی بر رویداد در وب ( بخش اول )
ASP.NET ، با ارائه یک مدل برنامه نویسی مبتنی بر رویداد ، تحولات مهمی را در خصوص طراحی و پیاده سازی برنامه های وب ، ایجاد نموده است . برنامه نویسی مبتنی بر رویداد ایده جدیدی نبوده و تاکنون شاهد استفاده از آن در سیستم های متعددی بوده ایم. مثلا" بخش رابط کاربر( اینترفیس ) سیستم عامل ویندوز ، یک محیط مبتنی بر رویداد است که صرفا" پس از تحقق یک رویداد،عملیاتی انجام خواهد شد .پس از بروز یک رویداد و تشخیص آن، برنامه مربوطه فعال و مسئولیت پاسخگوئی به رویداد را برعهده خواهد گرفت . مثلا" زمانی که بر روی یک آیکون موجود بر روی Desktop کلیک نموده و یا منوی Start ، فعال می گردد ، یک رویداد ایجاد و برنامه مرتبط با آن فعال می گردد.ASP.NET با وضعیتی مشابه آنچه گفته شد با رویدادها برخورد می نماید .
در فرم های وب ASP.NET که مسئولیت ارائه بخش رابط کاربر برنامه های وب را برعهده دارند ، رویدادها دارای جایگاهی خاص بوده و به محض ایجاد یک رویداد ، کد مرتبط با آن اجراء می گردد.با استفاده از امکانات ارائه شده در HTML ، امکان اجرای حجم اندکی از کدهای نوشته شده سمت سرویس گیرنده نیز وجود خواهد داشت . ASP.NET با ارائه مفهوم جدیدی با نام Postback ، اطلاعاتی اضافه را به منظور انجام پردازش های لازم برای سرویس دهنده ارسال می نماید . بدین ترتیب، پس از ایجاد یک رویداد ، اطلاعات مورد نیاز به منظور پردازش رویداد مربوطه، برای سرویس دهنده ارسال می گردد. ویژگی فوق ،پتانسیل های متعددی را در اختیار برنامه نویسان وب ، قرار می دهد . مثلا" در مواردیکه کاربران اقدام به درج داده در یک TextBox نموده و یا یکی از اقلام اطلاعاتی موجود در یک لیست را انتخاب می نمایند ، امکان نگهداری و بخاطر سپردن اطلاعات موجود در یک فرم وب در زمان حرکت بین صفحات متعدد ، وجود خواهد داشت.مدل برنامه نویسی مبتنی بر رویداد ارائه شده در ASP.NET ، صرفا" محدود به این امکانات نبوده و می توان کدهای مورد نیاز را در توابع و یا برنامه های جانبی مستقر و در زمان بروز یک رویداد، آنان را اجراء نمود.
در ادمه مطلب...................
در این مقاله به بررسی موارد زیر خواهیم پرداخت :
رویداد چیست ؟ به منظور آشنائی با مفهوم یک رویداد در دنیای برنامه نویسی ، اجازه دهید با یک مثال در دنیای واقعی کار خود را آغاز نمائیم :
فرض کنید، کارمند بخش فروش یک شرکت به منظور دریافت اطلاعات از دو روش تلفن و نامه الکترونیکی ، استفاده می نماید.به صدا در آمدن زنگ تلفن نشاندهنده تحقق یک رویداد بوده که می بایست به آن پاسخ داده شود. کارمند مورد نظر ، بروز رویداد را تشخیص و با برداشتن گوشی تلفن و پس از آگاهی از نوع درخواست ، عکس العمل لازم را انجام می دهد.( آگاهی از درخواست متقاضی ، ثبت سفارش ، ارسال کالای مورد نیاز ) .
کارمند مورد نطر، می تواند از طریق Email نیز اخباری را نظیر سیاست های فروش از مدیر خود، دریافت نماید. مثلا" مدیر بخش مربوطه می تواند با ارسال یک Email به وی اعلام نماید که قیمت یک کالای خاص افزایش یافته است. پس از ایجاد رویداد فوق ، کارمند مورد نظر می تواند واکنش لازم به منظور برخورد با رویداد را با هر روشی که خود می داند ، انجام دهد . مثلا" می تواند با مشتری مورد نظر تماس گرفته و به وی بگوید : " متاسفیم ، شما می بایست یک مبلغ اضافه دیگر بابت خرید این کالا را پرداخت نمائید " و یا می تواند در پاسخ به مدیر خود بگوید : " ما هم اینک نیز بابت فروش این کالا پول زیادی را از مشتری گرفته و نیازی به افزایش قیمت کالا نمی باشد " . (نحوه برخورد با یک رویداد ، به نوع آن بستگی خواهد داشت ).
چرخه حیات یک رویداد را می توان به سه بخش زمانی خاص تقسیم نمود :
در سیستم عاملی نظیر ویندوز ، رویدادها با وضعیتی مشابه آنچه اشاره گردید ، ایجاد و سرویس لازم به آنان داده می شود:
مدل برنامه نویسی مبتنی بر رویداد چیست ؟ مدل برنامه نویسی مبتنی بر رویداد ، ماهیت برنامه نویسی را دستخوش تحولات فراوانی نموده است . در این مدل ، برنامه نویسان ازمدل قبلی که در آن تعدادی از صفحات به صورت ترتیبی بر روی یک سرویس دهنده اجراء می شدند، خارج و وارد دنیای جدیدی شده که در آن از یک مدل مبتنی بر رویداد ، استفاده می گردد . در مدل فوق ، سرویس دهنده به رویدادهائی که توسط کاربر و بر روی سرویس گیرنده ایجاد می گردند ، پاسخ خواهد داد .( ایجاد رویداد در یک کشور و پردازش رویداد در کشوری دیگر! )
قبل از مطرح شدن مدل برنامه نویسی مبتنی بر رویداد ، برنامه های نوشته شده ، خط به خط و به صورت ترتیبی از ابتدا تا انتها اجراء می شدند .به عبارت دیگر ، زبان های برنامه نویسی قدیمی، در ابتدا خط اول را اجراء نموده و به دنبال آن سراغ خط دوم و پردازش آن رفته و این روند را تا انتها ، ادامه می دهند . حتی در مواردیکه از تابع و یا برنامه های جانبی دریک برنامه استفاده می گردد، اولویت و نظم اجرای دستورات تغییر پیدا نمی نماید. زمانی که یک برنامه جانبی ، برنامه جانبی دیگری را صدا می نماید ، وی نیز می تواند برنامه دیگری را فعال نماید. (فرآیندی با ماهیتی ترتیبی ) .
مدل برنامه نویسی مبتنی بر رویداد ، ماهیت ترتیبی اجرای دستورات و یا برنامه های جانبی را تغییر داده است. مثلا" سیستم عامل ویندوز در یک مدل برنامه نویسی با ماهیت ترتیبی ، اجراء نخواهد شد . در صورتی که بر روی یک منو کلیک گردد ، انتظار داریم که بلافاصله یک منو ظاهر شده و درصورتی که بر روی یک آیکون Double click گردد ، انتظار داریم که بلافاصله برنامه مرتبط با آن اجراء گردد .
رویدادهای ASP.NET هر فرم وب در نهایت به یک شی Page تبدیل خواهد شد. فرم های وب را می توان نظیر یک برنامه اجرائی تصور نمود که خروجی آنان HTML است . هر مرتبه که صفحه ای صدازده می شود،حیات شی Page آغاز می گردد . شی فوق ، در مدت زمان حیات خود با مراحل متفاوتی نظیر مقداردهی اولیه ، پردازش و چیدمان اطلاعات ، مواجه می گردد. مراحل فوق با هر بار فراخوانی صفحه ، انجام شده و می توانند باعث تولید رویدادهائی خاص گردند ( هر round trip به سرویس دهنده باعث فعال شدن مراحل فوق ، خواهد شد ) . فراموش نکنیم که مشاهده یک فرم وب ، ماحصل رویدادهای متفاوتی است که بر روی سرویس دهنده تولید و به آنان پاسخ لازم داده شده است . مهمترین رویدادهای تولید شده در این رابطه عبارتند از :
Page_Init ، رویداد فوق زمانی محقق می شود که صفحه مقدار دهی اولیه می گردد. در این رابطه می توان از برنامه جانبی Sub Page_Init مرتبط با آن به منظور اجرای کد مورد نطر قبل از این که دات نت عملیات اتوماتیکی نظیر نمایش کنترل ها بر روی صفحه را انجام دهد ، استفاده بعمل آورد.
Page_Load : رویداد فوق زمانی که اولین مرتبه تمامی صفحه نمایش داده شود ، ایجاد می گردد.( زمانی که صفحه به درون حافظه خوانده شده و پردازش می گردد ) . برخی از خصلت های مربوط به کنترل های سرویس دهنده ممکن است توسط روتین Page_Init مقداردهی اولیه شده باشند.
رویدادهای کنترل های سرویس دهنده : پس از استقزار کنترل های سرویس دهنده ASP.NET در حافظه ، امکان پاسخگوئی به رویدادهائی نظیر : کلیک ، انتخاب یک آیتم موجود در یک لیست و یا checkbox و یا نسبت دهی یک منبع داده به یک کنترل سرویس دهنده ، فراهم می گردد.
Page_Unload: رویداد فوق پس از خارج شدن یک صفحه از حافظه ، محقق می گردد . از این رویداد به منظور انجام عملیات خاصی نظیرغیرفعال نمودن ارتباطات ایجاد شده با بانک اطلاعاتی و نظایر آن ، استفاده می گردد .
همانگونه که اشاره گردید ، زمانی که اولین مرتبه نمونه ای از یک شی Page ایجاد می شود، این نمونه کاملا" خالی است . هرمرتبه که اقدام به ارسال صفحه ای می گردد ، عملا" یک نمونه جدید از شی Page ، ایجاد می گردد.علت این موضوع به ماهیت stateless بودن پروتکل HTTP برمی گردد. ( حتی اگر عملیات ارسال صفحات بر روی سرویس دهنده به صورت پیوسته انجام شود ). پس از ایجاد یک ارتباط توسط مرورگر با سرویس دهنده به منظور درخواست یک صفحه خاص ، سرویس دهنده وب در ادامه ، صفحه موردنظر و یا یک پیام خاص را برای متقاضی ، ارسال و در ادامه ارتباط ایجاد شده ، غیرفعال می گردد.
هر شی Page دارای ماهیتی کاملا" مستقل و متمایز نسبت به شی ایجاد شده در مرحله قبل بوده و هیچگونه اطلاعاتی نگهداری نمی گردد. با استفاده از برخی ویژگی های کنترل های سرویس دهنده ، امکان بخاطر سپردن اطلاعات مربوط به هر یک از کنترل های موجود بر روی یک فرم وب ، فراهم می گردد .
مثال: استفاده از رویداد Page_Init به منظور اجرای کد دلخواه ( اجرای کد نوشته شده قبل از هر چیز دیگر ) :
<Script Language="vb" runat="server"> |
مثال : استفاده از رویداد Page_Load به منظور اجرای کد دلخواه در یک برنامه پس از استقرار یک صفحه در حافظه :
<Script Language="vb" runat="server"> |
مثال : فرض کنید کد زیر را داشته باشیم . کد فوق ، پس از ایجاد رویداد Page_Load ( استقرار صفحه در حافظه ) اجراء و متن مورد نظر را در خروجی نمایش خواهد داد:
<Script Language="vb" runat="server"> |
در صورتی که کد فوق را در یک روتین دیگر و با نامی متفاوت ازPage_Load مستقر نمائیم ، امکان اجرای اتوماتیک آن همزمان با استقرار صفحه در حافظه وجود نخواهد داشت. کد فوق، صرفا" زمانی امکان اجراء را پیدا خواهد کرد که رویدادی دیگر ایجاد و روتین مرتبط با آن صدا زده شود و یا امکان فراخوانی روتین نوشته شده از طریق کدهای نوشته شده ، فراهم گردد:
<Script Language="vb" runat="server"> |
کد فوق به دلیل عدم ارتباط با یک رویداد و یا فراخوانی آن از طریق سایر کدهای موجود در برنامه ، اجراء نخواهد شد .
رویدادها در HTML در یک فرم HTML ، معمولا" از تگ <input> که به خصلت type آن مقدار submit ، نسبت داده شده است برای ایجاد یک دکمه Submit ، استفاده می گردد . در چنین مواردی پس از فعال نمودن دکمه Submit ، اطلاعات موجود در فرم وب برای سرویس دهنده ارسال می گردد . در صورتی که قصد ایجاد دکمه ای را داشته باشیم که پس از کلیک نمودن بر روی آن ، اطلاعاتی برای سرویس دهنده ارسال نگردد ، مجددا" از تگ <input> ، استفاده خواهیم کرد با این تفاوت که این مرتبه خصلت type آن ، Button در نظر گرفته می شود .
مثال : ایجاد رویداد و پاسخ به آن در HTML
مرحله اول : تایپ کد زیر با استفاده از یک ویرایشگر
<html> |
مرحله دوم : پس از ذخیره نمودن کد فوق در فایلی با نام TestHTMLEvent.htm و مشاهده آن در مرورگر خروجی زیر را خواهیم داشت :
وضیحات :
در مثال فوق ازرویداد onclick که یکی از رویدادهای از قبل ایجاد شده در HTML می باشد، استفاده شده است.رویدادهای فوق که به "رویدادهای ذاتی"، معروف می باشند را می توان بهمراه تمامی تگ های HTML ، استفاده نمود ( از تگ <body> تا تگ <img> ) . لیست زیر ، سایر رویدادهای ذاتی در HTML را نشان می دهد :