Servlet & JSP – 26 – JSP Standard Tag Library – 01

Merhaba Arkadaslar,
Bu bolumde JSP Standard Tag Library (JSTL) konusuna giris yapacagiz.

JSTL bolumunde isleyecegimiz core taglar ;

  • <c:out>
  • <c:set>
  • <c:remove>
  • <c:if>
  • <c:choose>
  • <c:when>
  • <c:otherwise>
  • <c:forEach>
  • <c:forTokens>
  • <c:import>
  • <c:param>
  • <c:redirect>
  • <c:url>
  • <c:catch>

JSTL taglarini kullanabilmemiz icin oncelikle jstl ve standard taglibs jarlarina sahip olmamiz gereklidir. Web projemizde jar dosyalarimiz WEB-INF altinda yer alan lib klasorunde olmalidir. Boylelikle deployment sirasinda otomatik olarak deploy edilir ve problem yasamayiz.

Eger bunun disinda bir yere jar dosyanizi ekleyip kullanirsak ,IDE uzerinden bu jar dosyasini gosterirsek  ,  Java Build Path–>Add JArs ,  derleme zamaninda problem yasamayiz fakat calisma zamaninda problem yasariz.

Ornegin Eclipse ile calisiyorsak bu durumda ilgili jar’i deployment assembly eklemek gereklidir. Bunun icin de projeye sag tiklayip Properties—> Deployment Assembly –> Add ile yapabiliriz.

Maven tabanli calistigim icin ben direkt olarak pom.xml e jstl ve standard taglibs jarlarinin dependency bilgisini ekliyorum.

<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
	<version>1.2</version>
</dependency>

<dependency>
	<groupId>taglibs</groupId>
	<artifactId>standard</artifactId>
	<version>1.1.2</version>
</dependency>

jarlarimizi projemize ekledigimize gore artik JSTL kutuphanesi uzerinde calismalarimiza baslayabiliriz.

<c:out>

<c:out> etiketi <%= =%> JSP expression gibi calisir. JSP Expression da oldugu gibi sonucu browserde gostermemizi saglar.

JSTL taglarini kullanabilmemiz icin oncelikle  taglib directive’ini kullanmamiz gereklidir. taglib directive’i JSTL taglarini ya da custom/simple taglari kullanmak icin gereklidir. Ilerleyen bolumlerde bunu inceleyecegiz.

Simdilik JSP dosyamizin basina taglib directive tanimini eklememiz gerektigini bilelim;

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

<c:out> etiketi value attribute’u alir ve bu attribute zorunludur. Ornek kodu inceleyelim ;

	<%="Hello JSP Expression" %>	
	<br>
	
	<!-- c:out JSP Expression gibi calisir, value degerini browserda gosterir. -->
	
	<c:out value="Hello JSTL !" />
        <br>

JSP Scriptlet kodumuz icerisinde bir attribute ekleyebiliriz ve bu attribute degerini JSP Expression kullanarak gosterebiliriz. Benzer sekilde c:out etiketini kullanarak da bunu yapabiliriz. value attribute icerisinde expression kullanabiliriz.

        <%
	   request.setAttribute("name","injavawetrust");
	%>
	
	<%= request.getAttribute("name") %>
	<br>
	
	<!-- value attribute alaninda expression language kullanabiliriz ! -->
	<c:out value="${name}"/>
	<br>

Eger ilgili expression bulunamazsa , ilgili attribute , bean vs yoksa bu durumda problem olmaz, tarayiciya bir sey yazilmaz. Bununla birlikte c:out etiketi default attribute alanina sahiptir. value attribute alaninda yazmis oldugumuz expression null degere sahip olursa bu durumda default calisir. Tabi default attribute alani icin de expression yazabiliriz.

default attribute alanini kullanmak yerine body alaninda da yazabiliriz. Hem default attribute hem body alanini yazarsak bu durumda calisma zamaninda hata aliriz.

	<!-- default attribute'u eger value null'sa yani ilgili attribute bean vs bulunamadiysa calisir. -->
	
	<c:out value="${thisIsNone}" default="i am default" />
	<br>
	
	<!-- default attribute alanini kullanmak yerine body alaninda da yazabiliriz. -->
	<c:out value="${thisIsNone}" >i am default</c:out>	
	<br>
	
	<!-- hem default attribute hem body alanini yazarsak bu durumda calisma zamaninda hata aliriz. -->
	
	<%--
	<c:out value="${thisIsNone}"  default="i am default" >i am default body</c:out>
	
	--%>

c:out etiketi otomatik olarak html taglarindan kacar. escapeXml attribute alani varsayilan olarak true degerine sahiptir.

Ne demek istedigimi daha iyi anlayabilmek icin ornek kodu inceleyelim. Burada tarayiciya    <b> </b> is bold tag yazmak istiyoruz. Bunu JSP Expression ile yazdigimizda <b></b> kodlari html kodu olarak degerlendirilecektir. <c:out> etiketini kullandigimizda ise html kodu olarak degerlendirilmez , boylelikle tarayicida gorebiliriz.

escapeXml varsayilan olarak true oldugu icin eger bu attribute degerini false yaparsak ayni JSP Expression da oldugu gibi calisacaktir ve <b></b> kodu html kodu olarak degerlendirilecektir.

 
	<%="<b> </b> is bold tag" %> 	
	<br> 
	
	<c:out value="<b> </b> is bold tag"/>	
	<br>
	
	<!--  escapeXml varsayilan olarak true dur. -->
	<c:out value="<b> </b> is bold tag" escapeXml="false"/>

jsp dosyamizin tam hali;
cout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

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

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

	
	<%="Hello JSP Expression" %>	
	<br>
	
	<!-- c:out JSP Expression gibi calisir, value degerini browserda gosterir. -->
	
	<c:out value="Hello JSTL !" />		
	<br>
	
	<%
		request.setAttribute("name","injavawetrust");
	%>
	
	<%= request.getAttribute("name") %>
	<br>
	
	<!-- value attribute alaninda expression language kullanabiliriz ! -->
	<c:out value="${name}"/>
	<br>
	
	<!-- default attribute'u eger value null'sa yani ilgili attribute bean vs bulunamadiysa calisir. -->
	
	<c:out value="${thisIsNone}" default="i am default" />
	<br>
	
	<!-- default attribute alanini kullanmak yerine body alaninda da yazabiliriz. -->
	<c:out value="${thisIsNone}" >i am default</c:out>	
	<br>
	
	<!-- hem default attribute hem body alanini yazarsak bu durumda calisma zamaninda hata aliriz. -->
	
	<%--
	<c:out value="${thisIsNone}"  default="i am default" >i am default body</c:out>
	
	 --%>
	 	 
	<%="<b> </b> is bold tag" %> 	
	<br> 
	
	<c:out value="<b> </b> is bold tag"/>	
	<br>
	
	<!--  escapeXml varsayilan olarak true dur. -->
	<c:out value="<b> </b> is bold tag" escapeXml="false"/>

</body>
</html>

jsp dosyamizi calistirdigimizda ;

cout tag

<c:set>

<jsp:setProperty> , Standard Action ile yaptigimiz isi <c:set> JSTL etiketi ile de yapabiliriz.
Bununla birlikte <c:set> in farkli ozellikleri de bulunmaktadir.

<c:set> JSTL etiketinde var ve target isminde 2 tane farkli attribute vardir.

var versiyonu attribute degiskenlerini eklemek/olusturmak icin kullanilir.
target versiyonu bean property(alanlari) veya Map degerlerini eklemek/olusturmak/atamak icin kullanilir.

Oncelikle attribute olusturma yapisini inceleyelim ;

cset.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

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

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

	<!-- scope zorunlu degildir varsayilan olarak page scope kullanilir. -->
	
	<c:set var="mySessionAttribute" scope="session" value="my session value"/>
	
	<c:set var="myRequestAttribute" scope="request">my request value </c:set>
	
	<c:out value="${mySessionAttribute} "/>
	<br>
	<c:out value="${myRequestAttribute} "/>

</body>
</html>

var etiketini kullanarak yeni bir attribute olusturuyoruz. Scope zorunlu degildir varsayilan olarak page scope kullanilir. value attribute alanini kullanabiliriz ya da body alaninda deger verebiliriz.
Hem value hem de body alanini kullanirsak calisma zamaninda hata aliriz.

<c:set> JSTL etiketiyle ekledigimiz bu attributeleri <c:out> JSTL etiketi yardimiyla tarayicimizda gosterebiliriz.

<c:set> etiketini Map icin de su sekilde kullanabiliriz.

cset2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ page import="java.util.Map , java.util.HashMap"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

	<%
		Map myMap = new HashMap();
		request.setAttribute("myMapAttribute", myMap);
	%>

	<c:set target="${myMapAttribute}" property="key1" value="value1" />
	<c:set target="${myMapAttribute}" property="key2">value2</c:set>

	<c:out value="${myMapAttribute.key1}"></c:out>
	<c:out value="${myMapAttribute['key2']}"></c:out>
	
	<!-- target alani null olmamalidir ! yoksa calisma zamaninda exception firlatir. -->
	<%--
	<c:set target="${thereIsNoMap}" property="exception" value="javax.servlet.jsp.JspTagException" />
	 --%>

</body>
</html>

<c:set> etiketinin bu kullaniminda target attribute alanini kullandik. Bu durumda Map ya da bean kullanabiliriz. myMapAttribute adinda bir Map’i request scope’a attribute olarak ekledik.
property alani key degerine karsilik gelmektedir.

Daha sonrasinda <c:out> etiketiyle JSP expression yardimi ile bu value degerlerine ulasabiliriz.
target alani null olmamalidir ! yoksa calisma zamaninda exception firlatir!

cset3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ page import="_13_JSTL.model.Person"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

	<%
		Person person = new Person();	
		request.setAttribute("myperson", person);
	%>

	<c:set target="${myperson}" property="name" value="Levent"></c:set>
	<c:set target="${myperson}" property="surname" value="Erguder"></c:set>
	<c:set target="${myperson}" property="year" value="2015"></c:set>
		
	<c:out value="${myperson.name}"></c:out>
	<c:out value="${myperson.surname}"></c:out>
	<c:out value="${myperson.year}"></c:out>

	<!-- target alani null olmamalidir! Bu durumda calisma zamaninda exception firlatir. -->
	
	<%--
	<c:set target="${thisIsNull}" property="thereIsNoPropery" value="javax.servlet.jsp.JspTagException"></c:set>
	 --%>
	 
	 <!--target null olmasa da eger property yoksa yine calisma zamaninda exception firlatilir. -->
	 
	 <%--
	 <c:set target="${myperson}" property="thereIsNoPropery" value="javax.servlet.jsp.JspTagException"></c:set>
	  --%>
</body>
</html>

Bir diger kullanim olarak <c:set> etiketini bean’ler icin de kullanabiliriz. Bunun icin yine target attribute alanini kullanabiliriz ve target bu durumda null olmamalidir !
property attribute alani bean alanlarina denk gelmektedir. Olmayan bir property kullanildiginda calisma zamaninda exception firlatilir.

  • var ve target attribute alanlarini ayni anda kullanamayiz!
  • scope alani secimliktir varsayilan olarak page scope kullanilir.
  • var alaninda kullandigimiz isimde attribute yoksa olusturulur , bu durumda value null olmamalidir.
  • target alani kullaniliyorsa bu durumda target null olmamalidir. Yoksa calisma zamaninda hata firlatilir.
  • target , Map ya da bean olmalidir. Yoksa hata firlatilir.
  • target bean’se ve ilgili property yoksa yine calisma zamaninda hata firlatilir.

<c:remove>

c:remove etiketi eklenen attribute’leri silmek icin kullanilabilir. Eger scope belirtilmezse ilgili isimde attribute objesi tum scope’lardan kaldirilir.
cremove.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

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

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

	<c:set var="myattribute" scope="request"
		value="request scope attribute"></c:set>
	<c:set var="myattribute" scope="page" value="page scope attribute"></c:set>
	<c:set var="myattribute" scope="session"
		value="session scope attribute"></c:set>
	<c:set var="myattribute" scope="application"
		value="application scope attribute"></c:set>

	<c:out value="${myattribute}"></c:out>
	<br>
	<c:out value="${pageScope.myattribute}"></c:out>
	<br>
	<c:out value="${requestScope.myattribute}"></c:out>
	<br>
	<c:out value="${sessionScope.myattribute}"></c:out>
	<br>
	<c:out value="${applicationScope.myattribute}"></c:out>

	
	<!-- scope belirtilmediginde tum scope alanlarindan ilgili attribute'leri siler. -->
	<c:remove var="myattribute"/>
	
	<p>myattribute is removed</p>
	
	<c:out value="${myattribute}"></c:out>
	<br>
	<c:out value="${pageScope.myattribute}"></c:out>
	<br>
	<c:out value="${requestScope.myattribute}"></c:out>
	<br>
	<c:out value="${sessionScope.myattribute}"></c:out>
	<br>
	<c:out value="${applicationScope.myattribute}"></c:out>
	
</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

Print Friendly, PDF & Email

Leave a Reply

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