واجهات صغيرة
في مجال الحوسبة ، يُعدّ Facelets نظام قوالب ويب مفتوح المصدر مرخص بموجب رخصة Apache ، وهو تقنية معالجة العرض الافتراضية (أو لغة تعريف العرض) لـ Jakarta Faces (JSF؛ المعروف سابقًا باسم Jakarta Server Faces وJavaServer Faces). تتطلب هذه اللغة مستندات XML صالحة كمدخلات لكي تعمل. يدعم Facelets جميع مكونات واجهة المستخدم الخاصة بـ JSF ، ويركز بشكل كامل على بناء شجرة مكونات JSF، مما يعكس واجهة تطبيق JSF.
على الرغم من تحسين كل من تقنيات JSP و Faces للعمل معًا بشكل أفضل، إلا أن Facelets تتخلص من المشكلات المذكورة في مقالة هانز بيرجستين "تحسين JSF عن طريق التخلص من JSP" [ 1 ].
يستوحي Facelets بعض أفكاره من Apache Tapestry ، [ 2 ] [ 3 ] وهو مشابه له بما يكفي لإجراء مقارنة. يتشابه المشروع من حيث المفهوم مع Tapestry، الذي يتعامل مع كتل عناصر HTML كمكونات إطار عمل مدعومة بفئات Java. كما يتشابه Facelets مع إطار عمل Apache Tiles فيما يتعلق بدعم القوالب والتركيب.
تم إنشاء Facelets في الأصل بواسطة جاكوب هوكوم عام 2005 [ 3 ] كلغة تعريف عرض بديلة ومنفصلة لـ JSF 1.1 وJSF 1.2، حيث كان كلاهما يستخدم JSP كلغة تعريف عرض افتراضية. بدءًا من JSF 2.0، روجت مجموعة خبراء JSF لـ Facelets كلغة تعريف عرض افتراضية. تم إيقاف دعم JSP كلغة احتياطية قديمة. [ 4 ] [ 5 ]
تحويل العناصر
في Facelets، يمكن إدخال وسوم القوالب من مكتبة الوسوم بطريقتين: إما مباشرةً كعنصر مؤهل، xmlأو بشكل غير مباشر عبر jsfcالسمة الموجودة على عنصر غير مؤهل. في الحالة الأخيرة، سيتجاهل مُصرّف Facelets العنصر الفعلي، وسيتعامل مع العنصر كما لو كان العنصر المُحدد بواسطة jsfcالسمة.
يوضح المثال التالي الاستخدام المباشر للعلامات المؤهلة:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns= "http://www.w3.org/1999/xhtml" xmlns:h= "http://java.sun.com/jsf/html" > <body> <h:form> <h:outputText value= "مرحباً، #{loggedInUser.name}" disabled= "#{empty loggedInUser}" /> <h:inputText value= "#{bean.property}" /> <h:commandButton value= "موافق" action= "#{bean.doSomething}" /> </h:form> </body> </html>باستخدام هذه jsfcالخاصية، يمكن التعبير عن نفس الكود كما في المثال الموضح أدناه:
< ! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> < html xmlns = "http://www.w3.org/1999/xhtml" xmlns:h = "http://java.sun.com/jsf/html" > <body> < form jsfc = "h:form" > < span jsfc = "h:outputText" value = "مرحباً، #{loggedInUser.name}" disabled = "#{empty loggedInUser}" /> < input type = "text" jsfc = "h:inputText" value = "#{bean.property}" /> < input type = "submit" jsfc = "h:commandButton" value = "موافق" action = "" "#{bean.doSomething}" /> </ form > </ body > </ html >يمكن عرض الكود أعلاه في متصفح، وتعديله باستخدام أدوات تصميم WYSIWYG التقليدية . هذا غير ممكن عند استخدام الوسوم المؤهلة مباشرةً. مع ذلك، يُعدّ استخدام الوسوم المؤهلة مباشرةً الطريقة الأكثر شيوعًا لاستخدام Facelets عمليًا [ 6 ] ، وهو الأسلوب الأكثر استخدامًا في الكتب والأمثلة. [ 7 ] [ 8 ]
القوالب
توفر Facelets إمكانية إنشاء القوالب. [ 9 ] [ 10 ] يمكن لملف Facelets الإشارة إلى قالب رئيسي وتوفير محتوى للعناصر النائبة التي يُحددها هذا القالب الرئيسي. يُسمى الملف الذي يُشير إلى هذا القالب " عميل القالب" . ويمكن استخدام عملاء القوالب أنفسهم كقوالب لعملاء قوالب آخرين، وبالتالي يُمكن إنشاء تسلسل هرمي للقوالب.
يوضح ما يلي مثالاً على قالب رئيسي بسيط:
templates/master_template.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns= "http://www.w3.org/1999/xhtml" xmlns:h= "http://java.sun.com/jsf/html" xmlns:ui= "http://java.sun.com/jsf/facelets" ><h:head> <meta http-equiv= "content-type" content= "text/html;charset=UTF-8" /> <meta http-equiv= "pragma" content= "no-cache" /> </h:head><h:body> نص رأس الصفحة القياسي لكل صفحة .<ui:insert name= "body_content" />نص تذييل قياسي لكل صفحة . </h:body> </html>يحتوي الكود أعلاه على إطار HTML افتراضي وعنصر نائب واحد يُسمى body_content . يمكن لعميل القوالب استخدام هذا القالب على النحو التالي:
template_client.xhtml
<ui:composition template= "/templates/master_template.xhtml" xmlns= "http://www.w3.org/1999/xhtml" xmlns:ui= "http://java.sun.com/jsf/facelets" ><ui:define name= "body_content" > هذه صفحة عميل نموذجية تستخدم القالب الرئيسي . </ui:define> < / ui :composition>يستخدم الكود أعلاه القالب /templates/master_template.xhtmlويُوفّر محتوىً للعنصر النائب فيه. ستكون النتيجة النهائية صفحةً باسم template_client.xhtmlتحتوي على محتوى /templates/master_template.xhtml، ولكن مع <ui:insert name="body_content"/>استبدال بـ 'هذه صفحة عميل قالب تستخدم القالب الرئيسي'.
إعادة استخدام المحتوى
بالإضافة إلى القوالب، يوفر Facelets دعمًا لإعادة الاستخدام من خلال السماح للمستخدم بتضمين محتوى موجود في ملف مختلف. ويمكن تضمين هذا المحتوى بثلاث طرق مختلفة:
- الإشارة إلى ملف
- علامات مخصصة
- المكونات المركبة
الإشارة إلى ملف
أبسط طريقة لتضمين محتوى عنصر Facelet آخر هي الإشارة إليه بالاسم باستخدام الوسم <ui:include>. [ 11 ] [ 12 ] يؤدي هذا إلى تضمين محتوى الملف المشار إليه مباشرةً في عنصر Facelet المُستدعي بواسطة مُجمِّع Facelets. بالإضافة إلى إعادة استخدام المحتوى في مواقع متعددة، يُمكن استخدام هذه الطريقة لتقسيم عنصر Facelet كبير إلى أجزاء أصغر.
يوضح المثال التالي ما يلي:
templates/master_template.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns= "http://www.w3.org/1999/xhtml" xmlns:h= "http://java.sun.com/jsf/html" xmlns:ui= "http://java.sun.com/jsf/facelets" ><ui:include src= "html_head.xhtml" /><h:body> نص رأس الصفحة القياسي لكل صفحة .<ui:insert name= "body_content" />نص تذييل قياسي لكل صفحة . </h:body> </html>html_head.xhtml
<ui:composition xmlns= "http://www.w3.org/1999/xhtml" xmlns:h= "http://java.sun.com/jsf/html" ><h:head> <meta http-equiv= "content-type" content= "text/html;charset=UTF-8" /> <meta http-equiv= "pragma" content= "no-cache" /> </h:head> </ui:composition>علامات مخصصة
تدعم Facelets خاصية تضمين المحتوى عبر الوسوم المخصصة. [ 13 ] يمكن ربط هذا الوسم المخصص بـ Facelet في ملف taglib. وسيتم استبدال أي ظهور لهذا الوسم بمحتوى Facelet المرتبط به.
يوضح المثال التالي ذلك:
templates/master_template.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns= "http://www.w3.org/1999/xhtml" xmlns:h= "http://java.sun.com/jsf/html" xmlns:ui= "http://java.sun.com/jsf/facelets" xmlns:my= "http://example.com/my" ><ui:include src= "html_head.xhtml" /><h:body> نص رأس الصفحة القياسي لكل صفحة . <my:spacer><ui:insert name= "body_content" />نص تذييل قياسي لكل صفحة . </h:body> </html>يستخدم الكود أعلاه الوسم <my:spacer>لتحديد النقطة في واجهة المستخدم حيث سيتم إدراج المحتوى. يجب تعريف هذا الوسم في ملف Taglib حيث يمكن ربطه بواجهة المستخدم كما يلي:
مثال.taglib.xml
<?xml version="1.0" encoding="UTF-8"?> <facelet-taglib xmlns= "http://java.sun.com/xml/ns/javaee" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" version= "2.0" ><namespace> http://example.com/my </namespace><tag> <tag-name> spacer </tag-name> <source> spacer.xhtml </source> </tag> </facelet-taglib>يوضح المثال التالي كيف يمكن أن يبدو المحتوى الفعلي لـ Facelet:
spacer.xhtml
<ui:composition xmlns= "http://www.w3.org/1999/xhtml" xmlns:ui= "http://java.sun.com/jsf/facelets" xmlns:h= "http://java.sun.com/jsf/html" ><h:outputText value= " " escape= "false" /> </ui:composition>المكونات المركبة
إلى جانب تضمين المحتوى مباشرةً، توفر Facelets آلية المكونات المركبة التي تجعل المحتوى متاحًا كمكون JSF أساسي. [ 14 ] [ 15 ] لا يلزم تعريف المكونات المركبة في ملف Taglib، بل يجب وضعها في دليل خاص. وبحسب الاصطلاح، يُخصص للمحتوى تلقائيًا مساحة اسم واسم وسم. تتكون مساحة الاسم من السلسلة الثابتة ' http://java.sun.com/jsf/composite/' متبوعةً باسم الدليل الذي يوجد فيه ملف المحتوى بالنسبة إلى دليل 'resources'. [ 16 ] يصبح اسم الوسم هو اسم الملف بدون لاحقة .xhtml.
يوضح المثال التالي ذلك:
resources/my/spacer.xhtml
<ui:composition xmlns= "http://www.w3.org/1999/xhtml" xmlns:ui= "http://java.sun.com/jsf/facelets" xmlns:h= "http://java.sun.com/jsf/html" xmlns:cc= "http://java.sun.com/jsf/composite" > <cc:interface/> <cc:implementation> <h:outputText value= "" escape= "false" /> </cc:implementation> </ui:composition>تتوفر واجهة المستخدم المذكورة أعلاه تلقائيًا كمكون في مساحة الاسم 'http://java.sun.com/jsf/composite/my' واسم الوسم 'spacer'.
تتضمن المعلمات
لتخصيص المحتوى المُضمّن، تسمح Facelets باستخدام المعلمات. من خلال هذه المعلمات، يمكن تمرير الكائنات إلى المحتوى المُضمّن، حيث يمكن استخدامها كمتغيرات. بالنسبة للآلية <ui:include>المستخدمة <ui:param>لهذا الغرض، [ 17 ] ، بينما بالنسبة للعلامات المخصصة والمكونات المركبة، يمكن استخدام سمات العلامات العادية. تتطلب المكونات المركبة تعريف المعلمات في قسم واجهتها، [ 18 ] بينما لا يوجد مثل هذا الشرط بالنسبة للعلامات المخصصة، وتُتاح القيم المُقدمة للسمات العشوائية كمتغيرات تحمل نفس اسم السمة.
انظر أيضاً
مراجع
- ↑ بيرغستن، هانز (9 يونيو 2004). "تحسين JSF عن طريق الاستغناء عن JSP" . ONJava . O'Reilly Media . مؤرشف من الأصل في 5 أبريل 2018.
- ↑ "Facelets: JavaServer Faces View Definition Framework" . java.net . مؤرشف من الأصل بتاريخ 31-12-2016.
- 1 2 هوكوم، جاكوب (17 أغسطس 2005). "داخل الوجوه الصغيرة الجزء 1: مقدمة" . JSFCentral . مؤرشف من الأصل في 2020-01-05.
- ↑ بيرنز، إد؛ شالك، كريس (2009). جافا سيرفر فيسز 2.0، المرجع الكامل . ماكجرو هيل . ISBN 978-0-07-162509-8ص 55:
قررت مجموعة الخبراء المضي قدماً باستخدام Facelets كأساس للميزات الجديدة مع السماح لـ JSP بالبقاء كطبقة توافق مع الإصدارات السابقة.
- ↑ بيرنز، إد؛ كيتاين، روجر، محرران. (8 نوفمبر 2010). مواصفات JavaServer Faces، الإصدار 2.1 . JCP (تقرير فني) ( إصدار MR2). أوراكل . JSR-314. ص 10-1:
Facelets هو بديل لـ JSP، وقد صُمم منذ البداية مع مراعاة JSF. الميزات الجديدة المُقدمة في الإصدار 2 والإصدارات اللاحقة متاحة فقط لمؤلفي الصفحات الذين يستخدمون Facelets. تم الاحتفاظ بـ JSP للتوافق مع الإصدارات السابقة.
- ↑ "أحدث أسئلة حول 'jsf'" . stackoverflow.com . تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ JavaServer Faces 2.0، المرجع الكامل من تأليف إد بيرنز وكريس شالك
- ↑ كتاب "Core JavaServer Faces" (الطبعة الثالثة) من تأليف ديفيد جيري وكاي إس. هورستمان
- ↑ "JSF 2 fu، الجزء 2: القوالب والمكونات المركبة" . ibm.com . 2 يونيو 2009. تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ "واجهة المستخدم (لغة تعريف صفحات JSF 2.0: متغير Facelets)" . oracle.com . تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ "include (JSF 2.0 Page Decraration Language: Facelets Variant)" . oracle.com . تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ "بعض الأمور التي يجب تذكرها: استخدام Facelets ui:include يُعتبر قويًا" . pilhuhn.blogspot.com . 4 ديسمبر 2009. تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ "مكونات JSF مخصصة باستخدام Facelets" . wordpress.com . 29 فبراير 2008. مؤرشف من الأصل في 19 أكتوبر 2016. تم الاطلاع عليه في 22 نوفمبر 2016 .
- ↑ "composite(JSF 2.0 Page Decraration Language: Facelets Variant)" . oracle.com . تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ "ما الجديد في JSF 2؟" . wordpress.com . 31 يوليو 2009. تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ JSR 314، 10.3.3.1، http://jcp.org/en/jsr/detail?id=314
- ↑ "param(JSF 2.0 Page Decraration Language: Facelets Variant)" . oracle.com . تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
- ↑ "واجهة (لغة تعريف صفحات JSF 2.0: متغير Facelets)" . oracle.com . تم الاطلاع عليه بتاريخ 22 نوفمبر 2016 .
فهرس
- واديا، زوبين؛ مارينشيك، مارتن؛ صالح، حازم؛ بيرن، دينيس (22 سبتمبر 2008). الدليل الشامل لبرنامجي Apache MyFaces وFacelets ( الطبعة الأولى). دار نشر Apress . صفحة 400. ISBN 978-1-59059-737-8أُرشف من الأصل في 2 يناير 2010. تم الاطلاع عليه في 4 سبتمبر 2009 .
- واديا، زوبين؛ أراندا، برونو (26 مايو 2008). أساسيات Facelets: دليل إطار عمل تعريف عرض JavaServer Faces ( الطبعة الأولى). Apress . ص 84. ISBN 978-1-4302-1049-8أُرشف من الأصل في 8 يناير 2010. تم الاطلاع عليه في 4 سبتمبر 2009 .
روابط خارجية
- " مقدمة إلى Facelets " الفصل الثامن من دليل جاكرتا للهندسة الكهربائية
- وثائق مطوري Facelets على موقع Wayback Machine (تمت أرشفة بتاريخ 31-12-2016)
- هايتاور، ريتشارد (21 فبراير 2006). "Facelets تتناسب مع JSF تمامًا" . جافا. ديفيلوبر وركس . آي بي إم . مؤرشف من الأصل في 24 فبراير 2021.
- الصفحة الرئيسية لـ Facelets على موقع Wayback Machine (تمت أرشفة بتاريخ 2017-04-04)
- جافا (لغة برمجة)
