الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أفضل طريقة لتبادل البيانات بين JSP و Servlets .

بدأه Abdullah.Alshammeri في 1 سبتمبر 2010 · 6 رد · 1,116 مشاهدة · في JavaEE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ،

إذا كان لدينا JSP و Servlet وكنت استخدم نمط " MVC " ، وأردت أن انقل معلومة ( لنفرض أني وضعتها في Beans ) ، ماهي أفضل طريقة لنقلها إلى JSP ؟ أي ماهو الوعاء الذي سيحملها إلى JSP ؟

الطريقة التي استخدمها هي حشو session بالكائن ثم في JSP أقرأ هذا الـ bean و قيمة scope هي session :

<jsp:useBean id="obj" class="Object"   scope="session"/>

( لا أعرف هل أخذت هذا الأسلوب عن كتاب أوعن عضو في المنتدى أو من مكان آخر ) ؟

أليست session هي للمعلومات التي تخص المستخدم ، و التي تنتهي بعد فترة معينة ( يوم مثلاً ) ؟

يعني استخدمها لتخزين معلومات دخول المستخدم مثلاً !

فكرت قليلاً في هذا السيناريو :

- معلومة بحجم 5 ميجا - لنفرض أنها مقالة مكونة من 20 ألف كلمة / يتم نقلها من DB ثم الى Servlet الذي يضعها في session ويرسلها إلى jsp .

لو قام 100 مستخدم بتنفيذ نفس العملية ، فستصبح session ممتلأة على الآخر .. لأن المعلومات ستبقى يوم كامل مثلاً .. ؟ بمعنى أنه لن يتم تفريغ session بعد كل طلب request ؟

أي أن كل مستخدم سيستهلك في اليوم الواحد 100 ميجا على الأقل تكون مخزنة في session حتى تنتهي تلك الجلسة .

ولو كان عندنا " 1000 " مستخدم .. فالنتيجة كارثية .

ما دعاني إلى إعادة التفكير .. هو php ، حيث يمكن نكتب شيء كهذا :

$data = phpModel->getData()
phpView->setView($data);
.
.
.

setView : عبارة عن دالة تقوم بتوليد html tags ، حيث ملف php الخاص بالعرض سيكون تقريباً هكذا :

<div>$data</div>

في الجافا ، من المفروض أنه يتم تمرير الكائن إلى jsp ومن ثم يموت هذا الكائن بعد توليد الصفحة .. ولا يبقى في session ؟

الخيارات الأخرى البديلة لـ session ليست مناسبة ، مثل request ..

أما scope = page ، فيبدو أنه حل جيد .. لكن لا أعرف كيف استخدمه blush.gif

لو كنت استخدم Servlets فقط ، لكان الأمر سهل لأني أنا من سأكتب HTML Tags داخل Servlet ولا احتاج لـ session أبداً ..

لكن عندما استخدم معمارية JSP/Servlets ، فأنا في ورطة !

ماهو الحل الأمثل .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

أظن أن ال session timeout لا يتعدى 30 دقيقة. يمكنك تغييره في ال web.xml الخاص بال tomcat

1
#3
اقتباس
الطريقة التي استخدمها هي حشو session بالكائن ثم في JSP أقرأ هذا الـ bean و قيمة scope هي session :

إذا كنت تريد مجرد تمرير المعلومه من JSP ل Servlet أو العكس... فإستخدم ال request scope , ولا تنسي أن تجعل طريقة الإنتقال من jsp إلى ال servlet أو العكس هي forward وليس redirect (لأن redirect تسكب جميع ال request scope variables في الطريق)

اقتباس

أليست session هي للمعلومات التي تخص المستخدم ، و التي تنتهي بعد فترة معينة ( يوم مثلاً ) ؟

يعني استخدمها لتخزين معلومات دخول المستخدم مثلاً !

كما قال لك عصام.. بمعني أنه سيتم عمل timeout إذا تركت الموقع بعد فتره 30 دقيقه

رأي الشخصي أنك لا تخزن ب ال session إلا المعلومات التي تريدها أن تدوم معك, و فقط ... و إذا إضطريت لعمل ذلك, قم بمسح الكائن من ال session عندما تنتهي من العمل معه..

كما قلت مسبقا... request مناسبه جدا في معظم الحالات على شرط أن تكون طريقة الذهاب من ال Servlet إلى ال JSP هي forward وليس redirect .

request.setAttribute("my_book", book);
RequestDispatcher view = request.getRequestDispatcher("book_view.jsp");
view.forward(request, response);

هذا يضمن لك أن ال my_book ستجده في ال request scope ل صفحة ال JSP المسماه book_view.jsp

لماذا تصر على plain JSP/Servlet .......... بعد فتره (بعدما تتقن ال JSP/Servlet ) .. إتجه لل JSF مثلا... أو إقرا عن ال Hibernate .... إلخ..

3
#4

شكراً لكم ،

اقتباس
كما قلت مسبقا... request مناسبه جدا في معظم الحالات على شرط أن تكون طريقة الذهاب من ال Servlet إلى ال JSP هي forward وليس redirect .

كنت أظن أن request صغير ولا يحتمل بيانات ضخمة ، يخيّل لي أن request هو الذي سيظهر في url

اقتباس
لماذا تصر على plain JSP/Servlet .......... بعد فتره (بعدما تتقن ال JSP/Servlet ) .. إتجه لل JSF مثلا... أو إقرا عن ال Hibernate .... إلخ..

:P ، ليس إصرار ، أنا بالفعل بدأت بالـ JSF ، ولكن لم يعجبني طريقة عملها لأني متأثر بالـ CakePHP وأتمنى أن أعمل Framework مطابق لها باستخدام الجافا .

أغلب Frameworks التي جرّبت أو قرأت عنها ، موجهة للـ Enterprise وليست لتطوير موقع بسيط مثل " المدونة الشخصية " .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

أعتقد أن LinkedIn مبني بإستخدام Grails (ربما سمعت هذه الكلمه هنا أو هناك)

بالمناسبة Grails مبني على Groovy التي هي لغه برمجه إسكربتتات مبينة على الجافا......

لو عاوز تبرمج مدونه شخصيه..... أنصحك ب CakePHP :P (بما أنك تعرفها مسبقا)

لكن أنا لو مكانك هعملها ب JSF لكي أضرب عصفورين بحجر واحد..... (تعلم WEB standard framework + تعمل المدونه :D )

اقتباس
كنت أظن أن request صغير ولا يحتمل بيانات ضخمة ، يخيّل لي أن request هو الذي سيظهر في url

بما أنك وصلت لهذه الدرجه :P ... أنصح و بشده قراءة Head First Servlets&JSP

1
#6

دعني أوضح أمراً لك request هنا يختلف تماماً عن request الذي يرسله المستخدم للخادم

request هنا هو عبارة عن حاوية container يمكنك تخزين أي شيء فيه

هذه الحاوية يتم إفراغها من محتوياتها بعد الرد على request القادم من المستخدم

بمعنى آخر يقوم المستخدم بطلب الصفحة من الخادم request

يقوم الخادم بمراسلة Servlet container يقوم هذا الأخير بإنشاء كائن جديد (حاوية) ويقوم بتخزين بيانات الطلب فيها (كل المدخلات parameters)

ويمررها لكل Servlet أو JSP page يتم التعامل معها لمعالجة هذا الطلب

في هذه الأثناء وعند الانتقال من Servlet إلى آخر وحتى يتم الرد على الطلب القادم من المستخدم

تستطيع استخدام هذه الحاوية وتخزين كل البيانات التي تريد فيها

بعد إجابة الطلب القادم من المستخدم يكون الخادم مسؤول عن تفريغ محتوى هذه الحاوية وحذفها من الذاكرة (أو ربما إعادة استخدامها في طلبات أخرى pool)

تحياتي

1
حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#7

شكراً لكم على هذه المعلومات ،

- لا أحب كتب Head first ، فهي مليئة بالصور أكثر من الكلام المفيد ، لدي كتاب core jsp/servlets يفي بالغرض :-) ،

- كنت أظن request دائماً هي تلك المعلومات في url :( ، وبنيت مشروع التخرج على هذا الاعتقاد :( .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة