واژه Ajax سرنام عبارت Asynchronous JavaScript and XML و به معني <جاوا اسكريپت و XML آسنكرون يا نامتقارن> است. ايجكس فناوري جديدي است كه به كمك آن ميتوان اينترفيس يك برنامه تحت وب را طوري ساخت كه وقتي كاربر روي دكمه يا لينكي كليك ميكند، كليه عمليات ارسال اطلاعات و دريافت نتايج در پشت صحنه انجام شود و فقط آن قسمت از اينترفيس كه قرار است اطلاعات جديد را به نمايش درآورد تغيير كند بدون اينكه تمام صفحه از نو بارگذاري شود. در اين مقاله ميخواهيم اين فناوري نوين و تحول آفرين را از جنبههاي مختلف مورد بررسي قرار دهيم و با مباني فني آن آشنا شويم.
كمربندها را ببنديد
آيا از دنياي كلاسيك وب خسته شدهايد؟ آيا مايليد با چهره جديد وب آشنا شويد؟ آيا ميخواهيد با جديدترين فناوري دنياي برنامهنويسي وب آشنا شويد؟ براي پرواز آماده باشيد! مقصد ما يكي از استانهاي كشور جديد التاسيس Web 2.0 است. ميخواهيم با هم به دنياي هيجان انگيز Ajax سفر كنيم.
در سرزمين ايجكس چهره سايتهاي وب مانند نرمافزارهاي روميزي به نظر ميرسند. اكنون وب خانه دوم اطلاعات ديجيتالي شما است. حالا كه با داشتن يك خط اينترنت پرسرعت ميتوانيد در تمام طول شبانه روز به اينترنت متصل باشيد، وقت آن فرارسيده كه نرمافزارهاي تحت وب نيز متحول شوند و كاركرد و قابليتي مانند نرمافزارهاي روميزي داشته باشند. به اين ترتيب فاصله و تفاوت ميان نرمافزارهاي دسكتاپ و نرمافزارهاي آنلاين ناپديد ميشود. ديگر لازم نيست وقتي روي دكمه submit كليك ميكنيد منتظر بارگذاري مجدد صفحه وب بمانيد. همهچيز فورا و به سرعت اتفاق ميافتد.
تصور كنيد به صورت آنلاين در حال خواندن نامههاي الكترونيكي خود در يكي از سايتهاي ياهو يا جيميل هستيد. فورا يادتان ميافتد كه بايد به كسي نامهاي بفرستيد. لازم نيست صفحهاي كه در حال مطالعه آن هستيد را ترك كنيد و يا با استفاده از ترفندهايي مانند رايت كليك و فرمان Open in New window يك پنجره جديد بازكنيد و منتظر بارگذاري مجدد صفحه شويد. شما فقط ميخواهيد يك پنجره جديد باز كنيد كه داخلش نامه خود را تايپ كنيد.
چه نيازي به بارگذاري مجدد آنهمه اطلاعات جزئي و جنبي (مانند لوگوي سايت، نام آيدي شما و ...) است كه در اطراف اطلاعات اصلي به نمايش درآمدهاند؟ ايجكس همين كار را براي شما ميكند. وقتي كه نامه خود را ارسال كرديد نيز فقط همان پنجره بسته ميشود و چند بايت براي سايت مقصد ارسال ميشود و اينترفيس صندوق پستي نامههاي شما بدون اينكه تكان بخورد و يا دوباره به نمايش درآيد همچنان پيش چشم شما و منتظر فرمان بعدي است. در دنياي ايجكس دكمههاي Back و Forward مرورگر معني و كاربرد خود را تقريبا از دست ميدهند.
همه دكمههاي مورد نياز داخل اينترفيس سايت موجود است. برخلاف جهان Web 1.0، در دنياي ايجكس گشت و گذار در وب لزوما خطي نيست. اگر ميخواهيد از يك فروشگاه الكترونيكي خريد كنيد، ميتوانيد محصول مورد نظرتان را به روش drag&drop داخل سبد بيندازيد و با فشردن دكمه نهايي، خريد خود را ثبت كنيد. پيغام ثبت موفقيت آميز سفارش براي شما نمايش داده ميشود و كار تمام است. لازم نيست از صفحه الف به صفحه ب و سپس از آنجا به صفحه ج برويد.
اين واژه را اولين بار جسي جيمز گرت (Jesse James Garrett)، برنامهنويسي از شركت Adaptive Path در مقالهاي با عنوان <ايجكس: رهيافت جديدي در برنامههاي تحت وب> بهكار برد. ايجكس سرنام عبارت Asynchronous JavaScript and XML و به معني تركيب نامتقارن جاوا اسكپريپت و XML است.
چرا نامتقارن؟ چون تركيب اين دو فناوري به شما كمك ميكند قسمتي از يك صفحه وب را بروز كنيد بدون اينكه لازم باشد <همزمان يا متقارن> با اين عمل، كل آن صفحه از نو بارگذاري شود. اين عمليات توسط شيء و فرماني به نام XMLHttpRequest انجام ميشود كه سالها پيش، هنگام معرفي نسخه 4 مرورگر اينترنت اكسپلورر وارد اين نرمافزار شده و به دليل قابليتهاي جالبي كه دارد، اين روزها تمام مرورگرهاي معروف و قدرتمند وب مانند فايرفاكس و اپرا از آن پشتيباني ميكنند. به كمك اين شيء ميتوانيد برنامههايي به زبان جاوا اسكريپت بنويسيد كه در پشت صحنه يك صفحه وب اطلاعاتي را به سرور بفرستند و دادههايي را دريافت كنند.
ايجكس اساسا رهاوردي از دنياي جاوا است و بار ديگر فناوري جاوا و زبان اسكريپتنويسي وابسته به آن را در كانون توجه برنامهنويسان قرار داده است. اما خبر خوب اينست كه چون همه پلتفرمهاي برنامهنويسي وب از قبيلPHP ،ASP.NET و JSP از جاوا اسكريپت و XML پشتيباني ميكنند، فناوري ايجكس در همه اين پلاتفرمها پيادهسازي شده و حتي جالب است بدانيد كه تعداد ماژولهاي ايجكس نوشته شده براي دات نت و PHP بيشتر از انواع جاوايي آن است.
مايكروسافت كه سالها پيش از شيء XMLHttpRequest در نرمافزار Outlook Web Access استفاده كرد و جزو اولين ترويجدهندگان اين تكنيك به شمار ميرود اخيرا نرمافزاري به نام Atlas معرفي كرده كه مخصوص برنامهنويسي مبتني بر ايجكس است. اما چون ايجكس بر اساس جاوا كار ميكند بديهي است كه جنبش اپن سورس و خيل عظيم برنامهنويسان جاوا نيز بيكار نمانده و ميكوشند تا دير نشده Ajax را به قلب دنياي نرمافزارهاي آزاد بياورند و از انحصاري شدن آن جلوگيري كنند تا اين فناوري به استاندارد جديد وب تبديل شود. به نظر ميرسد كه آنها موفق بودهاند زيرا حتي پيادهسازيهاي دات نتي ايجكس نيز اغلب به صورت اپن سورس است.
جسي جيمز گرت در مقاله معروف خود شيوه عمل ايجكس را چنين توضيح ميدهد: هر عمل از سوي كاربر كه به طور معمول موجب توليد يك تقاضاي HTTP شود به جاي ارسال مستقيم به وب، موجب فراخواني يك فرمان جاوا اسكريپتي و هدايت آن به موتور ايجكس ميشود. هر نوع پاسخي به كاربر از سوي سرور (مانند كنترل صحت دادههاي وارد شده در يك فرم ورود اطلاعات، ويرايش اطلاعات در حافظه و حتي برخي از انواع هدايت كاربر در سايت) نيازي به ارسال يك صفحه جديد به سمت كاربر ندارد و تنها همان قسمتي كه بايد تغيير كند بروز ميشود.
به طور سنتي وقتي كاربر فرمي را پرميكند و به سايت ارسال ميكند، وب سرور با بارگذاري مجدد يا تازهسازي صفحه (refresh) و نمايش يك پيغام و يا نتيجه پردازش اطلاعات، به او پاسخ ميدهد و به همين دليل هم وقت سرور براي ارسال كل محتواي آن صفحه گرفته ميشود و هم كاربر بايد براي دريافت كامل آن صفحه منتظر بماند؛ كه نتيجه آن كاهش بازده سرور، مصرف پهناي باند و تلف شدن وقت و هزينه است. اما بهكارگيري تكنيك ايجكس اين مشكلات را به طرز قابلملاحظهاي كاهش ميدهد.
همانطور كه جسي جيمز گرت مينويسد، گوگل در ميان سايتهاي اينترنتي از نظر ميزان بهكارگيري فناوري ايجكس پيشتاز است و اين تكنيك را در نرمافزار سايتهاي Orkut ،Gmail ،Google Groups، سيستم Google Suggest و سرويس Google Maps به كار برده است. همچنين به گفته گرت بسياري از قابليتهاي دوست داشتني Flickr، سايت به اشتراكگذاري عكس ياهو، و نيز موتور جستجوي A9 در سايت آمازون بر اساس ايجكس كار ميكنند.
گرت مينويسد: اگر موتور ايجكس براي پاسخ دادن به كاربر نيازمند گرفتن اطلاعاتي از سمت سرور است، اگر قرار است دادهها براي پردازش به سرور ارسال شوند، اگر لازم است كدهاي اضافي براي نمايش تغييرات اينترفيس بارگذاري شوند، اگر نياز به بازيابي و بيرون كشيدن اطلاعات از بانك اطلاعاتي باشد، همه اين كارها بهطور آسنكرون و با استفاده از XML، بدون اينكه وقفهاي در تماس ميان كاربر و اينترفيس نرمافزار بهوجود آيد توسط موتور ايجكس انجام خواهد شد.
طي سالهاي اخير صنعت نرمافزار در عرصه وب به سوي توليد سيستمهايي حركت كردهاست كه هرچه بيشتر مستقل از نوع سيستمعامل و مرورگري باشد كه كاربر استفاده ميكند.
نگاهي به سير تحولات مربوط به زبانهاي برنامهنويسي وب مانند PHP و ASP از يكسو و كاهش اقبال برنامهنويسان به فناوريهايي همچون ActiveX و Java Applet در سمت كلاينت از سوي ديگر، مويد اين نكته است.
در واقع يكي از دلايل مهم توجه دنياي نرمافزار به فناوري ايجكس همين است. اين دستاورد برخلاف فناوريهايي مانند Macromedia Flash نيازمند نصب هيچ نرمافزار الحاقي و اضافي روي مرورگر نيست و همين حالا بستر لازم براي پيادهسازي ايجكس روي ميليونها سايت و مرورگر وب وجود دارد. در اين ميان، اتكاي ايجكس بر فناوري XMLاز اهميت ويژهاي برخوردار است.
زيرا XML ماهيتا يك فناوري باز است كه انعطافپذيري زيادي دارد و هماكنون در مقياس گستردهاي در نرمافزارهاي تحت وب، از سيستمهاي تجارتالكترونيك گرفته تا نرمافزارهاي مديريت محتواي سايتهاي وب و فناوريهايي همچون وبسرويس، RSS و حتي پادكستينگ مورد استفاده قرار ميگيرد.
ظهور ايجكس نشان ميدهد كه فناوري XML هنوز قابليتهاي كشفنشدهاي دارد كه همچنان بكر ماندهاند و ميتوانند منشا تحولات بزرگ در سيستمهاي اطلاعاتي و ارتباطي باشند.
در همين ارتباط، رويكرد ايجكس به سمت فناوري وبسرويس قابل توجه است. از آنجا كه Ajax تا حد زيادي به معماري XMLHttpRequest وابسته است، اين قابليت را دارد كه فرامين ارسال و دريافت اطلاعات را نه فقط از طريق سايت اصلي نمايش دهنده يك صفحه وب، بلكه از طريق سايتهاي ديگري كه احتمالا اطلاعات خود را بر بستر وب سرويس و XML قرار دادهاند نيز دريافت كند. بنابراين ايجكس بالقوه يك فناوري سازگار با وب سرويس نيز هستد.
مزيت مهم ديگر Ajax بهرهگيري آن از استاندارد CSS است.
استانداردي كه به تنهايي منشا تحولات ديگري در زمينه اينترفيس نرمافزارهاي وب است و در آينده بسيار نزديك به وجه غالب صفحهآرايي و اينترفيس سايتهاي وب تبديل خواهد شد. توجه ايجكس به CSS شان ميدهد كه اين فناوري همزمان با بهكارگيري جاوا اسكريپت و XML براي مديريت دادهها، از استاندارد پيشرفتهاي براي اينترفيس وب استفاده ميكند و ميتوان حقيقتا آن را يك فناوري مرتبط با اينترفيس ( و نه فقط تعامل ميان كلاينت و سرور) تلقي كرد.
با اين وجود، ايجكس معايبي نيز دارد و اين معايب موضوع بحث بسياري در محافل برنامهنويسي روي اينترنت است. يكي از مسائلي كه به عنوان ايراد مطرح شده، دشواري تغيير عادت كاربران در استفاده از كليدهاي Back وForward و Refresh در مرورگرهاي وب است. يكي از مشكلات برنامهنويسان وب همواره اين است كه يا بايد كاربر را عادت دهند كه هرچه كمتر از اين دكمهها استفاده كند و يا نرمافزار خود را طوري بنويسند كه اگر كاربر سهوا يا عمدا از اين دكمهها استفاده كرد، نرمافزار دچار اشتباه و خطا در تفسير عمل كاربر نشود.
به عنوان مثال هنوز بسياري از سايتهاي تجارت الكترونيكي كه به كار فروش محصولات مشغولند هنگام طي شدن مراحل نهايي خريد آنلاين به كاربر هشدار ميدهند كه حين پردازش يك سفارش (يعني درست در لحظهاي كه فرمان نهايي از سوي كاربر ارسال شده است و هنوز صفحه نمايش پيغام ثبت موفقيتآميز سفارش يا عدم ثبت آن براي وي نمايش داده نشده) از فشردن كليد Refresh جدا پرهيز كنند وگرنه ممكن است از كارت اعتبار آنها دوبار پول كسر شود. همچنين استفاده از دكمههاي Back و Forward در عملياتي كه به آساني برگشتپذير نيستند ممكن است باعث گيج شدن كاربر است.
مثلا اگر نامههاي داخل صندوق پستي خود را پاك كنيد، استفاده از دكمه Back هرگز اين عمل را Undo نميكند. همچنين اگر يك قلم كالا به سبد خريد آنلاين خود اضافه كنيد، فشردن دكمهBack ممكن است در ظاهر چنين نشان دهد كه آن قلم كالا مجددا از سبد برداشته شده اما در سمت سرور همچنان در سبد خريد كاربر باشد. از آنجا كه فناوري ايجكس عمل Navigation يا راهبري در يك سايت را به روندي غيرخطي تبديل ميكند، تمام اين مشكلات به شكل حادتري ممكن است بروز كند.
در واقع با حضور Ajax، كاركرد سيستم History مرورگر به مسالهاي بغرنج تبديل ميشود. زيرا برنامهنويس يا بايد با گنجاندن دكمهها و فرامين اضافي، مكانيزم Undo را بازسازي كند و يا موتور ايجكس را طوري بنويسد كه فشردن دكمه Back خود به خود موجب احظار فرمان Undo شود.
در هر دو صورت كار برنامهنويس آسان نخواهد بود. البته در اين زمينه ترفندها و تكنيكهايي هم ابداع شده است. از جمله، استفاده از تگ IFRAME مخفي در اينترفيس صفحه كه موتور ايجكس بتواند در صورت فشرده شدن دكمهBack از سوي كاربر، نسخههاي پيشين نمايش داده شده از اينترفيس را از انباره History مرورگر بيرون بكشد و دوباره در چرخه عمليات موتور ايجكس وارد كند. اين ترفند هماكنون در سرويس Google Maps استفاده ميشود.
مشكل ديگري كه در رابطه با ايجكس وجود دارد، بي معني شدن مفهوم Bookmark است.
بازهم مكانيزم غيرخطي ايجكس مشكل ساز ميشود. آيا شما ميتوانيد در نرمافزارهاي معمولي دسكتاپ يك لحظه مشخص را Bookmark كنيد و دوباره به آن برگرديد؟ بعضي از نرمافزارها مانند فتوشاپ
(سيستم Action history) اينكار را انجام ميدهند، ولي اغلب نرمافزارها چنين نيستند. در واقع به سختي ميتوان از لحظات مختلف يك نرمافزار عكس گرفت و snapshot تهيه كرد.
اينكار به يك انباره پيچيده نياز دارد كه هم حالتهاي مختلف اينترفيس و هم وضعيتهاي متفاوت دادهها را قبل و پس از تغييرات در خود نگه دارد. البته درمورد Ajax راهكارهايي در اين زمينه پيشنهاد شده است. از جمله استفاده از anchor در HTML كه پس از علامت َ در يك URL ظاهر ميشود. از آنجايي كه جاوا اسكريپت امكان به روزرساني دايناميك آنكورها را دارد، بعضي برنامهنويسان پيشنهاد كردهاند كه از اين ترفند براي نگهداري حالات مختلف يك برنامه مبتني بر ايجكس استفاده شود. تكنيكي كه ممكن است در زمينه حل مشكل دكمههاي Back و Forward نيز سودمند واقع شود.
يك مشكل عمده ديگر نيز در ارتباط با ايجكس وجود دارد. اين فناوري به شدت متكي به XMLHttpRequest است و اين شيء به دلايل امنيتي طي ماههاي اخير هرچه بيشتر و بيشتر در نسخههاي جديد مرورگرها محدود شده است. زيرا اگر هر كلاينتي بتواند از هر نقطهاي به هر سروري اين فرمان را بفرستد، آنگاه تهديدهاي امنيتي عليه سايتها افزايش مييابد. محدوديتهاي جديد اعمالشده در نسخههاي اخير مرورگرها موجب شده كه فرمانXMLHttpRequest بهغير از سايتي كه صفحه وب از آنجا آمده است نتواند با سايت ديگري ديالوگ داشته باشد و اين مسئله در تناقض با كاربرد ايجكس در زمينه وبسرويس است.
البته براي غلبه بر اين مشكل راهحلهايي هم پيشنهاد شده است، از جمله اينكه شي ءXMLHttpRequest ميتواند تقاضاي ديالوگ با سايتهاي ديگر را به يك وب سرويس روي سايتي كه صفحه وب از آنجا آمده است بفرستد و اين وبسرويس (كه روي ميزبان سايت قرار دارد و با تمام اينترنت در ارتباط است) به صورت يك واسطه عمل كند و تقاضاهاي مورد نظر را براي سايت مقصد ارسال كند. اين وب سرويسهاي واسطه اصطلاحا Application Proxy ناميده ميشوند.
البته ايجكس مشكلات كوچك و جنبي ديگري هم دارد كه چندان مايه نگراني نيست ولي به هرحال قابل لمس هستند. به عنوان نمونه، نرمافزارهاي مبتني بر ايجكس از حجم زيادي جاوا اسكريپت استفاده ميكنند كه همه اينها در هر session دستكم يكبار بايد روي مرورگر بارگذاري شوند. بنابراين اولين باري كه چنين اينترفيسي بارگذاري ميشود صفحه وب آنقدر سنگين ميشود كه حتي با ارتباط باندپهن هم چند لحظه طول ميكشد كه صفحه بارگذاري شود.
در چنين شرايطي نوشتن يك موتور ايجكس هوشمند كه با كمتر ميزان كد بتواند بهترين كاركرد را داشته باشد، خود به يك چالش برنامهنويسي تبديل ميشود؛ ضمن اينكه كاربران وب در كشورهايي كه سرعت دسترسي به اينترنت در آنها به طور معمول زياد نيست بايد هنگام بارگذاري صفحات وب اينچنيني صبر پيشه كنند و برنامهنويسان نيز مراقب باشند تا در صورتي كه به دليل كندي خط يا قطع شدنها لحظهاي آن، كدهاي جاوا اسكريپت به طور كامل روي مرورگر بارگذاري نشد، نرمافزار دچار خطا و اشتباه نشود و بتواند اين مشكلات را از طريق بارگذاري مجدد و هوشمندانه كد جاوا اسكريپت روي كلاينت، مديريت كند.
در كنار همه تحولاتي كه به دنبال ظهور پديده ايجكس در صنعت نرمافزار پديد آمده است، يك خبر مهم نيز قابل توجه است. شركت IBM كه خود از پيشگامان فناوري XML است، در ابتداي ماه فوريه 2006 اعلام كرد يك ائتلاف بزرگ صنعتي متشكل از شركتهاي بورلند، BEA Systems ،Zend، ناول، ياهو، موزيلا، ردهت، اوراكل و بنياد اكليپس ايجاد كرده است كه در نظر دارد براي توسعه يك پيادهسازي فراگير و اپن سورس از ايجكس تلاش كند. پيش بيني ميشود كه اين پيادهسازي به يكي از استانداردهاي اصلي ايجكس در صنعت نرمافزار تبديل شود. آيبيام در نظر دارد مجموعه Toolkit پيشنهادي خود را از طريق بنيادهاي موزيلا و اكليپس در دسترس جامعه اپن سورس قراردهد. در همين رابطه شركت Zimbra، يك سازنده نرمافزارهاي مبتني بر ايجكس درنظردارد مجموعه Toolkit خود را تحت ليسانس موزيلا و Apache در اختيار برنامهنويسان قرار دهد.
در عين حال وقتي حجم جاوا اسكريپت بارگذاري شده روي كلاينت افزايش مييابد سرعت پردازش كامپيوتري كه كاربر استفاده ميكند نيز به يك مسئله تبديل ميشود. به بيان ديگر، ايجكس شديدا منابع و resource هاي سيستم را بهكارميگيرد، چنانكه به جرات ميتوان گفت نرمافزارهاي مبتنيبر Ajax براي كاربراني كه از كامپيوترهاي ضعيف و قديمي استفاده ميكنند قابل استفاده نيست.
اگر فرض را بر اين بگذاريم كه اين يك مشكل عمومي است و نه مختص وب، يعني كامپيوترهاي قديمي از اجراي نسخه جديد نرمافزارهاي مخصوص دسكتاپ نيز ناتوانند تا چه برسد به وب، آنگاه اين مشكل چندان اهميتي ندارد زيرا به مرور زمان، با جايگزين شدن سيستمهاي جديد، مسئله حل خواهد شد. در چنين شرايطي ممكن است كندي بارگذاري و اجراي كدهاي جاوا اسكريپت در نرمافزارهاي مبتني بر ايجكس عملا مزيت كاهش زمان انتظار براي بارگذاري مجدد صفحه را خنثي كند و نقض غرض شود. خوشبختانه مرتبا پردازنده هاي سريعتري وارد بازار ميشوند و ميتوان اميدوار بود كه اين مشكل قبل از آنكه جدي شود، ناپديد شود.
يكي ديگر از مشكلاتي كه در ارتباط با ايجكس به نظر ميرسد اينست كه كار زيادي از برنامهنويس ميطلبد و در حال حاضر اجراي موفقيتآميز يك اينترفيس حرفهاي مبتني بر ايجكس كاري بسيار دشوار و وقتگير است. يعنيAjax به همان اندازه كه كار بازديدكنندهها را آسان ميكند، كار برنامهنويسان را مشكل ميكند! با اين حال ايجكس روي پلتفرمهاي مختلف پيادهسازي شده و مجموعه ابزارهاي مختلفي براي تسهيل كار برنامهنويسان عرضه شده است تا تجربه شيرينتري از Ajax داشته باشند.
برنامهنويسان ASP.NET در صورتي كه از نسخه دات نت 1.1 استفاده ميكنند ميتوان از ماژولAjax.NET استفاده كنند كه اولين پيادهسازي داتنتي ايجكس و رايگان است. مايكروسافت در ASP.NET 2.0 اين فناوري را با نام Atlas وارد پلتفرم كرده است كه علاقهمندان ميتوانند يكراست سراغ آن بروند.
براي پلتفرم جاوا نيز چندين پيادهسازي مختلف، اغلب اپن سورس، وجود دارد. از جمله AjaxAnywhere و AjaxTagsرا ببينيد. همچنين چندين پيادهسازي مخصوصPHP ميتوانيد پيدا كنيد. ماژولهاي CPAINT و xajax از آن جملهاند. ماژول CPAINT براي ASP نيز قابل استفاده است. چند ماژول ديگر هم مانند GeneXus وجود دارند كه مالتي پلتفرم هستند. براي هريك از پلتفرمهاي Perl ،ColdFusion و Python نيز دستكم يك پيادهسازي معروف وجود دارد. فهرست كامل همه اين پيادهسازيها را به همراه آدرس سايت و لينك دانلود آنها را ميتوانيد در ضميمه آنلاين همين مقاله كه همزمان با انتشار اين شماره در بخش دانلود سايت ماهنامه شبكه قرار ميگيرد، پيدا كنيد.