سؤال

تنفيذ Mojarra لـ JSF 2 لديه معاملات السياق التالية:

  • com.sun.faces.numberOfViewsInSession (الافتراضي هو 15)
  • com.sun.faces.numberOfLogicalViews (الافتراضي هو 15)

ما الفرق بينهم؟ الوثائق لا تتحدث كثيرا عن هذه. كان تطبيقي يواجه مشكلة ViewExpiredException بالنسبة لبعض الصفحات ، ولكن بعد أن صدمنا هذه الإعدادات لقيمة أعلى (كثيرًا) ، توقفنا عن وجود مشاكل.

التطبيق الخاص بي عبارة عن تطبيق مالي ، ثقيلًا ، يمكّن AJAX (بعض الشاشات تحتوي على أكثر من 50 إدخالًا ، مع خيار إضافة المزيد من البيانات/المدخلات عبر AJAX).

ماذا يمكن أن يكون سبب هذا السلوك؟ أفهم أن المعلمة الأولى تحدد عدد "الصفحات" التي يتم الاحتفاظ بها في الجلسة ، والتي قد تكون مفيدة لزر الخلف ، ولكن حالات الاستخدام التي تؤدي إلى ViewExpiredException لا تستخدم زر العودة. ماذا يشير المعلمة الثانية؟ إذا بقيت في نفس الشاشة ولكن استمرت في إضافة الكثير من البيانات عبر AJAX ، هل يتسبب ذلك في حاجة إلى عدد أكبر من المشاهدات المنطقية للصفحة؟

هل كانت مفيدة؟

المحلول

بادئ ذي بدء ، قام تطبيق Mojarra بتبديل معنى معلمات السياق هذه عن غير قصد. لذا ، إذا كان لديك انطباع بأن الوصف هو العكس تمامًا من ما يدل به اسم معلمة السياق الحرفي ، فهذا صحيح بالفعل.


com.sun.faces.numberOfLogicalViews

هذا هو في الأساس الحصول على الطلب. كل طلب GET ينشئ عرضًا جديدًا في الجلسة.

لتجربة ذلك ، قم بتعيينه على قيمة 3 ، وابدأ جلسة متصفح جديدة وفتح 4 علامات تبويب مختلفة للمتصفح (بغض النظر عن عنوان URL ؛ قد تكون مختلفة ، قد تكون مختلفة) بالتسلسل ثم العودة إلى علامة التبويب الأولى وإرسالها النموذج هناك. سوف تحصل على ملف ViewExpiredException, ، نظرًا لأن هذا العرض قد تم إخراجها من خريطة LRU (الأقل استخدامًا مؤخرًا) لوجهات العرض في الجلسة. لن يحدث هذا إذا فتحت علامات تبويب Max 3.

مع القيمة الافتراضية البالغة 15 ، هذه مشكلة حقيقية نادرة. إذا تم تصميم الويب الخاص بك حقًا لاستخدامه بهذه الطريقة (مثل موقع اجتماعي/مجتمعي يدعو إلى فتحه في علامات تبويب متعددة ، مثل منتدى المناقشة أو الأسئلة والأجوبة) ، فقد تفكر في استخدام توفير الحالة الجانبية بدلاً من زيادة القيمة الافتراضية . مع توفير الحالة الجانبية للعميل ، لن تواجه هذا الاستثناء أبدًا. البديل سيكون للاستخدام omnifaces <o:enableRestorableView> مجتمعة طلب الفاصوليا المنتهي والطلب ، أو عرض الفول الذي يتم تحديده الذي يتحقق في (post) بناء إذا كانت حالتها بحاجة إلى استعادة. مرة أخرى بديل آخر هو الذهاب عديمة الجنسية مع <f:view transient="true">, ، وبهذه الطريقة ، لم يتم حفظ وجهات النظر بعد الآن ، لكن لا يمكنك استخدام عرض الفاصوليا المنتشر بعد الآن.

ما يعادل myfaces هو org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION الذي يتخلف عن 20.


com.sun.faces.numberOfViewsInSession

هذا هو في الأساس متزامن (غير Ajax!) على الطلب على أساس. كل طلب منشور متزامن ينشئ طريقة عرض منطقية جديدة. يتم تخزينها جميعًا على أساس وجهة نظر جسدية مثل ذلك Map<PhysicalView, Map<LogicalView, ViewState>>. لذلك ، مع Max 15 Aways Views و Max 15 Views المنطقي ، يمكنك نظريًا الحصول على 15*15 = 225 مشاهدة في الجلسة.

لتجربة ذلك ، قم بتعيينه على قيمة 3 ، افتح طريقة عرض باستخدام نموذج متزامن ، وقم بتقديمه 4 مرات ، ثم اضغط على زر ظهر المتصفح 4 مرات ثم أرسل النموذج مرة أخرى. سوف تحصل على ملف ViewExpiredException, ، نظرًا لأن هذا العرض قد تم إخراجه من خريطة LRU (الأقل استخدامًا مؤخرًا) للمساواة المنطقية. لن يحدث هذا إذا عدت كحد أقصى 3 مرات ثم أعيد تقديمه.

لاحظ أن Ajax يقدم إعادة استخدام العرض المنطقي نفسه (يمكنك تأكيد ذلك من خلال رؤية نفس الشيء بالضبط javax.faces.ViewState القيمة التي يتم إرجاعها على أجهزة البورصة AJAX). لا يوجد دعم زر ظهر المتصفح له على أي حال. يعيدك زر ظهور المتصفح فقط إلى الطلب المتزامن السابق ، وبالتالي لن يكون من المنطقي تخزين جميع هذه الأبعاد Ajax كطرق منطقية في الجلسة.

مع القيمة الافتراضية البالغة 15 والاتجاه الحالي لأشكال Ajax فقط وذاكرة التخزين المؤقت المعوقة على الصفحات الديناميكية ، فهذه مشكلة حقيقية نادرة جدًا. لا ينبغي أن تدعو النماذج المصممة بشكل صحيح إلى الضغط على زر ظهر المتصفح. بدلاً من ذلك ، يجب عليهم تقديم إعادة توجيه ناجحة إلى العرض الهدف وعلى الفشل ، فقط إعادة تشغيل نفس النموذج مع أخطاء التحقق من الصحة. انظر للحصول على تلميحات أيضا كيف تنقل في JSF؟ كيفية جعل عنوان URL تعكس الصفحة الحالية (وليس السابقة). وأيضًا ، يتم تعطيل ذاكرة التخزين المؤقت في كثير من الأحيان على الصفحات الديناميكية ، وبالتالي فإن زر الخلف يمنحك بشكل أساسي عرضًا جديدًا. أنظر أيضا تجنب زر العودة على تطبيق الويب JSF. إذا كان هذا أيضًا لتطبيقك في الحالة ، فيمكنك تعيين القيمة بأمان على 1.

لم يكن لدى MyFaces في الأصل أي ما يعادل ذلك ، وحسب هذا بمثابة وجهة نظر مادية في الجلسة أيضًا. في الإصدار 2.0.6 ، org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION تم تقديمه ، بهدف مماثل ، على الرغم من تنفيذ مختلف ومعاق الافتراضي.


أنظر أيضا:

نصائح أخرى

فقط وجدت هذا على الويب: http://oss.org.cn/ossdocs/java/ee/javaeetutorial5/doc/jsfconfigure11.html

قد يكون هذا مفيدًا:

المشاهدات المنطقية هي رؤى فرعية لعرض المستوى الأعلى. على سبيل المثال ، إذا كان لديك صفحة تتضمن إطارات متعددة ، فإن كل إطار هو عرض منطقي. إذا كان لديك تطبيق بسيط ، فقد تكون العرض الافتراضي لـ 15 مشاهدة أو 15 مشاهدة منطقية كبيرة جدًا. في هذه الحالة ، يجب أن تفكر في تقليل العدد المسموح به من المشاهدات والمنظر المنطقي للحفاظ على الذاكرة. على العكس ، قد يتطلب تطبيق أكثر تعقيدًا أكثر من 15 مشاهدة أو طرق عرض منطقية في جلسة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top