본문 바로가기
Dev/frontend

표준 태그 라이브러리 (JSTL) - 2. 코어 태그

by Luigi.yoon 2017. 11. 1.

2. 코어태그

코어태그라이브러리는 if-else나변수의지정등과같이논리적인처리를위해사용되는스크립트코드를대체하기위한태그를제공하며, 관련태근 []와같다.

[ 2] 코어태그라이브러리

기능분류

태그

설명

변수지원

set

JSP에서사용될변수를설정한다.

remove

설정한변수를제거한다.

흐름제어

if

조건에따라내부코드를수행한다.

choose

다중조건을처리할때사용된다.

forEach

컬렉션이나 Map의각항목을처리할때사용된다.

forTokens

구분자로분리된각각의토큰을처리할때사용된다.

URL 처리

import

URL을사용하여다른자원의결과를삽입한다.

redirect

지정한경로로리다이렉트한다.

url

URL을재작성한다.

기타태그

catch

예외처리에사용된다.

out

JspWriter에내용을알맞게처리한후출력한다.

이태그들만잘사용해도복잡한스크립트코드를간단하게표시할수있게된다.

코어태그라이브러리를사용하려면 JSP 페이지에다음과같이 taglib 디렉티브를추가해주어야한다.

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

여기서 prefix 속성에명시된값은코어태그라이브러리를호출할때사용할접두어를의미한다. Uri 속성의값은 [ 1] JSTL이제공하는태그의종류에서보여주었던 URI와동일한것을알수있다.

2.1 변수지원태그

변수지원태그는 JSTL이지원하는태그에서사용할수있는변수를설정하기위해사용된다. 변수지원태그에는 set 태그와 remove 태그가있다.

(1) <c:set> 태그

<c:set> 태그는 EL 변수의값이나 EL 변수의프로퍼티의값을지정할때사용된다. Page, request, session, application 의네영역에저장되어있는객체를 <jsp:useBean> 태그와 <jsp:setProperty> 태그를사용하여 JSP 코드내에서사용될변수를지정하고변수프로퍼티의값을지정할수있는것과마찬가지로, <c:set> 태그는 JSTL의태그에서사용될변수의값을처리할때사용된다.

<c:set> 태그로 EL 변수를생성하는형식

<c:set var="varName" value="varValue" [scope="영역"]></c:set>

<c:set var="varName" [scope="영역"]>varValue</c:set>

Ÿ   var : 값을지정할 EL 변수의이름

Ÿ   value : 변수의값을지정한다. (표현식, EL, 정적인텍스트를사용하여값을지정할수있다.)

Ÿ   scope : 변수를저장할영역을지정한다. 값은 page, request, session, application 중하나가온다. 지정하지않을경우기본값은 page이다.

<c:set> 태그로객체의프로퍼티값을설정하는형식

<c:set target="대상" property="프로퍼티이름" value="값"/>

<c:set target="대상" property="프로퍼티이름"></c:set>

Ÿ   target : 프로퍼티값을설정할대상객체. 표현식 (<%=변수%>)이나 EL 변수(${변수명}) 를지정한다. 대상객체는자바빈객체나 Map 이어야한다.

Ÿ   property : 설정할프로퍼티의이름. target이자바빈객체인경우프로퍼티이름에해당하는 set 메서드를제공해주어야한다. 예를들어, 프로퍼티이름이 name인경우 target 객체는 setName() 메서드를제공해야한다. Map인경우 Map.put(프로퍼티이름, ) 을이용해서값을추가한다.

Ÿ   value : 설정할프로퍼티의값

주의할점

<c:set var="member" value="<%= member %>"></c:set>

<c:set target="member" property="name" value="홍길동"/>

target 대상이 EL 변수인경우 target 속성의값을 ${member} 와같이 EL을이용해서설정해주어야한다.

[ 3] <c:set> 태그의속성설명요약

속성

표현식/EL

타입

설명

var

사용불가

String

EL 변수이름

value

사용가능

Object

변수에할당할값

scope

사용불가

String

변수를생성할영역, 기본값은 page

target

사용가능

Object

프로퍼티값을설정할객체지정

property

사용가능

String

프로퍼티이름

(2) <c:remove> 태그

<c:remove> 태그는 <c:set> 태그로지정한변수를삭제할때사용되며, 구문은다음과같다.

<c:remove var="varName" [scope="영역"]/>

삭제하는예. scope를지정하지않으면동일한이름으로저장된모든영역의변수를모두삭제한다.

<c:set var="name" value="홍길동" scope="request"/>

<c:remove var="name"/>

[ 4] <c: remove > 태그의속성설명요약

속성

표현식/EL

타입

설명

var

사용불가

String

삭제할 EL 변수이름

scope

사용불가

String

삭제할변수가포함된영역

2.2 흐름제어태그

JSTL에서가장많이사용되는태그중에하나는흐름제어태그이다. JSP 코드에서스크립트코드를사용할경우 if-else 블록이나 for 블록등이조금만중첩되어사용되더라도 <%, %>, {, } 등이복잡하게얽히게되며, 이는개발자가코드를이해하는데방해가되는요소가된다. 이런코드의복잡함을없애기위해 JSTL은태그를사용하여흐름제어를처리할수있도록하였다.

(1) <c:if> 태그

<c:if> 태그는자바언어의 if 블록과비슷한기능을제공한다. 중첩된 if-else 블록과같은효과를낼순없다. 단순한 if 블록을대체하는데쓰인다.

<c:if test="조건">

...

</c:if>

<c:if> 태그의 test 속성의계산결과를 var 속성에지정한 EL 변수에저장할수있다.

<c:if test="<%= some condition %>" var="testResult">

...

</c:if>

[ 5] <c:if> 태그의속성설명요약

속성

표현식/EL

타입

설명

test

사용가능

boolean

검사조건

var

사용불가

String

EL 변수이름

scope

사용불가

String

변수를생성할영역, 기본값은 page

(2) <c:choose>, <c:when>, <c:otherwise> 태그

<c:choose> 태그는자바의 switch 구문과 if-else 블록을혼합한형태로서다수의조건문을하나의블록에서수행하고자할때사용된다.

<c:choose>

     <c:when test="${member.level == 'trial'}">

           ...

     </c:when>

     <c:when test="${member.level == 'regular'}">

           ...

     </c:when>

     <c:otherwise>

           ...

     </c:otherwise>

</c:choose>

(3) <c:forEach> 태그

<c:forEach> 태그는배열, Collection 또는 Map에저장되어있는값들을순차적으로처리할때사용할수있는태그로서, 자바의 for, do-while 등을대신해서사용할수있다.

<c:forEach var="i" begin="1" end="10" step="2">

      ${i } 사용

</c:forEach>

var 속성에지정한변수 i 1부터 10까지의값중에서 2씩증가하는 1,3,5,7,9의값을갖게된다. (step은생략가능)

<c:forEach var="item" items="<%= someItemList %>" varStatus="status">

      ${status.index + 1 } 번째 항목 ${item.name }  

</c:forEach>

자바의 for each 문처럼 List와같은컬렉션을반복문에사용할수있다. <c:forEach>를사용하면 getter 메서드를사용할필요없이객체의속성값을쉽게불러올수있다.

varStatus속성은루프정보를담는 LoopTagStatus 객체를저장할변수명을값으로갖는다. 관련프로퍼티는다음과같다.

Ÿ   index : 루프실행에서현재인덱스

Ÿ   count : 루프실행횟수

Ÿ   begin : begin 속성값

Ÿ   end : end 속성값

Ÿ   step : step 속성값

Ÿ   first : 현재실행이첫번째실행인경우 true

Ÿ   last : 현재실행이루프의마지막실행인경우 true

Ÿ   current : 컬렉션중현재루프에서사용할객체

Ÿ    

[ 6] <c:forEach> 태그의속성설명요약

속성

표현식/EL

타입

설명

var

사용불가

String

몸체에서사용할 EL 변수이름

items

사용가능

Collection, Iterator, Enumeration, Map, 배열

반복처리할데이터

varStatus

사용불가

String

루프상태를저장할 EL 변수이름

begin

사용가능

int

시작인덱스값

end

사용가능

int

끝인덱스값

step

사용가능

int

인덱스증분값

(4) <c:forTokens> 태그

<c:forTokens> 태그는 java.util.StringTokenizer 클래스와같은기능을제공하는태그로서기본형식은다음과같다.

<c:forTokens var="token" items="문자열" delims="구분자">

      ${token }의 사용

</c:forTokens>

<c:forTokens> 태그는 items 속성으로전달받은문자열을구분자를이용해서나눈뒤, 나뉘어진각문자열을 var 속성에명시한변수에저장한다. 예를들어, 아래코드는 tiems 속성의값을콤마(“,”)로나눈 “red”, “green”, “blue” 문자열을 color 변수에차례대로대입한다.

<c:forTokens var="color" items="red, green, blue" delims=",">

      ${color }

</c:forTokens>

<c:forTokeans> 태그는 <c:forEach> 태그와동일하게 begin, end, step, varStatus 속성을제공한다.

콤마(“,”)와점(“.”)을구분자로사용해서문자열로부터토큰을추출하는예

<c:forTokens var="token"

items="빨강색,주황색.노란색.초록색,파랑색,남색.보라색" delims=",.">

      ${token }

</c:forTokens>

2.3 URL 처리태그

URL 관련태그는내부/외부자원의삽입(<c:import> 태그), URL 생성(<c:url> 태그), 리다이렉트처리(<c:redirect> 태그)의세가지기능을제공한다.

(1) <c:import> 태그

<c:import> 태그는특정 URL의결과를읽어와현재위치에삽입하거나 EL 변수에저장할때사용된다. <jsp:include>는동일한웹어플리케이션내에위치한자원을포함해주는기능이라면, <c:import> 태그는동일한웹어플리케이션뿐만아니라외부의다른자원을읽어와포함시킬수있도록해준다.

<c:import> 태그의기본적인사용형식은다음과같다. var 속성, scope 속성, charEncoding 속성은생략가능하다.

<c:import> 태그의기본적인사용형식은다음과같다. var 속성, scope 속성, charEncoding 속성은생략가능하다.

<c:import url="URL" [var="변수명"] [scope="영역"] [charEncoding="캐릭터셋"]></c:import>

var 속성을명시할경우해당 URL로부터읽어온데이터를 var 속성에명시한 EL 변수명에저장한다. 이때, scope 속성은 EL 변수를생성할영역을입력한다. var 속성을지정하지않으면현재위치에 URL로부터읽어온결과를출력한다.

url 속성에는다음과같이절대 URL과상대 URL의두가진타입의값을입력할수있다.

절대 URL일경우 <c:import> java.net.URL java.net.URLConnection 을이용해서데이터를읽어온다. 만약 charEncoding 속성값을지정했다면, URLConnection으로부터데이터를읽어올때 charEncoding 속성에명시된캐릭터인코딩을이용한다.

charEncoding 속성을지정하지않은경우에는 URLConnection.getContentType() 메서드가리턴한값이응답캐릭터인코딩을포함하고있으면해당캐릭터인코딩을이용해서응답텍스트를읽어오고, 응답캐릭터인코딩을포함하고있지않다면 ISO-8859-1을이용한다.

상대 URL을입력한경우 <c:import> 태그는 <jsp:include> 액션태그와동일한방식으로동작한다. 차이점은 <c:import> 태그는실행결과를 EL 변수에보관한뒤필요에따라알맞은처리를할수있다는점이다.

요청파라미터를추가하는방식은다음의 2가지방식이있다.

Ÿ   URL에직접입력               (GET 방식)

Ÿ   <c:param> 태그를이용해서입력 (POST 방식)

URL 직접입력할때의예

<c:import url="http://search.naver.com/search.naver?sm=tab_hty&where=nexearch&query=test" />

<c:param> 태그를이용할때의예 ( URL 인코딩처리를직접해주지않아도된다. )

<c:import url="http://search.naver.com/search.naver">

      <c:param name="sm" value="tab_hty" />

      <c:param name="where" value="nexearch" />

      <c:param name="query" value="test" />

</c:import>

[ 7] <c:import> 태그의속성설명요약

속성

표현식/EL

타입

설명

url

사용가능

String

읽어올 URL 주소

var

사용불가

String

읽어온결과를저장할 EL 변수이름

scope

사용불가

String

변수를생성할영역

charEncoding

사용가능

String

결과를읽어올때사용할캐릭터인코딩

(2) <c:url> 태그

<c:url> 태그는 URL을생성해주는기능을제공하며, 기본사용방법은다음과같다.

<c:url value="URL" [var="varName"] [scope="영역"]>

      <c:param name="이름" value="값" />

</c:url>

var 속성과 scope 속성은생략가능하며, <c:import> 태그와마찬가지로 <c:param> 태그를이용해서파라미터를 URL에추가할수있다. var 속성을지정하지않은경우현재위치에생성한 URL을출력하며, var 속성을지정한경우해당변수에생성한 URL을할당한다.

[ 8] <c: url > 태그의속성설명요약

속성

표현식/EL

타입

설명

value

사용가능

String

읽어올 URL

var

사용불가

String

읽어온결과를저장할 EL 변수이름

scope

사용불가

String

변수를저장할영역

(3) <c:redirect> 태그

<c:redirect> 태그는 response.sendRedirect()처럼지정한페이지로리다이렉트시켜주는기능을제공한다.

<c:redirect url="URL" [context="콘텍스트 경로"]>

      <c:param name="이름" value="값" />

</c:redirect>

url 속성의값이슬래시로시작할경우리다이렉트되는 URL에는콘텍스트경로가추가된다.

만약다른콘텍스트경로에포함된 URL로리다이렉트하고싶다면 context 속성에다른콘텍스트의경로를적어주면된다.

[ 9] <c:redirect> 태그의속성설명요약

속성

표현식/EL

타입

설명

url

사용가능

String

리다이렉트할 URL

context

사용가능

String

콘텍스트경로

2.4 기타코어태그

(1) <c:out> 태그

<c:out> 태그는 JspWriter에데이터를출력할때사용되는태그로서다음과같이사용할수있다.

<%--방법 1 --%>

<c:out value="value" [escapeXml="(true | false)"] [default="defaltValue"]/>

<%--방법 2 --%>

<c:out value="value" [escapeXml="(true | false)"] >

      defaltValue

</c:out>

<c:out> 태그의속성

Ÿ   value : JspWriter에출력할값을나타낸다. 일반적으로 value 속성의값은 String과같은문자열이다. 만약 value의값이 java.io.Reader의한종류라면 out 태그는 Reader로부터데이터를읽어와 JspWriter 에값을출력한다.

Ÿ   escapeXml : 이속성의값이 true일경우 [ 16.10]과같이문자를변경한다. 생략할수있으면생략할경우기본값은 true이다.

Ÿ   default : value 속성에서지정한값이존재하지않을때사용될값을지정한다.

[ 10] escapeXml 속성이 true 일경우변환되는문자

문자

변환된형태

<

&lt;

>

&gt;

&

&amp;

'

&#039;

"

&#034;

[ 8] <c:out> 태그의속성설명요약

속성

표현식/EL

타입

설명

value

사용가능

Object

출력할값

escapeXml

사용가능

boolean

특수문자를변환할지의여부

default

사용가능

Object

value의결과값이 null인경우출력할값

(2) <c:catch> 태그

<c:catch> 태그는발생된예외를 EL 변수에저장할때사용되는태그로서, 다음과같이사용된다.

<c:catch var="exName">

      예외가 발생할 수 있는 코드

</c:catch>

...

${exName } 사용

<c:catch> 태그블록에서예외가발생할경우그예외객체는 exName 변수에할당된다.

따라서 <c:catch> 태그블록밖에서는이 exName 변수를사용하여예외에따른처리를하면된다.

<c:catch var="ex">

      name 파라미터의 값 = <%= request.getParameter("name") %><br/>

      <% if(request.getParameter("name").equals("test")){ %>

            ${param.name }은 test 입니다.

      <% } %>

</c:catch>

<c:if test="${ex != null} ">

      예외가 발생하였습니다 : <br/>

      ${ex }

</c:if>