برنامه نویسی مبتنی بر رويداد در وب ( بخش اول )
اين مطلب از طريق سايت شرکت سخاروش در اختيار شما گذاشته شده است .

برنامه نويسی مبتنی بر رويداد در وب ( بخش اول )

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  ايجاد می شود، اين نمونه کاملا" خالی است . هرمرتبه که اقدام به ارسال صفحه ای می گردد ، عملا" يک نمونه جديد از شی Page ، ايجاد می گردد.علت اين موضوع به ماهيت stateless بودن پروتکل HTTP برمی گردد. ( حتی اگر عمليات ارسال صفحات بر روی سرويس دهنده به صورت پيوسته انجام شود ). پس از ايجاد يک ارتباط توسط مرورگر با سرويس دهنده به منظور درخواست يک صفحه خاص ، سرويس دهنده وب در ادامه ، صفحه موردنظر و يا يک پيام خاص  را برای متقاضی ، ارسال و در ادامه ارتباط ايجاد شده ، غيرفعال می گردد.
هر شی Page دارای ماهيتی کاملا" مستقل و متمايز نسبت به شی ايجاد شده در مرحله قبل بوده و هيچگونه اطلاعاتی نگهداری نمی گردد. با استفاده از برخی ويژگی های کنترل های سرويس دهنده ، امکان بخاطر سپردن اطلاعات مربوط به هر يک  از کنترل های موجود بر روی يک فرم وب ، فراهم می گردد .

مثال: استفاده از رويداد Page_Init به منظور اجرای کد دلخواه ( اجرای کد نوشته شده قبل از هر چيز ديگر ) :

<Script   Language="vb" runat="server">
   Sub Page_Init ( )
       
کد دلخواه
   End Sub
</Script>

مثال : استفاده از رويداد Page_Load به منظور اجرای کد دلخواه در يک برنامه پس از استقرار يک صفحه در حافظه :

<Script   Language="vb" runat="server">
   Sub Page_Load ( )
       
کد دلخواه
   End Sub
</Script>

مثال : فرض کنيد کد زير را داشته باشيم . کد فوق ، پس از ايجاد رويداد  Page_Load ( استقرار صفحه در حافظه ) اجراء و متن مورد نظر را در خروجی نمايش خواهد داد:

<Script   Language="vb" runat="server">
   Sub Page_Load ( )
        Message
1.text = "اين متن پس از استقرار صفحه در حافظه و ايجاد رويداد مربوطه،  نمايش داده می شود " 
   End Sub
</Script>
<html>
  <head>
  <title> تست رويدادها </title>
 </head>
<body>
  <asp:label  id="Message1" runat="server" />
</body>
</html>

در صورتی که کد فوق را در يک روتين ديگر و با نامی متفاوت ازPage_Load  مستقر نمائيم ، امکان اجرای اتوماتيک آن همزمان با استقرار صفحه در حافظه وجود نخواهد داشت. کد فوق، صرفا" زمانی امکان اجراء را پيدا خواهد کرد که رويدادی ديگر ايجاد و روتين مرتبط با آن صدا زده شود و يا امکان فراخوانی روتين نوشته شده از طريق کدهای نوشته شده ، فراهم گردد:

<Script   Language="vb" runat="server">
   Sub SubRoutine1 ( )
        Message
1.text = "اين متن پس از استقرار صفحه در حافظه و ايجاد رويداد مربوطه،  نمايش داده می شود " 
   End Sub
</Script>
  
...

کد فوق به دليل عدم ارتباط با يک رويداد و يا فراخوانی آن از طريق ساير کدهای موجود در برنامه ، اجراء نخواهد شد .

رويدادها در HTML
 در يک فرم HTML ، معمولا" از تگ <input> که به خصلت type آن مقدار submit ، نسبت داده شده است برای ايجاد يک دکمه Submit ، استفاده می گردد . در چنين مواردی پس از فعال نمودن دکمه Submit ، اطلاعات موجود در فرم وب برای سرويس دهنده ارسال می گردد . در صورتی که قصد ايجاد دکمه ای را داشته باشيم که پس از کليک نمودن بر روی آن ، اطلاعاتی برای سرويس دهنده ارسال نگردد ،  مجددا" از تگ <input> ، استفاده خواهيم کرد با اين تفاوت که اين مرتبه خصلت type آن ،  Button در نظر گرفته می شود .

مثال : ايجاد رويداد و پاسخ به آن در HTML

مرحله اول : تايپ کد زير با استفاده از يک ويرايشگر 

<html>
 <head>
<title> تست رويدادها در HTML</title>
</head>
<body>
<form>
   <input type="button" value="تست رويدادها " onclick = "alert ( ' ايجاد يک رويداد ') ">
</form>
</body>
</html>

مرحله دوم : پس از ذخيره نمودن کد فوق در فايلی با نام TestHTMLEvent.htm و مشاهده آن در مرورگر خروجی زير را خواهيم داشت :

توضيحات :
در مثال فوق ازرويداد onclick که يکی از رويدادهای از قبل ايجاد شده در HTML می باشد، استفاده شده است.رويدادهای فوق که به "رويدادهای ذاتی"، معروف می باشند را می توان بهمراه تمامی تگ های HTML ، استفاده نمود ( از تگ <body> تا تگ <img> ) . ليست زير ، ساير رويدادهای ذاتی در HTML را نشان می دهد :

در بخش دوم اين مقاله به بررسی  رويدادهای کنترل سرويس دهنده و کنترل Button در ASP.NET  خواهيم پرداخت .


استفاده از اين مطلب  با ذکر منبع و اهداف غيرانتفاعی بلامانع است .
http://www.srco.
ir