Sunday, October 30, 2005

JSP'nin Geleceği - JSTL

JSP etiket dilinin temel özelliklerini gördüğümüz yazıda, HTML etiketleri içeren bir sayfanın içine nasıl Java kodları koyabildiğimizi göstermiştik. Ayrıca, JSP'nin bir standart olarak yeni etiketlere izin verdiğine kısaca değindik.

JSTL, Sun şirketinin JSP üzerine kurduğu bir etiket kütüphanesidir. JSP'nin dil olarak ve özellikle bilgi işlem uygulamaları için yetersiz kaldığı farkedilince, JSTL dili piyasaya çıktı. Zaten, ATG gibi güçlü Uygulama Servis programları, standart dışında kalmış olmalarına rağmen kendi etiket kütüphanelerini uzun süredir kullanıyorlardı. Bunda JSP'nin çok temel oluşu, ATG örneğinde ise, daha revaçta bile olmayışı tabii ki büyük bir rol oynamıştır.

JSTL'in JSP'den üstünlüğü birkaç yerde toplanıyor:


* Sayfa içinde uzun Java kodları koymaya gerek kalmıyor. Normal Java kavramlarının karşılıkları "etiket olarak" mevcut.
* JSTL altında XML tarzı etiket kullanımı fazlalaştığı için, içerik üreten program(cı)lar, sayfaları daha rahat değiştirebiliyorlar ve geliştirilen sayfa, geliştirme safhasında önizlenirken (preview) tarayıcıda aslına daha yakın gözüküyor.
* JSTL, Model/Şekil/Kontrol kavramını tercih ettiği için, bu yazılım kalıbını program üzerinde teşvik etmiş oluyor, ve dolaylı olarak daha temiz mimariye yönelmiş oluyoruz.

Model/Şekil/Kontrol mimarisi, 'model' olarak yazılmış işlem mantığının 'kontrol' kodları tarafından değiştirildiği ve sonucun 'şekil' üzerinde gösterecek şekilde kurulmuş sistemlere (mimariye) verilen addır. Günümüz Internet/Java mimarisinde model Java bean/işlem mantığı kodları, şekil JSTL etiketleri (ve yardımcı görsel kütüphaneleri), kontrol da Servlet ya da görüntüsüz JSP kodları olarak tanımlanabilir.

Bizim tavsiyemiz, örnek mimari olarak Servlet/JSTL/Java-JDO dörtlüsü ile çalışmanız.

Kurmak İçin

Tomcat için JSTL kurmak istiyorsanız, Jakarta adresinden Etiket Kütüphanesini indirin. Kurduktan sonra, eğer Tomcat altında çalışıyorsanız, (sitenizin-ismi)/WEB-INF/web.xml altında, şunu tanımlayın.

<web-app>
..
<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/tags/c.tld</taglib-location>
</taglib>
..
</web-app>


Not: Burada tarif edilen bütün basamakları, sitenin kaynak kodlarında, ayartanım dosyalarında, ve Ant build.xml dosyasında bulabilirsiniz. Detaylı tarif edebilmek bakımından yazıda belirtmeyi uygun gördük. Kod detayları için her zaman site arşivine bakabilirsiniz.

Şimdi, (sitenizin-ismi)/WEB-INF/tags/ adlı bir dizin altına, Jakarta'dan gelen tld dosyalarını kopyalayın. Bunu Ant'e otomatik olarak yaptırabilirsiniz.

(sitenizin-ismi)/WEB-INF/lib/ altına, Jakarta'dan gelen jar dosyalarını kopyalayın. Bunu da Ant'e otomatik olarak yaptırabilirsiniz.

Artık JSTL kullanmayı istediğiniz her sayfanın başında, şu ibareyi kullandıktan sonra, JSTL'iniz çalışıyor olacak.

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


Örnek olarak, JSTL'in etiketlerinin neler içerdiğini görelim.

JSTL Kullanım Kalıpları

JSTL, oturum veya istek seviyesinde Java nesnelerine erişerek, get..() işlemlerini çağırabilir, ve sonuçları döngü kullanarak tablo içinde, ya da bağlantı olarak tıklanabilir şekilde sayfanızda gösterebilir. Basit bir örnekten başlayacak olursak, 1..10 arası sayan bir döngü kurmak için,

<c:forEach var="i" begin="1" end="10">
<c:out value="${i}"/>
</c:forEach>


Bu tabiri kullanmak, şu şekilde kodlamaktan çok daha iyi değil mi?

..
<%
for (int i=0; i<10; i++) {
%>
<%=i%>
<%
}
%>



JSP kodu üzerinde Java'nın nerede bitip nerede başladığı anlaşılmıyor. JSTL ile herşey etiket. Yani JSTL kodunun bakımı ve değiştirilmesi daha rahat olacak.

Bağlantı göstermek için, c:url tabirini kullanabilirsiniz.

<a suraya="<c:url value="urun_detay_goster.jsp">
<c:param name="urun" value="${urun.no}"/></c:url>">
<c:out value="${urun.isim}"/>
</a>


Eğer, List arayüzünü uzatmış olan bir Java nesnesinin 'elemanlarını' teker teker işlemek istiyorsanız, JSTL ile bu çok basit:

<c:forEach var="i" items="${nesne.liste}">
<!-- ${i} ile istedi�inizi yapın.. -->
</c:forEach>


Bu örnekte, nesne değişkeni üzerinde getListe() işleminin tanımlanması gerektiğini belirtelim. JSP standardi, get.. önek kısmının koyulmasına gerek bırakmadan, 'liste' dediğinizde 'getListe' işlemini çağırıyor.

Peki O İlk Nesne Nereden Geliyor?

Bu çok önemli bir soru, ve cevabı programınız üzerinde mimari etkileri olacak. Pür dikkat..:)

JSTL örneklerinde çoğu zaman, bir oturum nesnesine ya da istek (request) üzerinden bildirgeçlere erişildiğini görürsünüz. Fakat, filanca listeyi döken hangi nesnedir, bu sonucu JSTL'e nasıl iletir gibi soruları cevaplamak gerekir, çünkü bu soruların cevabı yazılım mimarisi üzerinde etkileri vardır. Bu tür bir kullanım stratejik bir karardır, kalıp olarak bir kez karar verilir, ve her ihtiyaç olan yerde kullanılır.

JSTL, en rahat olarak oturum üzerinden get..() işlemlerini tanımlamış nesneler ile çalıştığı için, şöyle bir mimari size kolaylık sağlayacaktır.


* Kullanıcı isteği (bağlantı tıklaması), bir Servlet'e gider.
* Bu servlet, işlem mantığı nesnesi ya da direk JDO (veya JDBC ile) kullanarak veri tabanına erişir.
* Tabandan gelen sonuçları bir Java "List" nesnesi üzerinde saklar (ArrayList olabilir).
* Servlet bu List nesnesini, Oturum (session) üzerine ekler.
* Yönlendirme (redirect) ile kontrolü JSTL'e aktarır
* JSTL, aynı şekilde oturuma erişerek verileri "alır" ve ekranda biçimlendirerek gösterir.

Bu şekilde kullanımı site kodlarının yeni sürümünde bulabilirsiniz.

Referans olarak Manning adlı yazardan JSTL komut listesi yararlı olabilir.

No comments: