JSP Custom Tag Library

Preview:

DESCRIPTION

Jsp Custom tag library nedir nasıl oluşturulur...

Citation preview

Gökhan Tanışıkgokhantanisik@hotmail.com

30.06.2008

1

AmaçCustom tag library nedir?Niçin kullanılır?Kendi kütüphanemizi nasıl oluştururuz?Jstl(Jsp standart tag library) nedir,

fonksiyonları nelerdir?

2

İçerikCustom Tag Library nedir?Kendi kütüphanemizi oluşturmakJsp Expression Language(ifade dili)JSTL (JSP standart tag library)

3

Custom Tag Library nedir?Jsp bilindiği gibi java ile yazılmış web

uygulamalarında uygulamanın kullanıcı ara yüzünü oluşturmak ve bu arayüzü iş mantığından ayırmak için tasarlanmıştır.

Custom tag library jsp v1.1 ile gelen ve bu ayırma işlemine yardımcı olan güçlü bir özelliktir.

4

Custom Tag’ları çekici kılan?Custom Tag’lar

Çağrılan sayfalar tarafından çalışma zamanında veya static olarak olarak attribute’ler aracılığıyla özelleştirilebilir.

Request, response, in ve out da dahil olmak üzere jsp sayfalarının kullanabildiği tüm nesnelere erişebilir

Çağıran sayfadan gelen response’u kullanabilir

5

Custom Tag’ları çekici kılan?(2)Birbirleriyle iletişim kurabilirler, JavaBeans

bileşenlerini oluşturup, bir tag’da o bean’a referans bir değişken tanımlayıp, o bean’ı başka bir tag’da kullanabilirler.

Birbirleriyle iç içe olabilirler, bir jsp sayfası içerisinde karmaşık etkileşimlere izin verirler.

Basit ve karmaşık işlemleri kapsayarak, söz dizimi kolaylaştırır, jsp sayfasının okunabilirliğini artırır.

6

Kendi kütüphanemizi oluşturmakBir tag library’nin iki bileşeni vardır:

Library discriptor File(TLD-kütüphane tanım dosyası)

Tag handler (etiket işleyici)Bu iki bileşenle birlikte jsp dosyaları

kütüphaneyi kullanabilirler.

7

TLD dosyasıBir tld (tag library descriptor) dosyası

kütüphaneyi tanımlayan XML görünümlü bir dosyadır.

Dosya kütüphane hakkındaki tüm bilgiler ve kütüphanedeki bütün taglar ile ve bu tagların özelliklerini tarif eder.

Tld dosyaları jsp dosyları tarafından tag ları geçerlemek için kullanılır.

8

Kütüphanenin kimlik bilgilerini tanımlayan elemanlar<taglib> : kütüphanenin kendisi<tlibversion> : Kütüphanenin versiyonu<jspversion> : Kütüphanenin bağlı olduğu

jsp versiyonu<shortname> : Kütüphane için, anımsatıcı

(mnemonic) bir değerle basit bir ön tanımlı(default) ad.

<uri> : Kütüphaneyi belirleyen unique URI

<info> : Kütüphaneyi açıklayıcı bilgi9

Tag’ların TLD’de tanıtılması<tag>: tagin niteliklerinin

tanımlandığı bloktur.Her kütüphanede birden fazla tag

tanımlanabilir. Tüm tag’lar tek bir TLD dosyasında tanımlanabilir. Bu noktada TLD dosyaları etiket işleyicinin sınıfını (tag handler’s class) belirlemek için kullanılır:

<tagclass>className</tagclass>10

Tag’i tanımlayan diğer özelliklerEğer tag’ı tanımlayan nitelikler (attributes)

varsa <tag> elemanı içerisinde tanımlanmalı<name> : Niteliğin handler sınıfındaki adı<requeired> : Nitelik tag için zorunlu mu?

(“true”/”“false”) <rtexprvalue> : Çalışma zamanlı ifadelere izin

verilmeli mi? (“true”/”false”)

11

Tag’i tanımlayan diğer özellikler(2)Tag in her niteliği için Bean’lar gibi

getter/setter yöntemleri kullanılmalıdır.Tag’larda programcık (scripting)

değişkenleri de kullanmak mümkündür. Bunun için bir TagExtraInfo sınıfı tanımlamak gerekir ve bunu da tag’da belirtmek için

<teiclass>className<teiclass> kullanılır

12

Örnek TLD dosyası(ornekTld.tld)<?xml version="1.0" encoding=“UTF-8" ?> <taglib>

<tlibversion> 1.0 </tlibversion><jspversion> 1.1 </jspversion><shortname> tagOrnegi </shortname><info> Bu bir tag kutuphanesi ornegidir </info> <!-- (acıklama satırı) --> <!-- Basit bir tag --><tag>

<name>tagAdi</name><tagclass>customTag.deneme.TagIsleyici</

tagclass>

13

ornekTld.tld (2)<!-- Tag’ın gövdesi aşağıdaki değerleri alabilir

empty: Tag’in gövdesinin olmadığını belirtirJSP: Gövdedeki JSP kodu container tarafından değerlendirilir ve tag içerisinde işlenirtagdependent: Gövde sadece tag tarafından

işlenir.Gövdedeki JSP değerlendirilmez--><bodycontent> empty </bodycontent><info> Bu tag’imizin etiket bilgisidir </info><!-- Tag’in niteliklerininin tanımlanması -- ><!-- Nitelikler sınıf işleyicilerinde tanımlı olmalıdır --

>

14

ornekTld.tld(3)<attribute>

<name> degiskenAdi </name><required> false </required>

<rtexpvalue> false </rtexpvalue> </attribute>

</tag></taglib>

15

Etiket işleyici sınıfı (Tag Handler)Tag’ler işleyici sınıflarda tanımlanırlar.

TagSupport basit tag’ler için ata sınıftır. Javax.servlet.tagext paketi altında bulunurlar.

Tag’lerin hangi interface’leri gerçekleştireceği hangi fonksiyonların çağrılma potansiyeli olduğu ile belirlenir.

16

Etiket işleyici sınıfı(2)TagSupport ve TagBodySupport aşağıdaki

ön tanımlı fonksiyonları destekler

17

Eğer tag’inizda…

…karşılık gelen methodu gerçekleştirmelisiniz

Gövde ve nitelik yoksa

doStartTag, doEndTag, release

Nitelik varsa doStartTag,doEndTag,set/getAttributes1…N

Etkileşimsiz gövdesi varsa

doStartTag,doEndTag,release

Etkileşimli gövdesi varsa

doStartTag, doEndTag, release,doInitBody,doAfterBody

Ornek tag işleyici:TagIsleyici.javapublic class TagIsleyici extends BodyTagSupport {

private String degiskenAdi= null;public void setDegiskenAdi(String degiskenAdi){ this.degiskenAdi = degiskenAdi;}public String getDegiskenAdi() { return degiskenAdi;}public int doStartTag() {

try { JspWriter out = pageContext.getOut(); out.println("<table border="\1\">"); if (name != null) out.println("<tr><td>Hello "+degiskenAdi+"</td></tr>"); else out.println("<tr><td> Hello unnamed brother </td></tr>");

18

} catch (Exception ex) { throw new Error(“Hata!.."); } //Gövde olmadığı için SKIP_BODY döndürülür return SKIP_BODY;

}

public int doEndTag(){ try { JspWriter out = pageContext.getOut(); out.println("</table>"); } catch (Exception ex){ throw new Error(“Hata!.."); } }}

19

doStartTag: Etiket ile karşılaşıldığında çağrılırdoEndTag: Etiket sonlandırılırken çağrılırSKIP_BODY: Gövde yoksa veya işletilmeyecekse

döndürülür.

20

Örnek Jsp miz: OrnekTag.jsp<%@page contentType="text/html" %><%@page pageEncoding="UTF-8" %><%@taglib uri="/WEB-INF/tld/OrnekTag.tld" prefix="gokhan" %>

<html> <head> <meta http-equiv="Content-Type" content="text/html;"> <title>Ornek tag deneme</title> </head>

<body> <hr/> <gokhan:tagAdi degiskenAdi=“Angelina Jolie"/> <hr/> </body> </html>

21

Örnek Jsp’nin HTML çıktısı<html> <head> <meta http-equiv="Content-Type" content="text/html;

charset=ISO-8859-1"> <title>Ornek tag deneme</title> </head> <body>

<hr/><table border="5"><tr><td> Hello Angelina Jolie </td></tr></table>

<hr/> </body> </html>

22

23

<%@taglib uri="/WEB-INF/tld/OrnekTag.tld“ prefix="gokhan"%> uri : Tld dosyasının yolunu gösterir. (/WEB-INF/tld klasoru

icinde) prefix: Tld dosyasımızdaki etiketler için ön işleyici değeri.

Etiketler önİşleyici:tagAdi şeklinde kullanılır

24

Örneğimizi geliştirelimBasit bir etiketin nasıl kullanıldığını gördük.Şimdi etikete ek özellikler ve gövde

ekleyelim…

25

TagIsleyici2.javapublic class TagIsleyici2 extends BodyTagSupport {

private String degiskenAdi= null;private int yineleme=1 ;public void setDegiskenAdi(String degiskenAdi) {this.degiskenAdi = degiskenAdi;}public String getDegiskenAdi() {return degiskenAdi;}public String getYineleme() {return (Integer.toString(yineleme));}public void setYineleme(String yineleme) {try {this.yineleme = Integer.parseInt(yineleme);} catch (NumberFormatException e) {this.yineleme=1;}}

26

TagIsleyici2.java(2)public int doStartTag() throws JspTagException{try{

JspWriter out= pageContext.getOut();out.println("<table border=\"5\">");if (degiskenAdi!=null)

out.print("<tr><td> Hello "+ degiskenAdi + "</td></tr>");

else out.println("<tr><td>Hello World!

</td></tr>");}catch (IOException e) {

throw new JspTagException (“Hata!.." + e);}return EVAL_BODY_TAG;

}

27

TagIsleyici2.java(3)public int doAfterBody() throws JspException { if(yineleme-- >=1 ){

BodyContent body=getBodyContent();

try {JspWriter out= body.getEnclosingWriter();out.println(body.getString());body.clearBody();

} catch (IOException e) {throw new JspTagException(“Hata!.."+e);

}return EVAL_BODY_TAG;

}else {return SKIP_BODY;

}}

}28

TagIsleyici2.java(4)public int doEndTag() throws JspTagException{try {

JspWriter out = pageContext.getOut();out.println("</table>");

} catch (Exception e) {throw new JspTagException(“Hata!.." +e);

} return SKIP_BODY;

}

29

doAfterBody : Etiketin gövdesi değerlendirildikten sonra çağrılır.

EVAL_BODY_TAG: doAfterBody nin işletilmesini sağlar. Bu değer döndüğü sürece işletilmeye devam eder. Durmak için SKIP_BODY döndürülür.

30

OrnekTld2.tld OrnekTld dosyasını bodycontent ten itibaren aşağıdaki gibi degiştirelim

<bodycontent> JSP </bodycontent><info> Bu tag’imizin açıklamasıdır </info><attribute>

<name> degiskenAdi </name><required> false </required><rtexpvalue>false</rtexpvalue>

</attribute>

<attribute><name>yineleme</name><required>false</required><rtexpvalue>false</rtexpvalue>

</attribute></tag>

</taglib>

31

OrnekTag2.jsp<%@page contentType="text/html" %><%@page pageEncoding="UTF-8" %><%@taglib uri="/WEB-INF/tld/OrnekTag.tld" prefix="gokhan" %><html> <head>

<meta http-equiv="Content-Type" content="text/html; /><title>Ornek tag deneme</title>

</head> <body>

<hr/> <gokhan:tagAdi degiskenAdi="angelina jolie" yineleme="5">

<tr><td>angelina jolie</td></tr> </gokhan:tagAdi><hr/>

</body> </html>

32

OrnekTag2.jsp nin html çıktısı<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-

8859-1"><title>Ornek tag deneme</title></head><body>

<hr/><table border="5">

<tr><td> Hello angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr>

</table><hr/>

</body> </html>

33

34

JSP ifade dili (Expression Language)Jsp ifade dili JSP sayfalarında bulunan bean

ve nesnelerin özelliklerine kolay bir yazım şakli ile ulaşılmasını sağlar

Basit karşılaştırma ve matematiksel işlemler yapılabilir.

Temel olarak Bean’ların özelliklerine hızlı erişebilmek için kullanılırlar

${ifade} şeklinde kullanılır.

35

Ifade dilinde tanımlı değişlenlerpageContext: uygulama genelindeki değişkenlerparam: parametrelerheader: ServletRequest.getHeader(“ad”) = ${header.ad}cookie: ${cookie.ad.value} adı verilen cookinin değerini

çevirirpageScope: sayfadaki değişkenler requestScope: request nesnesindeki değişkenlersessionScope: session daki değişkenlerapplicationScope: uygulama genelindeki değişkenler

36

JSTL-Java Standart Tag LibraryTemel olarak 4 temel kütüphane vardır.

37

Tanım Örnek(prefix) Varsayılan Uri

Core c http://java.sun.com/jsp/jstl/core

Xml x http://java.sun.com/jsp/jstl/xml

Format fmt http://java.sun.com/jsp/fmt

Database sql http://java.sun.com/jsp/sql

JSTL etiketleri*core : Temel fonksiyonlar: döngüler, koşul

deyimleri, I/O*xml: XML ile ilgili işlemler*fmt: para birimi, tarihler gibi biçimlendirme

işlemleri*sql: Veritabanı erişimi

38

JSTL’i kullanmak içinhttp://www.apache.org/dist/jakarta/taglibs/

standard/binaries/ adresinden ilgili arşivi indirin.Arşivi açınca, lib klasörü altındaki jstl.jar ve

standart.jar dosyalarını uygulamanızın /WEB-INF/lib klasörüne kopyalayın.

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

Yukardaki uri ile çalışmayabiliyor, bu durumda <%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>Şeklinde kullanmayı deneyin.(diğer tag lar için de geçerli)

39

OrnekJstl.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%><%@page contentType="text/html; charset=UTF-8" %><html><head><title>JSTL</title></head><body>

<c:if test="${9>8}"><b> 9, 8'den büyüktür </b><br/>

</c:if><jsp:useBean id="renkler" class="java.util.ArrayList" /><% renkler.add("red");

renkler.add("blue");renkler.add("black");renkler.add("green"); %>

<c:forEach var="renk" items="${renkler}"><font color="${renk}" ><c:out value="${renk}" /></font></c:forEach></body></html>

40

OrnekJstl.jsp’nin html çıktısı<html><head><title>JSTL</title></head><body><b> 9, 8'den büyüktür </b><br/>

<font color="red" >red</font>

<font color="blue" >blue</font>

<font color="black" >black</font>

<font color="green" >green</font>

</body></html>

Sorular?

43

Recommended