سؤال

وهناك زوجين من الأشياء التي أواجه صعوبة في فهم فيما يتعلق بتطوير مكونات مخصصة في JSF.لأغراض هذه الأسئلة يمكنك أن تفترض أن جميع عناصر التحكم المخصصة تستخدم valuebindings/عبارات (لا الحرفي الارتباطات), ولكن أنا مهتم في تفسيرات عليها كذلك.

  1. أين يمكنني تعيين قيمة valuebinding?هذا هو المفترض أن يحدث في حله ؟ أو أن فك تفعل شيئا آخر ومن ثم يكون تعيين القيمة في encodeBegin?
  2. قراءة من قيمة ملزمة - عندما أقوم بقراءة البيانات من valuebinding مقابلالقراءة من submittedvalue ووضعه valuebinding?
  3. عندما يتم العمل المستمعين على أشكال يسمى بالنسبة إلى كل هذا ؟ ال JSF دورة حياة صفحات كل ذكر الأحداث التي تحدث في مختلف الخطوات ، ولكن ليس من الواضح تماما بالنسبة لي عندما بسيطة فقط المستمع commandbutton يسمى

لقد حاولت بعض المجموعات ، ولكن دائما في نهاية المطاف مع من الصعب العثور على البق التي أعتقد أنها قادمة من الأساسية الفهم الحدث دورة الحياة.

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

المحلول

هناك جيدة البياني في JSF مواصفات هذا يدل على طلب دورة حياة - من الضروري لفهم هذه الأمور.

الخطوات هي:

  • استعادة الرأي.على UIComponent شجرة يتم بناؤها.
  • تطبيق طلب القيم.للتحرير مكونات ينبغي أن تنفذ EditableValueHolder.هذه المرحلة يمشي المكون شجرة ويدعو processDecodes الأساليب.إذا كان العنصر ليس شيء معقد مثل UIData, انها لن تفعل الكثير إلا الاتصال الخاصة به فك الأسلوب.على فك طريقة لا تفعل الكثير باستثناء العثور على العارض و تحتج به فك طريقة تمرير نفسه حجة.هو العارض للحصول على أي تقدم قيمة وضعه عن طريق setSubmittedValue.
  • عملية التصديقات.هذه المرحلة المكالمات processValidators والتي سوف نداء التحقق من صحة.على التحقق من صحة الطريقة تأخذ المقدمة القيمة ، وتحولها مع أي محولات, ويؤكد ذلك مع أي المصادقون و (على افتراض أن البيانات تمر تلك الاختبارات) المكالمات setValue.هذا وسيتم تخزين قيمة متغير محلي.في حين أن هذا المتغير المحلي ليست فارغة ، فإنه سيتم إرجاع القيمة من قيمة ملزمة لأي مكالمات getValue.
  • تحديث نموذج القيم.هذه المرحلة المكالمات processUpdates.في إدخال عنصر ، updateModel والتي سوف تحصل على ValueExpression و يحتج إلى تعيين القيمة على النموذج.
  • استدعاء التطبيق.زر المستمعين الحدث حتى الاحتجاج هنا (كما سوف الملاحة إذا أسعفتني الذاكرة).
  • تقديم استجابة.شجرة المقدمة عبر عارضين والدولة حفظها.
  • إذا كان أي من هذه المراحل تفشل (مثلا ، قيمة غير صالح) ، دورة حياة يتخطى لتقديم الرد.
  • مختلف الأحداث يمكن أن تطلق بعد أكثر من هذه المراحل ، الاحتجاج المستمعين حسب الاقتضاء (مثل تغيير قيمة المستمعين بعد عملية التصديقات).

هذا هو نسخة مبسطة إلى حد ما من المناسبات.الرجوع إلى مواصفات لمزيد من التفاصيل.

أود السؤال لماذا الكتابة الخاصة بك UIComponent.هذا هو مهمة غير تافهة و فهم عميق JSF العمارة المطلوبة للحصول على ذلك الحق.إذا كنت بحاجة إلى التحكم المخصصة ، فمن الأفضل لإنشاء ملموسة التحكم الذي يمتد غير الموجودة UIComponent (مثل HtmlInputText لا) مع ما يعادل العارض.

إذا كان التلوث ليست قضية ، هناك مفتوح المصدر JSF التنفيذ في شكل أباتشي MyFaces.

نصائح أخرى

العمل المستمعين ، مثل CommandButton, وتسمى خلال استدعاء التطبيق المرحلة التي هي آخر مرحلة قبل النهائي تقديم استجابة المرحلة.هذا هو مبين في ال JSF دورة الحياة - الرقم 1.

هو الإطار الوحيد الذي كنت استخدمت من أي وقت مضى حيث عنصر الخلق عميقة معقدة مثل هذه العملية.لا أحد من الأطر ويب (سواء في .صافي العالم أو لا) جعل هذا مؤلم جدا ، وهو لا يمكن تفسيره تماما بالنسبة لي.

بعض قرارات التصميم خلف JSF البدء في جعل المزيد من الشعور عند النظر في الأهداف.JSF صمم ليكون مزخرف - فإنه يعرض الكثير من البيانات الوصفية عن ايديس.JSF ليس إطار الشبكة - هو MVP الإطار الذي يمكن أن تستخدم إطار الشبكة.JSF للغاية الموسعة و شكلي - يمكنك استبدال 90% من تنفيذ لكل تطبيق على حدة.

معظم هذه الاشياء فقط يجعل عملك أكثر تعقيدا إذا كان كل ما تريد القيام به هو الانزلاق في HTML إضافية التحكم.

المكون تكوين عدة inputtext (وغيرها) قاعدة مكونات راجع للشغل.

أفترض JSP-includes/الأدوات المستندة إلى صفحة أجزاء لا تلبي الاحتياجات الخاصة بك.

وأود أن تنظر في استخدام الخاص بك UIComponentELTag.createComponent لإنشاء مركب التحكم UIPanel قاعدة وخلق جميع الأطفال من القائمة تطبيقات.(أفترض أنك باستخدام ملفات jsp/taglibs و جعل بعض التخمينات أخرى.) ربما كنت ترغب في العرف العارض إذا كان أي من القائمة UIPanel عارضين العمل ، ولكن عارضين سهلة.

أفضل مقال وجدته هو Jsf عنصر الكتابة, أما بالنسبة 2 أين قرأت قيمة قيمة ملزمة في المكون الخاص بك لديك جالبة التي تبدو مثل هذا


public String getBar() {  
     if (null != this.bar) {  
         return this.bar ;  
     }  
     ValueBinding _vb = getValueBinding("bar");  
     return (_vb != null) ? (bar) _vb.getValue(getFacesContext()) : null;  
}
  

كيف هذا يحصل في getValueBinding?في الوسم الدرجة setProperties طريقة

  if (bar!= null) {  
         if (isValueReference(bar)) {  
             ValueBinding vb = Util.getValueBinding(bar);  
             foo.setValueBinding("bar", vb);  
         } else {  
             throw new IllegalStateException("The value for 'bar' must be a ValueBinding.");  
         }  
     }  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top