8. JSTL etiket kütüphanesi
8.0.1. Giriş
Hata listesini görüntüleyen [erreurs.jsp] görünümünü ele alalım:

Böyle bir sayfayı yazmanın birkaç yolu vardır. Burada sadece hataların görüntülenmesi kısmıyla ilgileniyoruz. İlk çözüm, aşağıda yapıldığı gibi Java kodu kullanmaktır:
<%@ 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" %>
<%
// modeldeki verileri alıyoruz
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 sayfası, istekteki hata listesini alır (8. satır) ve bir Java döngüsü yardımıyla görüntüler (19-23. satırlar). Sayfa, HTML kodunu ve Java kodunu bir arada kullanmaktadır; bu durum, sayfanın genellikle Java kodunu anlamayan bir grafik tasarımcısı tarafından bakımı yapılması gerektiğinde sorun yaratabilir. Bu karışıklığı önlemek için, JSP sayfalarına yeni olanaklar sağlayacak etiket kütüphaneleri kullanılır. JSTL etiket kütüphanesi (Java Standard Tag Library) kullanıldığında, önceki görünüm şu şekilde değişir:
<%@ 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>
Etiket (4. satır)
, tanımı [/WEB-INF/c.tld] dosyasında bulunan bir etiket kütüphanesinin kullanıldığını belirtir. Bu etiketler, sayfanın kodunda c harfi ile başlayan (prefix="c") öneklerle kullanılacaktır. İstediğiniz herhangi bir önek kullanılabilir. Burada c, [core] anlamına gelir. Önekler, bazı etiketler için aynı isimlere sahip olabilecek etiket kütüphanelerinin kullanılmasını sağlar. Önek kullanımı, belirsizliği ortadan kaldırır. Yeni sayfada, daha önce Java kodu bulunan iki yerde artık Java kodu bulunmamaktadır:
- [erreurs, lienRetourFormulaire] sayfasının şablonunun alınması (kaldırılan kısım)
- hata listesinin görüntülenmesi (13-15. satırlar)
Hata görüntüleme döngüsü aşağıdaki kodla değiştirilmiştir:
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
- <forEach> etiketi, bir döngüyü sınırlamak için kullanılır
- ${değişken} biçiminde yazılan ifade, bir değişkenin değerini yazmak için kullanılır
<forEach> etiketinin burada iki özniteliği vardır:
- items="${hatalar}", üzerinde yineleme yapılması gereken nesne koleksiyonunu belirtir. Burada koleksiyon, hatalar nesnesidir. Bu nesne nerede bulunur? JSP sayfası, "hatalar" adlı bir özniteliği sırasıyla ve şu sırayla arar:
- denetleyici tarafından iletilen isteği temsil eden [request] nesnesi: request.getAttribute("erreurs")
- müşterinin oturumunu temsil eden [session] nesnesi: session.getAttribute("hatalar")
- web uygulamasının bağlamını temsil eden [application] nesnesi: application.getAttribute("hatalar")
items özniteliğiyle belirtilen koleksiyon çeşitli biçimlerde olabilir: tableau, ArrayList, List arayüzünü uygulayan nesne, ...
- var="hata", işlenmekte olan koleksiyonun mevcut elemanına bir ad vermek için kullanılır. <forEach> döngüsü, items koleksiyonundaki her eleman için art arda çalıştırılacaktır. Dolayısıyla döngünün içinde, işlenmekte olan koleksiyon elemanı burada hata olarak adlandırılacaktır.
${erreur} notasyonu, "erreur" değişkeninin değerini metne ekler. Bu değişken mutlaka bir karakter dizisi olmak zorunda değildir. JSTL, "erreur" değişkeninin değerini eklemek için erreur.toString() yöntemini kullanır. ${hata} notasyonu yerine <c:out value="${hata}"/> etiketini de kullanabilirsiniz.
Hata görüntüleme örneğimize geri dönersek:
- denetleyici, JSP sayfasına iletilen isteğe bir ArrayList hatası mesajı dizisi, yani bir ArrayList String nesnesi dizisi ekleyecektir: request.setAttribute("hatalar", hatalar) burada "hatalar" ArrayList'tir;
- items="${hatalar}" özniteliği nedeniyle, JSP sayfası sırasıyla istekte, oturumda ve uygulamada "hatalar" adlı bir özniteliği arar. Bunu istek içinde bulur: request.getAttribute("hatalar"), denetleyici tarafından isteğe yerleştirilen ArrayList'i döndürür;
- var="hata" özniteliğine sahip erreur değişkeni, dolayısıyla ArrayList'in geçerli öğesini, yani bir String nesnesini işaret edecektir. erreur.toString() yöntemi, bu String'in değerini (burada bir hata mesajı) sayfanın HTML akışına ekleyecektir.
<forEach> etiketiyle işlenen koleksiyondaki nesneler, basit karakter dizilerinden daha karmaşık olabilir. Bir makale listesi görüntüleyen JSP sayfasını örnek olarak ele alalım:
burada [listarticles], ArrayList türünde nesnelerden oluşan bir [Article]'tir; bu nesnenin, [id, nom, prix, stockActuel, stockMinimum] alanlarına sahip bir Javabean olduğu varsayılır ve bu alanların her birinin kendi get ve set yöntemleri vardır. [listarticles] nesnesi, denetleyici tarafından isteğe eklenmiştir. Bir önceki JSP sayfası, bunu forEach etiketinin items özniteliğinden alacaktır. Dolayısıyla, mevcut article nesnesi (var="article"), [Article] türünde bir nesneyi ifade eder. 3. satırdaki etiketi ele alalım:
${article.nom} ne anlama geliyor? Aslında, nesnenin türüne göre farklı anlamlar taşıyabilir. article.nom değerini elde etmek için, JSP sayfası iki şeyi deneyecektir:
- article.getNom() - "nom" alanını almak için getNom yazımına dikkat edin (JavaBean standardı)
- article.get("nom")
Dolayısıyla [article] nesnesi, "nom" adlı bir alana sahip bir bean ya da "nom" anahtarına sahip bir sözlük olabilir.
İşlenen nesnenin hiyerarşisinde herhangi bir sınırlama yoktur. Dolayısıyla şu etiket
etiketi, aşağıdaki türde bir [individu] nesnesinin işlenmesine olanak tanır:
class Individu{
private String nom;
private String prénom;
private Individu[] enfants;
// JavaBean standardındaki yöntemler
public String getNom(){ return nom;}
public String getPrénom(){ return prénom;}
public Individu getEnfants(int i){ return enfants[i];}
}
${individu.enfants[1].nom} değerini elde etmek için, JSP sayfası, başarılı olacak olan şu yöntem de dahil olmak üzere çeşitli yöntemleri deneyecektir:
individu.getEnfants(1).getNom(), burada “individu” bir “Individu” türündeki nesneyi ifade eder.
8.0.2. JSTL kütüphanesini yükleme ve keşfetme
Yukarıda verilen açıklamalar ilgilendiğimiz uygulama için yeterli olacaktır, ancak JSTL etiket kütüphanesi, burada sunulanların dışında başka etiketler de sunmaktadır. Bunları keşfetmek için, kütüphane paketinde bulunan bir öğreticiyi yükleyebilirsiniz.
[http://jakarta.apache.org/taglibs/] adresinde (Mayıs 2006) bulunan [Jakarta Taglibs] projesinin JSTL 1.1 sürümünü kullanacağız:
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
İndirilen zip dosyasının içeriği aşağıdakine benzer:

.war uzantılı iki dosya, web uygulaması arşivleridir:
- standard-doc: etiketlerle ilgili belgeler JSTL
- standard-examples: etiketlerin kullanım örnekleri
Bu son uygulamayı Tomcat'te dağıtacağız. [Démarrer] menüsündeki uygun seçeneği kullanarak Tomcat'i başlatıyoruz, ardından [http://localhost:8080] URL'sini girip [Tomcat Manager] bağlantısını takip ediyoruz:

Böylece bir kimlik doğrulama sayfası açılır. 2.3.3. paragrafında gösterildiği gibi, manager / manager veya admin / admin olarak oturum açıyoruz.

Tomcat’ta şu anda dağıtılmış olan uygulamaları listeleyen bir sayfa karşımıza çıkar:

Sayfanın alt kısmında bulunan formlar aracılığıyla yeni bir uygulama ekleyebiliriz:

[Parcourir] düğmesini kullanarak dağıtılacak bir .war dosyasını belirleriz.

Ekran görüntüsünde görünmüyor, ancak indirilen JSTL dağıtımından [standard-examples.war] dosyasını seçtik. [Deploy] düğmesi, bu uygulamayı kaydeder ve Tomcat'e dağıtır.

[/standard-examples] uygulaması başarıyla dağıtıldı. Uygulamayı başlatıyoruz:

Okuyucu, JSTL etiketlerinin kullanım örneklerini ararken bu sayfada sunulan çeşitli bağlantıları takip etmelidir.
[standard-doc] uygulaması da [standard-doc.war] dosyasından aynı şekilde dağıtılabilir. Bu uygulama, JSTL kütüphanesi hakkında oldukça teknik bilgilere erişim sağlar. Yeni başlayanlar için pek ilgi çekici değildir.
8.0.3. JSTL'i bir web uygulamasında kullanma
JSTL 1.2 kütüphanesi ile birlikte gelen örneklerde, JSP sayfalarının dosya başında şu etiket bulunur:
Bu etiketi 8.1.1 numaralı paragrafta daha önce görmüştük ve kısa bir açıklama yapmıştık:
- [uri]: URI (Tekdüzen Kaynak Tanımlayıcı), burada sayfada kullanılan etiketlerin tanımları bulunur. Bu URI etiketi, JSP sayfası bir servlet haline gelmek üzere Java koduna dönüştürüldüğünde web sunucusu tarafından kullanılacaktır. Ayrıca, web sayfası geliştirme araçları tarafından sayfada kullanılan etiketlerin sözdiziminin doğru olup olmadığını kontrol etmek veya yazma sırasında yardım sunmak amacıyla da kullanılır. Bir etiket yazmaya başladığınızda, kütüphaneyi tanıyan bir araç, kullanıcıya bu etiket için olası öznitelikleri önerebilir.
- [prefix]: sayfada bu etiketleri tanımlayan önek
[http://java.sun.com/jsp/jstl/core] URI'si, genel internete bağlı olunmadığında kullanılamaz. Bu durumda, etiket tanım dosyası yerel olarak yerleştirilebilir. JSTL 1.2 dağıtımıyla birlikte, [tld] (Etiket Dili Tanımı) klasöründe bu türden birkaç dosya sağlanmaktadır:

JSTL aslında bir etiket kütüphanesi setidir. Biz sadece "core" kütüphanesi olarak adlandırılan [c.tld] kütüphanesini kullanacağız. Yukarıdaki [c.tld] dosyasını uygulamalarımızın [WEB-INF] klasörüne yerleştireceğiz:
![]()
ve "core" kütüphanesinin kullanıldığını belirtmek için sayfalarımıza şu etiketi ekleyeceğiz: JSP
Etiket kütüphanelerini kullanmak, JSP sayfalarına Java kodu eklemekten bizi kurtarsa da, bu etiketler elbette JSP sayfasının Java servlet'ine dönüştürülmesi sırasında Java koduna çevrilir. Bu etiketler, JSTL dağıtımının [lib] klasöründe bulunan iki [jstl.jar, standard.jar] arşivinde tanımlanmış sınıfları kullanır:

Bu iki arşiv, uygulamalarımızın [WEB-INF/lib] klasöründe yer almaktadır:

Artık örnek uygulamamızın bir sonraki sürümüne geçmek için gerekli temellere sahibiz.





