Skip to content

8. کتابخانه تگ JSTL

8.0.1. مقدمه

ویوی [erreurs.jsp] را در نظر بگیرید که فهرستی از خطاها را نمایش می‌دهد:

Image

راه‌های مختلفی برای نوشتن چنین صفحه‌ای وجود دارد. در اینجا، ما تنها به بخشی که مربوط به نمایش خطاها است، می‌پردازیم. یک راه‌حل ممکن، استفاده از کد جاوا است، همان‌طور که انجام شده است:


<%@ 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");
        }//برای
      %>
    </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 لیست خطاها را از درخواست دریافت می‌کند (خط ۸) و آن را با استفاده از یک حلقه جاوا نمایش می‌دهد (خطوط ۱۹–۲۳). این صفحه کد HTML را با کد جاوا ترکیب می‌کند، که اگر قرار باشد صفحه توسط یک طراح گرافیک که معمولاً کد جاوا را درک نمی‌کند نگهداری شود، می‌تواند مشکل‌ساز باشد. برای جلوگیری از این ترکیب، از کتابخانه‌های تگ استفاده می‌شود که امکانات جدیدی را برای صفحات JSP به ارمغان می‌آورند. با کتابخانه تگ JSTL (کتابخانه تگ استاندارد جاوا)، نمای قبلی به شکل زیر درمی‌آید:


<%@ 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>

تگ (خط ۴)

<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

نشان‌دهنده استفاده از یک کتابخانه تگ است که در فایل [/WEB-INF/c.tld] تعریف شده است. این تگ‌ها در کد صفحه استفاده خواهند شد و با حرف c (prefix="c") پیش‌وندگذاری می‌شوند. هر پیش‌وند دلخواهی را می‌توان استفاده کرد. در اینجا، c مخفف [core] است. پیش‌وندها امکان استفاده از کتابخانه‌های تگی را فراهم می‌کنند که ممکن است برای برخی تگ‌ها نام یکسانی داشته باشند. استفاده از پیش‌وند هرگونه ابهام را برطرف می‌کند. صفحه جدید دیگر در دو مکانی که قبلاً کد جاوا داشت، حاوی کد جاوا نیست:

  • بازیابی قالب برای صفحه [erreurs, lienRetourFormulaire] (بخش حذف شده)
  • نمایش لیست خطاها (خطوط ۱۳–۱۵)

حلقه نمایش خطا با کد زیر جایگزین شده است:


            <c:forEach var="erreur" items="${erreurs}">
                <li>${erreur}</li>
            </c:forEach>
  • تگ <forEach> برای جدا کردن یک حلقه استفاده می‌شود
  • نشانه ${variable} برای نوشتن مقدار یک متغیر استفاده می‌شود

تگ <forEach> در اینجا دو ویژگی دارد:

  • items="${errors}" مجموعهٔ اشیایی را که باید روی آن‌ها حلقه‌زنی شود مشخص می‌کند. در اینجا، این مجموعه شیء errors است. این در کجا یافت می‌شود؟ صفحه JSP به‌طور متوالی و به ترتیب زیر به دنبال صفتی به نام "errors" می‌گردد:
    • شیء [request]، که نمایانگر درخواستی است که توسط کنترل‌کننده ارسال شده است: request.getAttribute("errors")
    • شیء [session]، که نمایانگر جلسه (session) مشتری است: session.getAttribute("errors")
    • شیء [application]، که نمایانگر زمینهٔ برنامهٔ وب است: application.getAttribute("errors")

مجموعه‌ای که توسط ویژگی **items** به آن اشاره می‌شود می‌تواند اشکال مختلفی داشته باشد: tableau، ArrayList، یک شیء که رابط List را پیاده‌سازی می‌کند، و غیره.

  • از var="error" برای اختصاص نام به عنصر فعلی مجموعه در حال پردازش استفاده می‌شود. حلقه <forEach> به طور متوالی برای هر عنصر از مجموعه items اجرا خواهد شد. بنابراین، در داخل حلقه، به عنصر مجموعه که در حال پردازش است، در اینجا به عنوان error اشاره می‌شود.

نشانه‌گذاری ${erreur} مقدار متغیر 'erreur' را در متن درج می‌کند. این متغیر لزوماً یک رشته نیست. JSTL از روش erreur.toString() برای درج مقدار متغیر 'erreur' استفاده می‌کند. به جای نشانه ${error}، می‌توانید از تگ <c:out value="${error}"/> نیز استفاده کنید.

بازگردیم به مثال نمایش خطاها:

  • کنترل‌کننده یک ArrayList از پیام‌های خطا را در درخواستی که به صفحه JSP ارسال می‌شود، درج خواهد کرد، یعنی یک ArrayList از اشیاء String: request.setAttribute("errors", errors) که در آن errors همان ArrayList است؛
  • به دلیل ویژگی `items="${errors}"`، صفحه `JSP` به دنبال ویژگی‌ای به نام `errors` در درخواست، جلسه و برنامه خواهد گشت. این متغیر آن را در درخواست پیدا می‌کند: request.getAttribute("errors") مقدار ArrayList را که توسط کنترلر در درخواست قرار داده شده است، بازمی‌گرداند؛
  • بنابراین متغیر erreur از ویژگی var="error" به عنصر جاری ArrayList، یعنی یک شیء String، اشاره خواهد کرد. متد erreur.toString() مقدار این String – در این مورد، یک پیام خطا – را در جریان HTML صفحه وارد می‌کند.

ابجه‌ها در مجموعه‌ای که توسط تگ <forEach> پردازش می‌شوند ممکن است پیچیده‌تر از رشته‌های کاراکتری ساده باشند. بیایید مثال یک صفحه JSP را در نظر بگیریم که فهرستی از مقالات را نمایش می‌دهد:

1
2
3
4
5
6
7
            <c:forEach var="article" items="${listarticles}">
                <tr>
                    <td><c:out value="${article.nom}"/></td>
                    <td><c:out value="${article.prix}"/></td>
                    <td><a href="<c:url value="?action=infos&id=${article.id}"/>">Infos</a></td>
                </tr>
     </c:forEach>

که در آن [listarticles] یک ArrayList از اشیاء از نوع [Article] است، که ما فرض می‌کنیم یک JavaBean با فیلدهای [id, nom, prix, stockActuel, stockMinimum] باشد، و هر یک از این فیلدها متدهای get و set مخصوص به خود را دارند. شیء [listarticles] توسط کنترلر در درخواست قرار داده شد. صفحهٔ قبلی JSP آن را از ویژگی «items» تگ forEach بازیابی خواهد کرد. بنابراین شیء فعلی «article» (var="article") به شیئی از نوع [Article] اشاره می‌کند. بیایید تگ روی خط ۳ را بررسی کنیم:

<c:out value="${article.nom}"/>

${article.nom} به چه معناست؟ در واقع بسته به ماهیت شیء مقاله معانی مختلفی دارد. برای بازیابی مقدار article.nom، صفحه JSP دو کار انجام می‌دهد:

  1. article.getNom() – توجه کنید که getNom برای بازیابی فیلد «name» (استاندارد JavaBean) است
  2. article.get("name")

بنابراین، شیء [article] می‌تواند یک بین با فیلد «name» یا یک دیکشنری با کلید «name» باشد.

هیچ محدودیتی در مورد سلسله‌مراتب شیء در حال پردازش وجود ندارد. بنابراین، تگ

<c:out value="${individu.enfants[1].nom}"/>

به شما امکان می‌دهد یک شیء [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].name}، صفحه JSP روش‌های مختلفی را امتحان می‌کند، از جمله این روش که موفق خواهد بود:

individu.getEnfants(1).getNom()، که در آن «individu» به یک شیء از نوع «Individu» اشاره دارد.

8.0.2. نصب و بررسی کتابخانه JSTL

توضیحات ارائه‌شده در بالا برای کاربرد مورد نظر ما کافی خواهد بود، اما کتابخانه تگ JSTL علاوه بر موارد ارائه شده، تگ‌های دیگری نیز ارائه می‌دهد. برای بررسی آن‌ها، می‌توانید یک آموزش موجود در بسته کتابخانه را اجرا کنید.

ما از پیاده‌سازی JSTL پروژه [Jakarta Taglibs] استفاده خواهیم کرد که در آدرس URL [http://jakarta.apache.org/taglibs/] (مه ۲۰۰۶) در دسترس است:

فایل زیپ دانلود شده حاوی چیزی شبیه به موارد زیر است:

Image

دو فایل با پسوند .war آرشیوهای برنامه‌های وب هستند:

  • standard-doc: مستندات مربوط به تگ‌ها JSTL
  • standard-examples: مثال‌هایی از نحوه استفاده از تگ‌ها

ما این اپلیکیشن اخیر را در Tomcat مستقر خواهیم کرد. Tomcat را با استفاده از گزینه مناسب از منوی [Démarrer] راه‌اندازی می‌کنیم، سپس URL [http://localhost:8080] را وارد کرده و لینک [Tomcat Manager] را دنبال می‌کنیم:

Image

سپس صفحهٔ احراز هویت نمایش داده می‌شود. ما با نام کاربری manager / manager یا admin / admin، همان‌طور که در بخش 2.3.3 نشان داده شده است، وارد می‌شویم.

Image

صفحه‌ای به ما نمایش داده می‌شود که فهرست برنامه‌های کاربردی مستقر شده در Tomcat را نشان می‌دهد:

Image

ما می‌توانیم با استفاده از فرم‌های موجود در پایین صفحه، یک برنامه کاربردی جدید اضافه کنیم:

Image

از دکمه [Parcourir] برای انتخاب یک فایل .war جهت استقرار استفاده می‌کنیم.

Image

اسکرین‌شات این مورد را نشان نمی‌دهد، اما ما فایل [standard-examples.war] را از توزیع دانلود شده JSTL انتخاب کرده‌ایم. دکمه [Deploy] این برنامه را ذخیره کرده و در Tomcat مستقر می‌کند.

Image

برنامه [/standard-examples] با موفقیت مستقر شده است. ما آن را اجرا می‌کنیم:

Image

از خوانندگان دعوت می‌شود تا هنگام جستجوی نمونه‌هایی از نحوه استفاده از تگ‌های JSTL، پیوندهای مختلفی را که در این صفحه ارائه شده است دنبال کنند.

اپلیکیشن [standard-doc] را می‌توان به همان روش از فایل [standard-doc.war] مستقر کرد. این برنامه دسترسی به اطلاعات نسبتاً فنی در مورد کتابخانه JSTL را فراهم می‌کند. این برنامه برای مبتدیان جذابیت کمتری دارد.

8.0.3. استفاده از JSTL در یک برنامه وب

در مثال‌های ارائه‌شده همراه با کتابخانه JSTL 1.2، صفحات JSP با تگ زیر شروع می‌شوند:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

ما قبلاً در بخش 8.1.1 با این تگ مواجه شده‌ایم و توضیح مختصری ارائه داده‌ایم:

  • [uri]: URI (شناسه‌ی یکنواخت منبع)، که شامل تعاریف تگ‌های استفاده‌شده در صفحه است. این URI توسط سرور وب زمانی استفاده می‌شود که صفحه JSP به کد جاوا برای تبدیل شدن به یک سرولت ترجمه شود. همچنین توسط ابزارهای توسعه صفحات وب برای بررسی سینتکس تگ‌های استفاده شده در صفحه یا برای ارائه پیشنهادات تکمیل خودکار استفاده می‌شود. وقتی کاربر شروع به تایپ یک تگ می‌کند، ابزاری که با کتابخانه آشناست می‌تواند ویژگی‌های ممکن آن تگ را پیشنهاد دهد.
  • [prefix]: پیشوندی که این تگ‌ها را در داخل صفحه شناسایی می‌کند

URI [http://java.sun.com/jsp/jstl/core] در صورتی که به اینترنت عمومی متصل نباشید، قابل استفاده نیست. در این صورت می‌توانید فایل تعریف تگ را به‌صورت محلی ذخیره کنید. چندین فایل از این دست در توزیع JSTL نسخه ۱.۲ در پوشه [tld] (تعریف زبان برچسب) ارائه شده‌اند:

Image

JSTL در واقع مجموعه‌ای از کتابخانه‌های تگ است. ما تنها از کتابخانه [c.tld] که با نام «کُر» شناخته می‌شود، استفاده خواهیم کرد. فایل [c.tld] را که در بالا نشان داده شده است، در پوشه [WEB-INF] برنامه‌های خود قرار می‌دهیم:

Image

و تگ زیر را در صفحات خود، JSP، برای اعلام استفاده از کتابخانه «اصلی» درج کنید:

<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

در حالی که استفاده از کتابخانه‌های تگ به ما امکان می‌دهد تا از قرار دادن کد جاوا در صفحات JSP خودداری کنیم، این تگ‌ها البته هنگام ترجمه صفحه JSP به یک سرولت جاوا، به کد جاوا تبدیل می‌شوند. آنها از کلاس‌هایی که در دو آرشیو [jstl.jar, standard.jar] تعریف شده‌اند استفاده می‌کنند، که می‌توان آنها را در پوشه [lib] توزیع JSTL یافت:

Image

این دو آرشیو در پوشه [WEB-INF/lib] برنامه‌های ما قرار دارند:

Image

اکنون ما پایه‌های لازم را برای پرداختن به نسخه بعدی برنامه مثال خود فراهم کرده‌ایم.