السلام عليكم و رحمة الله و بركاته
من أهم الأهداف وراء المحتويات الديناميكية للويب هي اعطاء نواتج و صفحات حسب ادخال المستخدم. من أشهر الأمثلة ، محركات البحث ، حسب الكلمة التي تبحث عنها سيتحدد شكل صفحة النتيجة . فلو بحثت عن كلمة جافا مثلا سيكون شكل الصفحة مختلف عنها إذا ما بحثت عن كلمة ويندوز . مثال آخر بعد أن تقوم بتسجيل دخول في أحد المواقع ، حسب اسمك و كلمة السر سيعطيك الموقع رسالة ما . فإذا كان الاسم و الكلمة صحيحين سكتب مرحبا فلان ............. أما إذا كان خطأ سيعطيك آسف حاول مرة أخرى
في موضوع اليوم سوف نتعرف على الكيفية التي يتم بها ارسال محتويات استمارة أو فورم إلى المزود و كيف يمكن أن نقرأها داخل السيرفلت و بالتالي تحديد المسار و الخطوات التي علينا تنفيذها حسب محتويات الاستمارة
كيف يتم ارسال معلومات استمارة (HTML fORM) للمزود
----------------------------------------------------------------
كل عنصر من عناصرالاستمارة له خاصية اسم . انطر الشكل 1 تجد لدينا عنصرين ادخال مختلفة صندوق نص و صندوق كلمة سر لاسم المستخدم و كلمة السر بالترتيب . عندما يضغط المستخدم موافق يتم ارسال البيانات
على شكل أزواج على الشكل التالي اسم=قيمة (name=value) . في حالة كانت خاصية الطريقة method للاستمارة هي GET يتم ارسال البيانات بالحاقها بآخر اسم العنوان الخاص بالبرنامج الذي يتولى معالحة
الاستمارة بعد علامة استفهام . بعد ادخال AbuAnas و mypassword في الاستمارة وضغط موافق سنحصل على سطر عنوان شبيه بالتالي :
http://myserver/path/formHandler?us...&pwd=mypassword
احذرأن تستعمل هذه الطريقة لارسال معلومات حساسة مثل كلمة السر أو رقم بطاقة ائتمان . و لكن استعمل طريقة POST حيث أن المعلومات لا تظهر في أعلى شاشة المتصفح (هذا الاجراء ليس كافي في حالة استخدام البطاقات للتجارة الالكترونية بل يجب اتخاذ تدابير أمنية أكثر
<FORM action = "http://myserver/path/formHandler" METHOD="GET">
User name: <INPUT type="text" name="username"<br>
Password : <INPUT type="password" name="pwd"<br>
<INPUT type="submit" value="OK">
</from>
كودHTML للاستمارة
في حالة POST يتم ارسال البايانات في سطر مستقل.
تعتبر GET هي الحالة الافتراضية
User name:
Password:
نموذج الاستمارة
لمزيد من المعلومات حول استمارات الهتميل اطلع على دروس الـ HTML
كيف نقرأ بيانات المستخدم داخل السيرفلت
------------------------------------------------
قراءة البيانات التي ادخلها المستخدم سهلة جدا في الجافا سيرفلت و تتم بطريقة مباشرة وموحدة عكس السي جي آي (أقرأ المقارنة بين الطريقتين في الملحق)
لأن الجافا تقوم بجميع العمليات خلف الكواليس و تعطيني النتيجة بطريقة واحدة و بنفس الأسلوب . كل ما عليّ هو أن استخدم الطريقة الخاصة بـ HttpServletRequest
getParameter("parameterName")
هذه الطريقة ترجع لنا القيمة المرتبطة باسم البراميتر parameterName (لا يشترط أن يكون عنصر Html) ، فمثلا في مثالنا السابق ممكن نستخدم هذه الجملة لاسترجاع اسم المستخدم و تخزينه في المتغير user
String user = request.getParameter("username");
طبعا user أصبحت تساوي AbuAnas بإمكانك الآن مثلا أن تبحث عن المستخدم AbuAnas في جدول المشتركين . إن كان موجود ستدخله على صفحته الشخصية مثلا بعد مطابقة كلمة السر طبعا. و إن كان غير موجود تطبع رسالة اعتذار .
ملاحظات عامة
1- تستخدم الطريقة getParameter لكلا الحالتين GET و POST كلاً داخل الطريقة الخاصة بها doGet و doPost في السيرفلت
2- تعيد getParmeter نص فارغ إذا وُجد البارميتير و لكن لاتوجد له قيمة . و تعيد القيمة لاشئ null إذا لم يوجد باراميتير بنفس الاسم
3- يجب أن تكون حالة الأحرف مطابقة في اسم البارميتير فا UserName لا تساوي username
4- إذا وجد احتمال أن يكون للبارميتير أكثر من قيمة (مثل القوائم و مربعات الاختيار) نستخدم الطريقة
getParameterValues("parameterName")
وتعيد هذه الطريقة مصفوفة نصية String [] بقيم البارميتير أو null إذا لم يوجد بارميتير بنفس الاسم.
ملحق : مقارنة بين السي جي آي و الجافا في استخلاص ادخالات المستخدم
لقد رأينا السهولة و المعيارية التي يمكن بها استخلاص المعلومات في الجافا ، أما بالنسبة لـ CGI فإنه نظرا لاختلاف الطريقة التي يرسل بها المعلومات باستخدام GET أو POST فإنه يجب على المطور أن يكتب كود لكلا الطريقتين مختلف لكل واحدة على حدة هذا أولا . ثانيا بالنظر للطريقة التي يتم بها دمج المعلومات مع بعضها البعض فمثلا :
http://myserver/path/formHandler?us...&pwd=mypassword
يجب على المبرمج أولا تقسيم النص بعد الاستفهام (يؤخذ النص مباشرة من نص الاستعلام المرسل مع الطلب) عند علامة & ثم يأخذ الأجزاء الناتجة و يفصلها عند علامة اليساوي حتى يحصل على القيم المطلوبة . و ليت الأمر يبقى على هذا فالرموز لا ترسل مثل الأحرف كما هي ولكنها تتغير فمثلا الفراغ يحول إلى + . لو كتبت Abu Anas بدلا من AbuAnas فإنها سترسل هكذا : Abu+Anas
و بقية الرموز ترسل على شكل XX% حيث XX تمثل رقم الاسكي للرمز فقط قم بالذهاب إلى موقع مثل الياهو أوالأمازون و قم بعمليات بحث و ضغظ هنا و هناك و أنظر للعنوان في الأعلى لتعرف مدى التعقيد الذي على المبرمج أن يحله ، وعلى فكرة جميع الأحرف العربية ترسل مرمزة - مع العلم أن هذا ليست وظيفة البرنامج الذي يطوره المبرمج ، فالمبرمج يحتاج فقط المعلومات حتى يجري عليها ما يشاء و لكن بهذه الطريقة يضيع و قته في كتابة كود لاستخلاص بيانات قد تكون بسيطة و يصبح برنامجه عرضة لكثرة الأخطاء .
و لاننسى أنه ممكن يكون بعض البارميترات ليس له قيمة و بعضها لها أكثر من قيمة فعليه أن يتعامل مع كل هذه التفاصيل التي ليس لها علاقة ببرنامجه الأصلي .
نعم قد يكون هناك مكتبات جاهزة لهذه العمليات لكن ليست قياسية في نفس اللغة وقد تختلف من بيئة لأخرى وقد تختلف من مكتبة لأخرى.