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 and simple tag

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 ;

classic tag1

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 tag2

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>

classic tag3

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>

skip page

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>

classic tag with attribute

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

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *