8. مكتبة العلامات JSTL
8.0.1. مقدمة
لننظر إلى العرض [erreurs.jsp] الذي يعرض قائمة بالأخطاء:

هناك عدة طرق لكتابة مثل هذه الصفحة. نحن مهتمون هنا فقط بجزء عرض الأخطاء. الحل الأول هو استخدام كود Java كما تم:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page import="java.util.ArrayList" %>
<%
// استرداد بيانات النموذج
ArrayList erreurs=(ArrayList)request.getAttribute("erreurs");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<%
for(int i=0;i<erreurs.size();i++){
out.println("<li>" + (String) erreurs.get(i) + "</li>\n");
}//for
%>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
<%= lienRetourFormulaire %>
</a>
</body>
</html>
تسترد الصفحة JSP قائمة الأخطاء في الطلب (السطر 8) وتعرضها باستخدام حلقة Java (الأسطر 19-23). تخلط الصفحة بين كود HTML وكود Java، مما قد يشكل مشكلة إذا كان يجب صيانة الصفحة بواسطة مصمم جرافيك الذي عادةً ما لا يفهم كود Java. لتجنب هذا الخلط، نستخدم مكتبات العلامات التي ستوفر إمكانيات جديدة للصفحات JSP. باستخدام مكتبة العلامات JSTL (مكتبة العلامات القياسية لـ Java)، تصبح العروض السابقة كما يلي:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
العلامة (السطر 4)
يشير إلى استخدام مكتبة علامات يوجد تعريفها في الملف [/WEB-INF/c.tld]. سيتم استخدام هذه العلامات في كود الصفحة، مسبوقة بالبادئة c (prefix="c"). يمكن استخدام أي بادئة من اختيارك. هنا c تعني [core]. تسمح البادئات باستخدام مكتبات العلامات التي قد تحمل أسماء متطابقة لبعض العلامات. ويؤدي استخدام البادئة إلى إزالة الغموض. لم يعد للصفحة الجديدة كود Java في المكانين اللذين كانا موجودين فيهما سابقًا:
- استرداد نموذج الصفحة [erreurs, lienRetourFormulaire] (الجزء الذي اختفى)
- عرض قائمة الأخطاء (الأسطر 13-15)
تم استبدال حلقة عرض الأخطاء بالرمز التالي:
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
- تُستخدم العلامة <forEach> لتحديد حدود الحلقة
- يستخدم الترميز ${variable} لكتابة قيمة متغير
تحتوي العلامة <forEach> هنا على سمتين:
- items="${erreurs}" تشير إلى مجموعة الكائنات التي يجب التكرار عليها. هنا، المجموعة هي الكائن erreurs. أين يوجد هذا الكائن؟ تبحث الصفحة JSP عن سمة تسمى "erreurs" بالتتابع وبالترتيب في:
- الكائن [request] الذي يمثل الطلب المرسل من قبل وحدة التحكم: request.getAttribute("erreurs")
- الكائن [session] الذي يمثل جلسة عمل العميل: session.getAttribute("erreurs")
- الكائن [application] الذي يمثل سياق تطبيق الويب: application.getAttribute("أخطاء")
يمكن أن تتخذ المجموعة المشار إليها بالسمة items أشكالاً مختلفة: tableau، ArrayList، كائن ينفذ الواجهة List، ...
- يُستخدم var="erreur" لتسمية العنصر الحالي في المجموعة قيد المعالجة. سيتم تنفيذ الحلقة <forEach> تباعًا لكل عنصر في المجموعة items. داخل الحلقة، سيتم الإشارة إلى عنصر المجموعة قيد المعالجة هنا بـ error.
تقوم الترميز ${erreur} بإدراج قيمة المتغير erreur في النص. هذا المتغير ليس بالضرورة سلسلة أحرف. تستخدم JSTL الطريقة erreur.toString() لإدراج قيمة المتغير erreur. بدلاً من الترميز ${erreur}، يمكن أيضًا استخدام العلامة <c:out value="${erreur}"/>.
لنعد إلى مثالنا الخاص بعرض الأخطاء:
- سيقوم وحدة التحكم بإدراج ArrayList من رسائل الخطأ في الطلب المرسَل إلى الصفحة JSP، وبالتالي ArrayList من كائنات String: request.setAttribute("erreurs",erreurs) حيث erreurs هو ArrayList؛
- بسبب السمة items="${erreurs}"، ستبحث الصفحة JSP عن سمة تسمى erreurs، بالتتابع في الاستعلام، والجلسة، والتطبيق. وستجده في الطلب: request.getAttribute("erreurs") سيعرض ArrayList الذي وضعه المتحكم في الطلب؛
- وبالتالي فإن المتغير erreur الخاص بالسمة var="erreur" سيشير إلى العنصر الحالي لـ ArrayList، أي كائن String. ستقوم الطريقة erreur.toString() بإدراج قيمة هذا String، وهي هنا رسالة خطأ، في تدفق HTML للصفحة.
قد تكون الكائنات في المجموعة التي تعالجها العلامة <forEach> أكثر تعقيدًا من مجرد سلاسل أحرف. لنأخذ مثالًا لصفحة JSP تعرض قائمة بالمقالات:
حيث [listarticles] هو ArrayList من كائنات من النوع [Article] التي نفترض أنها Javabean مع الحقول [id, nom, prix, stockActuel, stockMinimum]، كل حقل من هذه الحقول مصحوب بأساليب get و set الخاصة به. تم وضع الكائن [listarticles] في الاستعلام بواسطة وحدة التحكم. ستقوم الصفحة JSP السابقة باسترداده في السمة items لعلامة forEach. وبالتالي، يشير الكائن الحالي article (var="article") إلى كائن من النوع [Article]. لننظر إلى العلامة في السطر 3:
ماذا يعني ${article.nom}؟ في الواقع، يعني أشياء مختلفة حسب طبيعة الكائن article. للحصول على قيمة article.nom، ستحاول الصفحة JSP أمرين:
- article.getNom() - لاحظ التهجئة getNom لاسترداد حقل الاسم (معيار Javabean)
- article.get("name")
يمكن أن يكون الكائن [article] إذن حبة (bean) ذات حقل اسم، أو قاموسًا بمفتاح اسم.
لا توجد حدود لتسلسل الكائن المعالج. وبالتالي فإن العلامة
معالجة كائن [individu] من النوع التالي:
class Individu{
private String nom;
private String prénom;
private Individu[] enfants;
// طرق معيار Javabean
public String getNom(){ return nom;}
public String getPrénom(){ return prénom;}
public Individu getEnfants(int i){ return enfants[i];}
}
للحصول على قيمة ${individu.enfants[1].nom}، ستجرب الصفحة JSP طرقًا مختلفة، منها الطريقة التالية التي ستنجح:
individu.getEnfants(1).getNom() حيث يشير individu إلى كائن من نوع Individu.
8.0.2. تثبيت مكتبة JSTL واكتشافها
التفسيرات الواردة سابقًا كافية للتطبيق الذي يهمنا، لكن مكتبة العلامات JSTL توفر علامات أخرى غير تلك المعروضة. لاكتشافها، يمكن تثبيت البرنامج التعليمي المرفق في حزمة المكتبة.
سنستخدم التنفيذ JSTL 1.1 لمشروع [Jakarta Taglibs] المتاح على الرابط [http://jakarta.apache.org/taglibs/] (مايو 2006):
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
يحتوي ملف zip الذي تم تنزيله على محتوى مشابه لما يلي:

الملفان اللذان يحملان الامتداد .war هما أرشيفان لتطبيقات الويب:
- standard-doc: وثائق حول العلامات JSTL
- standard-examples: أمثلة على استخدام العلامات
سنقوم بنشر هذا التطبيق الأخير داخل Tomcat. نطلق هذا الأخير عبر الخيار المناسب من القائمة [Démarrer] ثم نطلب عنوان URL [http://localhost:8080] ونتبع الرابط [Tomcat Manager]:

نحصل عندئذٍ على صفحة مصادقة. نقوم بتسجيل الدخول باسم manager / manager أو admin / admin، كما هو موضح في الفقرة 2.3.3.

نحصل على صفحة تسرد التطبيقات المنشورة حاليًا في Tomcat:

يمكننا إضافة تطبيق جديد باستخدام النماذج الموجودة أسفل الصفحة:

نستخدم الزر [Parcourir] لتحديد ملف .war لنشره.

لا تظهر لقطة الشاشة ذلك، لكننا حددنا الملف [standard-examples.war] من التوزيع JSTL الذي تم تنزيله. يقوم الزر [Deploy] بحفظ هذا التطبيق ونشره داخل Tomcat.

تم نشر التطبيق [/standard-examples] بنجاح. نقوم بتشغيله:

يُطلب من القارئ اتباع الروابط المختلفة المتوفرة في هذه الصفحة عند البحث عن أمثلة لاستخدام العلامات JSTL.
يمكن نشر التطبيق [standard-doc] بنفس الطريقة من الملف [standard-doc.war]. يتيح هذا التطبيق الوصول إلى معلومات تقنية إلى حد ما حول المكتبة JSTL. وهو أقل أهمية للمبتدئين.
8.0.3. استخدام JSTL في تطبيق ويب
في الأمثلة المرفقة مع مكتبة JSTL 1.2، تحتوي صفحات JSP في بداية الملف على العلامة التالية:
لقد سبق أن تناولنا هذه العلامة في الفقرة 8.1.1، وقدمنا شرحًا موجزًا لها:
- [uri]: URI (معرف الموارد الموحد) حيث نجد تعريف العلامات المستخدمة في الصفحة. سيتم استخدام هذا URI من قبل خادم الويب عندما يتم ترجمة الصفحة JSP إلى كود Java لتصبح سيرفلت. كما يتم استخدامه من قبل أدوات تطوير صفحات الويب للتحقق من صحة بناء جملة العلامات المستخدمة في الصفحة أو لتقديم المساعدة أثناء الكتابة. عند البدء في كتابة علامة، يمكن لأداة تعرف المكتبة أن تقترح على المستخدم السمات الممكنة لهذه العلامة.
- [prefix]: البادئة التي تحدد هذه العلامات في الصفحة
لا يمكن استخدام عنوان URI [http://java.sun.com/jsp/jstl/core] إذا لم تكن متصلاً بشبكة الإنترنت العامة. في هذه الحالة، يمكن وضع ملف تعريف العلامات محلياً. يتم توفير العديد من هذه الملفات مع توزيع JSTL 1.2 في المجلد [tld] (تعريف لغة العلامات):

JSTL هو في الواقع مجموعة من مكتبات العلامات. لن نستخدم سوى مكتبة [c.tld] المعروفة باسم مكتبة "core". سنضع الملف [c.tld] أعلاه في المجلد [WEB-INF] لتطبيقاتنا:
![]()
وسنضع العلامة التالية في صفحاتنا JSP لإعلان استخدام المكتبة "core":
إذا كان استخدام مكتبات العلامات يسمح لنا بتجنب وضع كود Java في الصفحات JSP، فإن هذه العلامات تُترجم بالطبع إلى كود Java عند ترجمة الصفحة JSP إلى سيرفلت Java. وهي تستخدم فئات محددة في ملفين [jstl.jar, standard.jar] موجودين في المجلد [lib] في التوزيع JSTL:

يتم وضع هذين الأرشيفين في المجلد [WEB-INF/lib] لتطبيقاتنا:

لدينا الآن الأساس اللازم للتعامل مع الإصدار التالي من تطبيقنا النموذجي.





