يک برنامه در مدت زمان حيات خود با رويدادهاي متعددي مواجه مي گردد. پس از بروز رويداد ، روتين پاسخگو مسئوليت برخورد با رويداد محقق شده را برعهده خواهد گرفت . برنامه هاي وب نيز از اين قاعده مستثني نبوده و در مدت زمان حيات خود با رويدادهاي متعددي مواجه مي گردند . رويدادها و نحوه برخورد با آنان دربرنامه هاي وب ، داراي تفاوت هائي نسبت به برنامه هاي ويندوز است . رويدادها در برنامه هاي وب در سه سطح : برنامه ، صفحات و کنترل هاي سرويس دهنده ، محقق مي گردند. ترتيب و نحوه اجراي رويدادها ، تاثيري مستقيم بر نحوه پاسخگوئي به آنان توسط کدهاي نوشته شده در يک برنامه دارد. در اين مقاله قصد داريم به بررسي جايگاه و نقش رويدادها در چرخه حيات يک برنامه وب پرداخته و از اين رهگذر با تفاوت هاي موجود بين چرخه حيات يک برنامه وب و يک برنامه ويندوز بيشتر آشنا شويم .
رويداد ها در چرخه حيات يک برنامه وب
حيات يک برنامه وب ، وابسته و متاثر از 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 |