Servlet & JSP – 33 – Classic Tag Handler – 01
Merhaba Arkadaslar,
Bu bolumde Classic Tag Handler konusuna giris yapacagiz. Onceki bolumlerde Simple Tag Handler konusunu inceledik.
Classic Tag ve Simple Tag apisi hiyerarsik olarak su sekildedir.
Classic Tag hiyerarsisi Tag , IterationTag , BodyTag arabirimlerinden ve TagSupport ile BodyTagSupport siniflarindan olusur.
Classic Tag Handler Simple Example
- Classic Tag Handler kullanmak icin TagSupport sinifini kalitiyoruz.
Simple Tag Handler kullanmak icin SimpleTagSupport sinifini kalitiyoruz. - doTag metodu SimpleTagHandler icin kullaniyorduk.
doStartTag metodunu Classic Tag Handler icin override edebiliriz. - doStartTag metodu taniminda throws JspException vardir, doTag metodu exception firlatmaz.
javax.servlet.jsp.tagext.TagSupport
@Override public int doStartTag() throws JspException { return SKIP_BODY; }
ClassicTagHandler.java
package _15_ClassicTagHandler; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; //Classic Tag Handler kullanmak icin TagSupport sinifini kalitiyoruz. //Simple Tag Handler kullanmak icin SimpleTagSupport sinifini kalitiyoruz. public class ClassicTagHandler extends TagSupport { // doTag metodu SimpleTagHandler icin kullaniyorduk. // doStartTag metodunu Classic Tag Handler icin override edebiliriz. // Bu metot JspException firlatabilir , doTag metodunun aksine IOException // firlatmaz. @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); // TagSupport sinifi PageContext objesine sahiptir. // SimpleTagSupport da JspContext objesi vardir. try { out.println("Hello Classic Tag Handler!"); } catch (IOException e) { e.printStackTrace(); } return SKIP_BODY; } }
classicTag.tld
tld dosyamizi WEB-INF dizini altinda olusturabiliriz. classic tag tanimlamak icin yine name , tag-class ve body-content etiketlerinden yararlaniyoruz.
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"> <uri>myClassicTagURI</uri> <tlib-version>2.0</tlib-version> <tag> <name>myClassicTagName</name> <tag-class>_15_ClassicTagHandler.ClassicTagHandler</tag-class> <body-content>empty</body-content> </tag> </taglib>
classicTag.jsp
jsp dosyamizda classic tag’i kullanabilmek icin tablib directive’ini kullaniriz. uri alani ile tld dosyamizdaki uri alaninin ayni olduguna dikkat edelim. prefix alanina ise ayrilmis kelimeler disinda(jsp , jspx ,servlet vs ) diledigimiz isimler yazabiliriz.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="myClassicTagURI" prefix="myClassicTags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello ClassicTag</title> </head> <body> <myClassicTags:myClassicTagName /> </body> </html>
Ornegimizi calistirdigimizda ;
TagSupport sinifi doStartTag metodu disinda doEndTag metodunu da icerir. Bu metodu da override edebiliriz.
public int doEndTag() throws JspException { return EVAL_PAGE; }
Bu metot varsayilan olarak EVAL_PAGE doner. Bunun anlami bu tag kullanildiginda sayfanin geri kalanini calistir.
ClassicTagHandler2.java
package _15_ClassicTagHandler; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class ClassicTagHandler2 extends TagSupport { @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.println("Hello Classic Tag Handler 2!"); } catch (IOException e) { e.printStackTrace(); } // Body degerlendirmeye alinmaz. return SKIP_BODY; } @Override public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print("doEndTag works!"); } catch (IOException e) { e.printStackTrace(); } // sayfanin geri kalanini calistir. return EVAL_PAGE; } }
classicTag.tld
<tag> <name>myClassicTagName2</name> <tag-class>_15_ClassicTagHandler.ClassicTagHandler2</tag-class> <body-content>empty</body-content> </tag>
classicTag2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="myClassicTagURI" prefix="myClassicTags2"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello ClassicTag2</title> </head> <body> <myClassicTags2:myClassicTagName2 /> </body> </html>
Ornegimizi calistirdigimizda doStartTag calistiktan sonra doEndTag metodunun calistigini gorebiliriz.
Classic Tag Handler With Body
doStartTag metodunda donus olarak SKIP_BODY yerine EVAL_BODY_INCLUDE kullandigimizda body degerlendirmeye alinir!
ClassicTagHandler3.java
package _15_ClassicTagHandler; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class ClassicTagHandler3 extends TagSupport { @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.println("Hello Classic Tag Handler 3 With Body!"); } catch (IOException e) { e.printStackTrace(); } // SKIP_BODY yerine EVAL_BODY_INCLUDE kullandigimizda // Body degerlendirmeye alinir!. return EVAL_BODY_INCLUDE; } @Override public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print("After body!"); } catch (IOException e) { e.printStackTrace(); } // sayfanin geri kalanini calistir. return EVAL_PAGE; } }
classicTag.tld
<tag> <name>myClassicTagName3</name> <tag-class>_15_ClassicTagHandler.ClassicTagHandler3</tag-class> <body-content>scriptless</body-content> </tag>
<body-content> empty yerine scriptless tanimladik.
body-content scriptless oldugunda body arasinda JSP expression kodu yazamayiz , calisma zamanida hata verir. Bununla birlikte Expression Language kullanabiliriz.
${thisIsLegal} , body-content scriptless oldugunda degerlendirmeye alinir.
Eger body-content tagdependent olursa bu durumda Expression Language ler plain text olarak degerlendirilir , donusume ugramaz. ${thisIsLegal} body icerisine yazarsak ayni bu sekilde goruruz.
classicTag3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="myClassicTagURI" prefix="myClassicTags3"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello ClassicTag3</title> </head> <body> <myClassicTags3:myClassicTagName3> <p>This is classic tag body.</p> </myClassicTags3:myClassicTagName3> <p>after classic tag works </p> </body> </html>
doEndTag with SKIP_PAGE
doEndTag metodunun donus tipi SKIP_PAGE ise bu durumda sayfanin geri kalani degerlendirmeye alinmaz. Simple Tag yapisindaki SkipPageException ile aynidir.
EVAL_PAGE donus tipi oldugunda sayfanin geri kalani calisir/degerlendirmeye alinir.
ClassicTagHandler4.java
package _15_ClassicTagHandler; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class ClassicTagHandler4 extends TagSupport { @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.println("Hello Classic Tag Handler 4 With Body!"); } catch (IOException e) { e.printStackTrace(); } // SKIP_BODY yerine EVAL_BODY_INCLUDE kullandigimizda // Body degerlendirmeye alinir!. return EVAL_BODY_INCLUDE; } @Override public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print("After body!"); } catch (IOException e) { e.printStackTrace(); } // sayfanin geri kalanini calistir. // return EVAL_PAGE; // sayfanin geri kalani calismaz! Simple Tag icin SkipPageException a // karsilik gelir. return SKIP_PAGE; } }
classicTag.tld
<tag> <name>myClassicTagName4</name> <tag-class>_15_ClassicTagHandler.ClassicTagHandler4</tag-class> <body-content>tagdependent</body-content> </tag>
classicTag4.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="myClassicTagURI" prefix="myClassicTags4"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello ClassicTag4</title> </head> <body> <myClassicTags4:myClassicTagName4> <p>This is classic tag body.</p> </myClassicTags4:myClassicTagName4> <p>THIS IS SKIPPED! doEndTag return SKIP_PAGE; oldugu icin bu kisim calismayacaktir!</p> </body> </html>
Classic Tag Handler With Attribute
Simple Tag ile attribute kullanimini incelemistik. Benzer sekilde Classic Tag icin de attribute kullanabiliriz. Bunun icin .tld dosyamizda <attribute> etiketini kullanabiliriz.
tld dosyamizdaki attribute karsilik instance degisken tanimlamamiz gereklidir.
ClassicTagHandler5.java
package _15_ClassicTagHandler; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class ClassicTagHandler5 extends TagSupport { private String myName; public String getMyName() { return myName; } public void setMyName(String myName) { this.myName = myName; } @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.println("Welcome , " + myName); } catch (IOException e) { e.printStackTrace(); } return EVAL_BODY_INCLUDE; } }
classicTag.tld
myName attribute’une karsilik .java dosyamizda myName degiskenini tanimladik.
required true olmasi bu attribute un zorunlu oldugu anlamina gelmektedir.
rtexprvalue true olmasi bu attribute icin expression language’a izin verir.
<tag> <name>myClassicTagName5</name> <tag-class>_15_ClassicTagHandler.ClassicTagHandler5</tag-class> <body-content>scriptless</body-content> <attribute> <name>myName</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
classicTag5.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="myClassicTagURI" prefix="myClassicTags5"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello ClassicTag5</title> </head> <body> <c:set var="name" value="Levent" /> <!-- rtexprvalue true oldugu icin myName attribute'te expression language kullanilabilir. eger false olursa ve expression language kullanilirirsa calisma zamaninda hata verecektir. --> <!-- required true oldugu icin bu attribute zorunludur. --> <myClassicTags5:myClassicTagName5 myName="${name}"> <p>This is classic tag body with attribute !</p> </myClassicTags5:myClassicTagName5> </body> </html>
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer
Leave a Reply