رويدادها در برنامه های وب دات نت

يک برنامه در مدت زمان حيات خود با رويدادهای متعددی مواجه می گردد. پس از بروز رويداد ، روتين پاسخگو مسئوليت برخورد با رويداد محقق شده را برعهده خواهد گرفت . برنامه های وب نيز از اين قاعده مستثنی نبوده و در مدت زمان حيات خود با رويدادهای متعددی مواجه می گردند . رويدادها و نحوه برخورد با آنان دربرنامه های وب ، دارای تفاوت هائی نسبت به برنامه های ويندوز است . رويدادها در برنامه های وب در سه سطح : برنامه ، صفحات و کنترل های سرويس دهنده ، محقق می گردند. ترتيب و نحوه اجرای رويدادها ، تاثيری مستقيم بر نحوه پاسخگوئی به آنان توسط کدهای نوشته شده در يک برنامه دارد. در اين مقاله قصد داريم به بررسی جايگاه و نقش رويدادها در چرخه حيات يک برنامه وب پرداخته و از اين رهگذر با تفاوت های موجود بين چرخه حيات يک برنامه وب و يک برنامه ويندوز بيشتر آشنا شويم .

رويداد ها در چرخه حيات يک برنامه وب

حيات يک برنامه وب ، وابسته و متاثر از Session های فعال می باشد . ماداميکه Session فعال وجود داشته باشد ، برنامه وب نيز به زندگی خود ادامه خواهد داد . فرم های وب ، دارای عمر بسيار اندک و ناچيزی می باشند. يک برنامه وب با درخواست صفحه شروع آن توسط مرورگر ، زندگی خود را آغاز می نمايد . در ادامه ، سرويس دهنده وب وارد عمليات شده و يک فايل اجرائی ( فايلی با پسوند DLL ) را اجراء می نمايد . هدف نهائی فايل فوق ، پاسخگوئی به درخواست ارسالی توسط مرورگر است . برنامه فوق ، در ادامه يک نمونه از فرم وب درخواست شده را ايجاد و HTML لازم بمنظور پاسخ دادن به درخواست را توليد و در نهايت پاسخ مربوطه را برای مرورگر ارسال می نمايد . پس از اتمام فرآيند فوق ، نمونه فرم ايجاد شده نيز از بين خواهد رفت .
زمانيکه مرورگر دارای تگ های HTML توليده شده می باشد ، کاربر قادر به ورود اطلاعات و داده مورد نظر در Text boxs ، انتخاب دکمه ها و انجام ساير عمليات می باشد . وضعيت فوق ، تا زمانيکه يک رويداد Post-back محقق گردد ( نظير کليک نمودن بر روی يک دکمه ) ، ادامه می يابد . پس از محقق شدن رويداد Post-back ، مرورگر داده همراه صفحه ( View State ) را برای سرويس دهنده ارسال تا پردازش های لازم با توجه به رويداد محقق شده ، انجام شود. زمانيکه سرويس دهنده ، View State ( داده همراه با يک صفحه ) را دريافت می نمايد ، يک نمونه جديد از فرم وب را ايجاد و داده آن را با استفاده از View State تکميل و متناسب با رويداد محقق شده ، پردازش های لازم را انجام خواهد داد . پس از اتمام عمليات توسط سرويس دهنده ، نتايج بصورت تگ های HTML مجددا" برای مرورگر ارسال و نمونه فرم وب ايجاد شده ، از بين خواهد رفت .
زمانيکه کاربر به عمليات خود خاتمه داده و مرورگر را غير فعال می نمايد ، Session مربوط به آن نيز خاتمه می يابد . درصورتيکه Session های متعلق به ساير کاربران وجود نداشته باشد ، به حيات برنامه نيز خاتمه داده می شود ( عملا" وضعيت فوق کمتر اتفاق می افتد ) . ASP.NET با استفاده از garbage collection ، مديريت حافظه را انجام می دهد ( سرويس ارائه شده توسط CLR فريمورک دات نت ) . در فرآيند فوق ، سرويس دهنده بصورت ادواری رديابی مراجعات به اشياء را انجام و در صورتيکه از يک شی مدت زمان زيادی استفاده نشده باشد ، شی مربوطه از حافظه حذف و فضای استفاده شده توسط آن نيز آزاد می گردد . با توجه به ماهيت عمليات فوق ، نمی توان بطور دقيق از زمان محقق شدن رويداد Application_End ، آگاهی يافت .

نگهداری داده در يک فرم وب

با توجه به اينکه فرم های وب دارای عمر بسيار کوتاهی می باشند ، ASP.NET عمليات خاصی را بمنظور نگهداشت داده درج شده در کنترل های موجود بر روی يک فرم وب، انجام می دهد. داده های درج شده در کنترل ها ، پس از هر درخواست ارسال شده و از طريق Page_init مجددا" در کنترل های مربوطه، بازيابی ( Restore) می گردند. داده موجود در اين نوع کنترل ها در ادامه و از طريق رويداد Page_Load در دسترس قرار خواهند گرفت . داده ئی را که ASP.NET بين هر يک از درخواست ها ، نگهداری می نمايد ، view state فرم وب ناميده شده و صرفا" در محدوده همان فرم وب ، قابل دستيابی و استفاده است. بمنظور استفاده از داده ورودی در يک فرم وب برای ساير فرم های وب ، نيازمند ذخيره سازی داده در يک متغير وضعيت از نوع اشياء Application و يا Session می باشيم . اشياء فوق ، دو سطح متفاوت از بعد دستيابی را ارائه می نمايند :
• متغيرهای Application state . متغيرهای فوق ، برای تمامی کاربران قابل دسترس و استفاده می باشند. رفتار اين نوع متغيرها نظير متغيرهای سراسری با قابليت دستيابی چندکاربره می باشد. تمامی Sessions قادر به خواندن و نوشتن اين نوع متغيرها ، می باشند .
• متغيرهای Session state . متغيرهای فوق، صرفا" برای يک Session ( کاربر) قابل دسترس و استفاده می باشند. عملکرد اين نوع از متغيرها نظير داده های سراسری در يک برنامه استاندارد ويندوز می باشد . صرفا" Session فعال ، قابليت دستيابی به وضعيت Session خود را دارا خواهد بود .
متغيرهای Session و Application ، بصورت On the fly و از طريق کد نوشته شده در برنامه ، ايجاد می گردند ( عدم استفاده از روش های متداول بمنظور تعريف يک متغير ). در نمونه برنامه زير ، يک متغير Session با نام Clicks تعريف شده است . متغير فوق ، تعداد دفعاتی که بر روی دکمه Button1 کليک می گردد را در خود ذخيره و در نهايت مقدار مورد نظر در خروجی نمايش داده می شود .

VB.NET

Private Sub Button1_Click ( ByVal sender As System.Object , _
                    ByVal e As System.EventArgs ) Handles Button1.Click
     Session ( "Clicks") = Session ( "Clicks") + 1
     Response.Write("Number of Clicks : " & Session( "Clicks")
End Sub


در يک متغير وضعيت ( Session , Application) می توان هر نوع داده ئی را ذخيره نمود. ( از يک عدد صحيح ساده تا يک شی ) . با توجه به اينکه عملکرد متغيرهای وضعيت ، نظير داده های سراسری می باشد ، می بايست ،استراتژی لازم بمنظور استفاده و انجام عمليات بر روی آنان ،مشخص گردد .

رويدادهای Session و Application

برنامه نويسان می توانند کد دلخواه خود را بمنظور پاسخگوئی به رويدادهای Session و يا Application نوشته و آنان را در فايل Global.asax مستقر نمايند . از رويدادهای Application بمنظور مقداردهی اشياء و داده ئی که قصد استفاده از آن توسط تمامی Session های فعال در برنامه وب وجود داشته باشد ، استفاده می گردد . از رويدادهای Session بمنظور مقداردهی اوليه داده ئی که قصد نگهداشت آن بين Session های خاصی وجود دارد، استفاده می گردد . ( قصد استفاده از اين نوع متغيرها بين Session های متفاوت وجودندارد ) .
رويدادهای Application ، بشرح زير می باشند :
• Application_Start : رويداد فوق ، بلافاصله پس از ملاقات صفحه شروع برنامه توسط اولين کاربر ، محقق می گردد .
• Application_End ، رويداد فوق ،زمانی محقق می گردد که کاربری به برنامه متصل ( مرتبط) نباشد.
• Application_BeginRequest : رويداد فوق ، در ابتدای هر در خواست ارسالی برای سرويس دهنده ، محقق می گردد . با حرکت بين صفحات و درخواست آنان از سرويس دهنده ، يک درخواست ايجاد و متناسب با آن ، رويداد فوق نيز محقق می گردد .
• Applicatino_EndRequest : رويداد فوق ، پس از اتمام هر درخواست ارسال شده برای سرويس دهنده ، محقق می گردد .
• Session_Start : رويداد فوق ، زمانيکه کاربری جديد ، صفحه شروع يک برنامه را ملاقات می نمايد ، محقق می گردد .
• Session_End : رويداد فوق ، پس از ترک برنامه توسط يک کاربر ، محقق می گردد( بستن مرورگر و يا پس از Time out تعريف شده )
در فرم های وب ، يک Session ، نمونه ای منحصربفرد از مرورگر می باشد .يک کاربر می تواند دارای چندين نسخه در حال اجراء از برنامه مرورگر بر روی ماشين خود باشد .در چنين وضعيتی ، در صورتيکه هر يک از مرورگرها با برنامه وب ارتباط برقرار نمايد ، هريک از آنان دارای Session منحصربفرد مربوط به خود خواهند بود .
بمنظور آشنائی با عملکرد رويدادهای فوق ، کد نوشته شده زير را در فايل Global.asax مربوط به يک پروژه فرم وب ، مستفر نمائيد .

 

VB.NET

Sub Application_Start ( ByVal Sender As  Object , ByVal E As EventArgs )
        Application ( "AppCount") = Application ( "AppCount") + 1
End Sub
Sub Session_Start ( ByVal Sender As  Object , ByVal E As EventArgs )
        Application ( "SessCount" ) =  Application ( "SessCount" ) + 1
        Response.Write( "Number of  AppCount : " & Application  ("AppCount")   & "<br>" )
        Response.Write( "Number of  SessCount : " & Application ( "SessCount" ) & "<br>" )
End Sub
Sub Session_End ( ByVal Sender As  Object , ByVal E As EventArgs )
        Application ( "SessCount" ) =  Application ( "SessCount" ) - 1
End Sub


پس از اجرای کد فوق ، هر نمونه از مرورگر که به برنامه متصل گردد ،يک واحد به Session ، اضافه می گردد ( مقدار شمارنده Application همچنان يک باقی خواهد ماند ) . لازم است به اين نکته نيز اشاره گردد که اشياء ذاتی نظير Session و Response در Application_Start قابل دسترس نمی باشند .

رويدادهای فرم های وب

با استفاده از رويدادهای فرم های وب می توان پردازش و پشتيبانی از داده استفاده شده در يک صفحه وب ، پاسخگوئی به نسبت دهی داده (ِData binding ) و برخورد با موارد استثناء ( Handle exceptions ) را در يک صفحه وب ، انجام داد. Page_Load و Page_Error از جمله رويدادهائی می باشند که از آنان در اغلب برنامه ها ، استفاده می گردد . رويدادهای مرتبط با فرم های وب ( بترتيب محقق شدن )، بشرح زير می باشند .
• Page_Init : رويداد فوق ، زمانی محقق می گردد که کنترل های سرويس دهنده ، در حافظه مستقر و از طريق view state مربوط به فرم وب ، مقداردهی اوليه گردند. (اولين مرحله در چرخه حيات يک فرم وب ).
• Page_Load : رويداد فوق ، زمانی محقق می گردد که کنترل ها ی سرويس دهنده در شی Page ، لود می گردند. اطلاعات view state ، در اين لحظه قابل دسترس و استفاده بوده و می توان در اين محل تنظيمات کنترلی لازم بمنظور نمايش متن بر روی صفحه را انجام داد ( انجام تغييرات مورد نظر).
• Page_PreRender : رويداد فوق ، زمانی محقق می گردد که برنامه درصدد Render نمودن شی Page می باشد .
• Page_Unload : رويداد فوق ، پس از خروج Page از حافظه ، محقق می گردد.
• Page_Error : رويداد فوق ، پس از مواجه شدن با يک مورد خاص و استثنائی ،محقق می گردد .
• Page_AbortTransaction : رويداد فوق ، پس از توقف يک تراکنش ، محقق می گردد.
• Page_CommitTransaction : رويداد فوق ، پس از پذيرش يک تراکنش ، محقق می گردد.
• Page_DataBinding : رويداد فوق ، پس از نسبت دهی يک کنترل سرويس دهنده به يک منبع داده بر روی يک صفحه ، محقق می گردد.
• Page_Dispose : رويداد فوق ،پس از آزاد سازی يک شی Page از حافظه ، محقق می گردد (آخرين رويداد مرتبط با چرخه حيات يک شی Page ) .
از رويداد Page_Load بهمراه خصلت IsPostBack ، می توان بمنظور مقداردهی اوليه داده ، در اولين مرتبه ای که کاربران يک فرم وب را مشاهده می نمايند ، استفاده نمود.

رويدادهای کنترل سرويس دهنده

هر يک از کنترل های سرويس دهنده ، نظير دکمه ها ، TextBox و DropDownList ، دارای مجموعه ای اختصاصی از رويدادهای مرتبط با خود بمنظور پاسخگوئی به عمليات کاربران می باشند . تمامی رويدادهای کنترل سرويس دهنده بطور يکسان ايجاد نمی گردند . سه نوع عمده از رويدادهای کنترل سرويس دهنده وجود دارد :
• رويدادهای Post-Back : رويدادها ی فوق ، باعث ارسال صفحه وب برای سرويس دهنده بمنظور انجام پردازش های ضروری می گردند. اين نوع از رويدادها ، ترافيکی را بين سرويس گيرنده و سرويس دهنده ، ايجاد می نمايند ( توجه به اثرات ترافيک ايجاد شده بر کارآئی برنامه ) .
• رويدادهای Cached : اين نوع از رويدادها ، در View state مربوط به صفحه ذخيره تا زمانيکه يک رويداد Post_Back محقق گردد .
• رويدادهای Validation : رويدادهای فوق ، بدون اينکه ضرورتی به انجام Post-Back و يا Cache وجود داشته باشد ، از طريق امکانات پيش بينی شده درون صفحه ، با آنان برخورد خواهد شد .کنترل های سرويس دهنده Validation از رويدادهای فوق ،استفاده می نمايند .
کنترل های Validation ، قبل از اينکه صفحه برای سرويس دهنده Post-Back شوند، بررسی می گردند . زمانيکه Post-Back محقق می گردد ، رويدادهای Page_init و Page_Load ، پردازش و در ادامه رويدادهای Cache و نهايتا" رويدادی که باعث Post-Back شده است ، پردازش می گردد . کنترل های Button ، Link Button ,Image Button ، از جمله کنترل هائی می باشند که باعث تحقق يک رويداد Post-Back ، می گردند . کنترل های . TextBox,DropDownList,ListBox,RadioButton و CheckBox ، باعث ايجاد رويدادهائی از نوع Cache خواهند شد .
فرض کنيد ، يک فرم وب بهمراه چهار TextBox و يک دکمه OK بر روی آن را داشته باشيم . در چنين حالتی ، اگر TextBox خالی بماند ، و دکمه OK کليک گردد ، RequiredFieldValidator نمايش داده شده و رويداد ديگری پردازش نشده و صفحه برای سرويس دهنده PostBack نخواهد شد. درصورتيکه مقداری در TextBox درج و دکمه OK فعال گردد ، صفحه PostBack شده و رويداد TextChanged ، قبل از رويداد Click محقق می گردد. برنامه زير واکنش لازم را در اين راستا انجام خواهد داد ( کليک بر روی دکمه Button1 و يا تغيير مقدار TextBox1 ).

 

VB.NET

Private Sub Button1_Click ( ByVal sender As System.Object ,_
  ByVal e As System.EventArgs ) Handles Button1.Click
      Response.Write( "Button Clicked! <Br>")
End Sub
Private Sub TextBox1_TextChanged ( ByVal sender As System.Object ,_
ByVal e As System.EventArgs ) Handles TextBox1.TextChanged
      Response.Write( "Text has Changed <Br>")
End Sub