لقد تحسنت لغة Java تدريجيًا في السنوات الأخيرة مع إطلاق Java SE 5 وJava SE 6، أصبح مستقبل Java أكثر إشراقًا. ومع ذلك، لم يتمكن JSP المستند إلى Java من رفع رأسه قبل إطلاق Java SE 5. السبب الأكثر أهمية هو أنه على الرغم من أن JSP قوي جدًا، إلا أن أكبر ميزة له هي أيضًا أكبر عيوبه، حيث أن الوظائف القوية تعني التعقيد، خاصة أن هناك لا يوجد الكثير من الأدوات المرئية لتصميم الواجهات الأمامية، كما أنها ليست قوية بما يكفي. لذلك، يصبح تصميم صفحات JSP معقدًا ومرهقًا للغاية...
لقد تحسنت لغة Java تدريجيًا في السنوات الأخيرة مع إطلاق Java SE 5 وJava SE 6، أصبح مستقبل Java أكثر إشراقًا. ومع ذلك، لم يتمكن JSP المستند إلى Java من رفع رأسه قبل إطلاق Java SE 5. السبب الأكثر أهمية هو أنه على الرغم من أن JSP قوي جدًا، إلا أن أكبر ميزة له هي أيضًا أكبر عيوبه، حيث أن الوظائف القوية تعني التعقيد، خاصة أن هناك لا يوجد الكثير من الأدوات المرئية لتصميم الواجهات الأمامية، كما أنها ليست قوية بما يكفي. لذلك، يصبح تصميم صفحات JSP معقدًا ومرهقًا للغاية. ومع ذلك، في نفس الوقت الذي تم فيه إطلاق Java SE 5، أطلقت Sun مواصفات JavaServer Faces جديدة (JSF للاختصار) من أجل تبسيط تطوير JSP. وهذا يضع JSP على الطريق المشرق.
1. ما هو
JSF وJSP زوجان جديدان؟ JSP هي تقنية تستخدم لمعالجة المنطق في الخلفية، في حين أن JSF هي على العكس تمامًا، وهي تقنية تمكن المطورين من تطوير تطبيقات الويب المستندة إلى Java بسرعة، وهي تقنية طبقة العرض التقديمي. حاليًا، تمت إضافة JSF1.2 رسميًا إلى Java EE 5 كمعيار.
باعتبارها تقنية عالية المكونات، يمكن للمطورين تنفيذ عمليات التحرير بالسحب والإفلات بدعم من بعض أدوات التطوير، ويحتاج المستخدمون فقط إلى سحب مكونات JSF إلى الصفحة لإجراء تطوير الويب بسهولة. هذه هي أكبر فائدة لها باعتبارها تقنية مكونة. المكونات التي يمكننا استخدامها ليست مجرد مربعات إدخال بسيطة نسبيًا، ولكنها أيضًا مكونات أكثر تعقيدًا، مثل مكونات الجدول مثل مكونات DataTable، مثل Tree وما إلى ذلك.
باعتبارها تقنية قياسية، يتم دعم JSF أيضًا من قبل عدد لا بأس به من موفري الأدوات. في الوقت نفسه، سيكون لدينا أيضًا العديد من أدوات التطوير المجانية الجيدة المتاحة. منذ وقت ليس ببعيد، تم إصدار Sun Java Studio Creator 2 وOracle JDeveloper 10g كأدوات تطوير مجانية تدعم JSF، مما جلب الكثير من الحيوية إلى JSF. بالإضافة إلى ذلك، لدينا أيضًا بعض أدوات التطوير التجارية الممتازة للاختيار من بينها، وقد وفرت أدوات تطوير المكونات الإضافية المستندة إلى Eclipse مثل BEA Workshop (المعروفة سابقًا باسم M7 NitroX)، وExadel، وMyEclipse راحة كبيرة لغالبية مستخدمي Eclipse الحاليين يعد مطور التطبيقات العقلانية وJBuilder من Borland أيضًا أدوات تطوير تجارية جيدة جدًا تدعم التطوير المرئي لـ JSF.
تختلف JSF بشكل أساسي عن تقنية الويب التقليدية، حيث تتطلب تقنية الويب التقليدية من المستخدمين التقاط طلبات المتصفح، وحفظ حالة العميل، والتحكم يدويًا في إعادة توجيه الصفحة، وما إلى ذلك. لا شك أن ظهور JSF قد جلب لنا راحة كبيرة، حيث يوفر JSF نموذجًا للتنقل بين الصفحات يعتمد على الأحداث، مما يمكّن مطوري التطبيقات من تصميم تدفق صفحات التطبيقات. كما هو الحال مع أسلوب Struts، يتم تعريف كافة معلومات تدفق الصفحة في ملف XML لتكوين JSF (faces-config.xml) بدلاً من ترميزها بشكل ثابت في التطبيق. وهذا يبسط إلى حد كبير صعوبة التطوير للمطورين ويبسط تطوير التطبيقات.
في الوقت نفسه، يعد JSF أيضًا إطارًا يتبع نمط التحكم في عرض النموذج (MVC). إنه يحقق الفصل الكامل بين رمز العرض (عرض) ومنطق التطبيق (النموذج)، مما يسمح للتطبيقات التي تستخدم تقنية JSF بتحقيق فصل جيد بين الصفحات والتعليمات البرمجية. ستتم معالجة جميع طلبات صفحات JSF من خلال وحدة التحكم الأمامية (FacesServlet). يقوم النظام تلقائيًا بمعالجة طلب المستخدم وإرجاع النتيجة إلى المستخدم. هذا لا يختلف كثيرًا عن إطار عمل MVC التقليدي.
لا يستخدم JSF تقنية POJO فحسب، بل يستخدم أيضًا تقنية انعكاس التحكم (IoC) (أو حقن التبعية-DI) الشبيهة بالزنبرك في Backing Bean لـ JSF، يمكننا وضع البيانات والعمليات التي يتطلبها العرض في Backing Bean . في الوقت نفسه، بفضل تقنية DI التي تستخدمها JSF، يمكننا تهيئة Managed Bean في ملف التكوين. وفي الوقت نفسه، يمكننا أيضًا استخدام هذه التقنية للتكامل بسهولة مع Spring، الذي يستخدم تقنية مماثلة.
2. كيفية استخدام JSF في JSP
يمكن لـ JSF أن يمارس تأثيره بالكامل فقط من خلال دمجه مع JSP. تم دمج JSF من خلال مكتبات العلامات وJSP. مكتبة العلامات تعادل مكون جانب الخادم لـ ASP.NET. يوفر JSF مكتبة علامات غنية جدًا، يمكن من خلالها إنشاء نماذج عملاء مختلفة، مثل HTML وWML وXML وJavaScript. من خلال هذه العلامات، يمكنك بسهولة إنشاء نماذج عملاء واسعة النطاق والتعامل تلقائيًا مع طلبات العملاء من خلال هذه العلامات.
دعونا بعد ذلك نلقي نظرة على مثال لكيفية جعل JSF وJSP يعملان معًا. هناك مكتبتان في JSF. الأول يسمى مكتبة النواة، والذي يحتوي على العديد من العلامات الرئيسية، مثل تكوين المكونات، وإدارة الأحداث، والتحقق من صحة معلومات الإدخال، وما إلى ذلك. وتتمثل الوظيفة الرئيسية للمكتبة الثانية في التوافق مع علامات HTML وJSF المختلفة. تتوافق كل علامة JSF مع مكون HTML. على سبيل المثال، تتوافق علامة UIInput مع مربع النص أو مربع كلمة المرور في HTML.
يُطلق على مربع إدخال النص في علامة JSF اسم inputText، وتسمى مكتبة إدخال كلمة المرور inputSecret. فيما يلي برنامج واجهة مستخدم بسيط يجمع بين JSF وJSP.
<%@ taglib uri=" http://java.sun.com/jsf/html " prefix="h" %>
<%@ taglib uri=" http://java.sun.com/jsf/core " بادئة ="f" %>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">
<title> أول برنامج JSF </title>
</head >
<body>
<f:view>
<h:form id="simpleForm">
<h:outputText id="favoriteLabel" value="الرجاء إدخال رقم:"/>
<h:inputText id="favoriteValue" value= " #{simple.longValue}">
<f:validateLongrangeأقصى = "30" الحد الأدنى = "0"/>
</h:inputText>
<p/>
<h:commandButton id="submit" value="Submit" action = "#{simple.simpleActionMethod}"/>
</h:form>
</f:view>
</body>
</html>
في الكود أعلاه، يمكننا فهم كيفية دمج JSF مع JSP. يمكننا أولاً رؤية تسمية النواة: عرض. ثم هناك العديد من مكونات JSF. مثل النموذج وoutputText وinputText وcommandButton. يتم وضع هذه المكونات في النموذج وتصبح جزءًا من النموذج. في بداية البرنامج، يجب استيراد مكتبتين للعلامات باستخدام الاستيراد. الرمز هو كما يلي.
<%@ taglib uri=" http://java.sun.com/jsf/html " prefix="h" %>
<%@ taglib uri=" http://java.sun.com/jsf/core " بادئة ="f" %>
يوضح السطران أعلاه من التعليمات البرمجية مكتبة علامات JSF التي سيتم استخدامها في JSP. يتم الإعلان عن مكتبة النواة بالبادئة f، بينما يتم الإعلان عن مكتبة HTML بالبادئة h. هاتان البادئتان غير مطلوبتين، لكنهما مجرد اقتراح. في البرنامج يجب استخدام مكتبة النواة، لأنه يجب استخدام العرض في جميع صفحات JSF. تقوم علامة HTML بتحويل علامة JSF إلى مكون HTML في وقت التشغيل. هذه البادئة h ليست ضرورية، ولكنها موصى بها بواسطة مواصفات JSF، وبهذه الطريقة، نجعل برنامج JSF الخاص بنا أكثر قابلية للقراءة.
بعد الإعلان توجد عدة أسطر من عبارات HTML القياسية، والتي لن يتم وصفها بالتفصيل في هذه المقالة. بدءًا من <f:view>، فهو عبارة عن عبارة JSF. هذا الرمز هو كما يلي:
<f:view>
<h:form id="simpleForm">
<h:outputText id="favoriteLabel" value="الرجاء إدخال رقم:"/>
<h:inputText id="favoriteValue " value="#{simple.longValue}">
<f:validateLongrange الحد الأقصى = "30" الحد الأدنى = "0"/>
</h:inputText>
<p/>
<h:commandButton id="submit" value=" إرسال "
action="#{simple.simpleActionMethod}"/>
</h:form>
</f:view>
</f:view> تبشر العلامة ببداية JSF، وسيقوم نموذج العلامة التالي الخاص بها بإنشاء نموذج HTML. علامة OutputText تعادل مكون التسمية في HTML. علامة inputText تعادل مكون textField في HTML. علامة CommandButton تعادل زر الإرسال في HTML. عند تشغيل برنامج JSP هذا، سوف تحصل على التأثير الموضح في الشكل 1.
3. كيف يستجيب JSP لطلبات JSF؟
من المثال أعلاه، نحن نعرف بالفعل كيفية استخدام JSF في JSP. في هذا الجزء، دعونا نلقي نظرة على كيفية معالجة الطلبات في JSF.
دعونا أولاً نلقي نظرة على مثال لتحويل فهرنهايت إلى درجة مئوية. سيقوم البرنامج بالانتقال عندما ينقر المستخدم على زر الإرسال.
<%@ taglib uri=" http://java.sun.com/jsf/html " prefix="h" %>
<%@ taglib uri=" http://java.sun.com/jsf/core " بادئة ="f" %>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">
<title> برنامج تحويل درجة الحرارة</title>
</head>
< body>
<f:view>
<h:form>
<div>
<h:outputText id="fahrenheitLabel" value="الرجاء إدخال درجة الحرارة فهرنهايت:"/>
<span>
<h:inputText id="temperature" value= " #{tc.fahrenheitTemp}">
<f:validateDoublerange الحد الأدنى = "-100.0" الحد الأقصى = "100.0"/>
<f:valuechangeListener type="tempconv.page.TCChangedListener"/>
</h:inputText>
</span >
</div>
<div>
<h:outputText id="celsiusLabel" value="درجة الحرارة المئوية:"/>
<span>
<h:outputText id="celsiusValue" value="#{tc.celsiusTemp}">
< f :convertNumber maxFractionDigits="3" type="number"/>
</h:outputText>
</span>
</div>
<div>
<h:commandButton value="Convert" action="#{tc.convert} " >
</h:commandButton>
</div>
</h:form>
</f:view>
</body>
</html>
في أول سطرين من البرنامج، يتم استيراد مكتبة JSF الأساسية ومكتبة HTML وقد تم ذلك من قبل ولن يتم مناقشته بالتفصيل هنا.
دعونا نلقي نظرة على كيفية تفاعل علامات JSF مع الواجهة الخلفية. نظرًا لأننا نستخدم JSF في JSP، فلا يوجد فرق بين هذا وJSP العادي؛ في الواقع، عندما يتم تشغيل JSP لأول مرة، يقوم مترجم JSP بتجميع ملف .JSP في Servlet ثم يستدعيه. ثم يتلقى Servlet دفق البيانات من العميل. ولكن على عكس برامج JSP العادية، يتم استدعاء علامات JSF بواسطة واجهة برمجة تطبيقات JSF (وهذا يسمح بفصل الطبقة المنطقية وطبقة العرض).
عندما تتلقى علامة UIComponent طريقة doStartTag، سيستخدم JSF هذه الخصائص لتعيين قيمة العلامة. على سبيل المثال، سيتم تعيين علامة inputText في هذا المثال وفقًا لقيمة السمة الخاصة بها. يوجد أدناه مقتطف الكود من JSF.
<h:inputText id="temperature" value="#{tc.fahrenheitTemp}">
<f:validateDoublerange low = "-100.0" الحد الأقصى = "100.0"/>
<f:valuechangeListener type="tempconv.page.TCChangedListener" />
</h:inputText>
تقوم علامة inputText بتعيين سمات المعرف والقيمة وفقًا للقيم المقابلة. في JSF، يتم تعيين كل قيمة سمة من خلال setAttribute(اسم السلسلة، قيمة الكائن). ولكن ما نحتاج إلى ملاحظته هو أن علامات JSF يمكنها تحديد القيم الافتراضية المقابلة. وهذا يشبه إلى حد ما خصائص النظام في Java. إذا قمت بإعطاء اسم خاصية، فسيقوم النظام بإرجاع قيمة الخاصية. إذا قمت بتحديد قيمتها الافتراضية وكانت الخاصية غير موجودة، فسيتم إرجاع القيمة الافتراضية.
بعد ذلك، دعونا نلقي نظرة على الجزء الأكثر أهمية في البرنامج أعلاه، وهو معالجة الحدث لمكون UIInput.
<f:valuechangeListener type="tempconv.page.TCChangedListener"/>
في JSF، تكتمل معالجة الأحداث بواسطة علامة valuechangeListener. يقوم الحدث الذي تمثله هذه التسمية بتشغيل حدث عندما تتغير قيمة مربع النص. ولكن المثير للاهتمام هو أن هذا الحدث لا يتم إرساله على الفور، وبدلاً من ذلك، لا يتم إرسال الحدث والبيانات المقابلة إلى الواجهة الخلفية حتى ينقر المستخدم على زر "إرسال". لذلك، يُطلق على طلب الحدث هذا أيضًا اسم الالتزام المسبق. أخيرًا، دعونا نلقي نظرة على تنفيذ التعليمات البرمجية لـ UICommand.
<div>
<h:commandButton value="Conversion" action="#{tc.convert}">
</h:commandButton>
</div>
الكود أعلاه يربط طريقة التحويل () وUICommand، وهذا يعني، بعد النقر على زر "إرسال"، سيتم تنفيذ طريقة التحويل (). بعد مواجهة علامة العرض، ينتج برنامج JSF، ويستدعي JSFAPI أخيرًا طريقة doEnd لإنهاء برنامج JSF. بعد تحليل هذا البرنامج، يقوم محرك JSF بتحويل علامات JSF المقابلة إلى مكونات HTML.
أخيرًا، دعونا نلقي نظرة على كيفية استجابة JSP لأحداث JSF. يوجد أدناه جزء من كود Java الذي يستجيب لأحداث JSF.
public class TCChangedListener Implements ValueChangeListener
{
public TCChangedListener()
{
super
();
}
// التعامل مع الحدث
public voidprocessValueChange(ValueChangeEvent events)
throws AbortProcessingException
{
UIComponent comp = events.getComponent()
;
null != value)
{
float curVal = ((Number) value).floatValue();
قيم الخريطة = comp.getAttributes();
if (curVal < 0)
{
values.put("styleClass", "red") }
else
{
values.put("styleClass", "black" }
}
}
للرد
على أحداث JSF،يجب
عليك تنفيذ واجهة ValueChangeListener في مكتبة JSF. ما يجب ملاحظته في البرنامج أعلاه هو أنه يتم ضبط اللون المقابل أخيرًا وفقًا لقيمة الإدخال. هذه القيم لا تعتمد على JSP. بالطبع، يمكنك أيضًا تعيينها على أنها خالية والسماح لعلامات JSP بتعيين ألوانها.