JSTL core

강의노트/웹 2013. 7. 10. 10:17

core 태그 사용하기

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

기능

태그

prefix

EL 지원

catch , out , remove , set

c

흐름 제어

choose (when , otherwise) , forEach , forTokens , if

URL 관리

Import (param) , redirect (param) , url (param)

 

1. <c:out/>

가장 많이 쓰게 되는 것은 JSP 의 표현식을 대체하는 <c:out/> 이다. 다음과 같은 형식을 갖고 있다.

body 없는 경우

<c:out value="value" [escapeXml="{true|false}"] [default="기본값"] />

 

body 있는 경우

<c:out value="value" [escapeXml="{true|false}"] />

기본값

</c:out>

 

 

[] 으로 둘러 쌓인 부분은 생략 가능한 부분이다. value default 값은 일반 문자열이나 EL 이 들어간다. value 안에 JSP의 표현식을 사용하려 한다면 RT 기반의 <c_rt:out> 을 사용해야 된다는 것은 이전 예제에서 살펴 보았다.

escapeXml 속성은 값 중에 포함된 < > & ' " 문자들을 각각 &lt; &gt; &amp; &#039; &#034; 로 출력한다. 생략될 경우 true 가 기본 값이다.

null 값의 처리에 대해서 JSP expression 의 경우는 "null" 문자열로 출력이 되었던 것을 jstl의 스펙에서는 이 경우 빈 문자열("")또는 기본값으로 처리한다고 명시되어있다.

 

2. <c:set/>, <c:remove/>

<c:set/> 의 기본형식은 다음과 같다. scope 속성이 생략될 경우 기본값은 page 이다.

Syntax 1: scope 에 해당하는 변수에 속성 값을 정한다.

<c:set var="varName" value="value" [scope="{page|request|session|application}"]/>

 

 

Syntax 2: scope 에 해당하는 변수에 body 값을 정한다.

<c:set var="varName" [scope="{page|request|session|application}"]>

body content

</c:set>

 

Syntax 3: 속성 값으로 target 객체의 프로퍼티 값을 정한다.

<c:set value="value"

target="target" property="propertyName"/>

 

Syntax 4: body 값으로 target 객체의 프로퍼티 값을 정한다.

<c:set target="target" property="propertyName">

body content

</c:set>

 

변수에 값을 할당한다. 빈과 같은 객체에 할당하기 위해서는 target property속성을 이용한다.

 

<c:remove/> JSP removeAttribute() 와 같은 역할을 한다. 해당 scope 에 있는 변수를 제거하는 역할을 한다.

 

3. <c:catch/>

<c:catch/> body 위치에서 실행되는 코드의 예외를 잡아내는 역할을 담당한다. var 속성을 지정해서 변수를 선언하면 그 변수에 예외의 내용이 들어가게 된다.

 

다음 예제는 이상의 태그를 사용한 예제이다.

예제 4.   jstlcore01.jsp

<% response.setContentType("text/html"); %>

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

<h3>코어 </h3>

<h4>&lt;c:out></h4>

<pre>

${1+2} <c:out value="${1+2}"/>

${1>3} <c:out value="${1>3}"/>

${1 gt 3} <c:out value="${1 gt 3}"/>

 

$표시 <c:out value="${'${'}test}"/>

 

escapeXml 속성; 기본값은 false

false: <c:out value="<b>bold</b> <,>,&,',\" " escapeXml="false"/>

true:  <c:out value="<b>bold</b> <,>,&,',\" " escapeXml="true"/>

 

" 큰따옴표 사용주의; ' 작은따옴표로 대치

&lt;c:out value='&lt;font color="blue">파랑&lt;/font>'/>

<c:out value='<font color="blue">파랑</font>' escapeXml="false"/>

 

<hr><h4>&lt;c:set></h4>

set session scope var "name": <c:set var="name" value="하늘" scope="session"/>

c:out name: <c:out value="${name}"/>

expression name: <%= session.getAttribute("name")%>

 

set page scope var "name": <c:set var="name">

  hello

</c:set>

c:out name: <c:out value="${pageScope.name}"/>

c:out sessionScope.name: <c:out value="${sessionScope.name}"/>

expression name: <%= session.getAttribute("name")%>

 

<hr><h4>&lt;c:remove></h4>

remove session scope var "name": <c:remove var="name" scope="session"/>

expression name: <%= session.getAttribute("name")%>

c:out sessionScope.name: <c:out value="${sessionScope.name}"/>

 

<hr><h4>&lt;c:catch></h4>

<c:catch var="errmsg">

line1

<%=1/0 %>

line2

</c:catch>

<c:out value="${errmsg}"/>

</pre>

 

 

value 속성에 들어가는 값은 문자열과 EL 이다. EL의 경우 ${} 안에서 나온 결과값을 표시한다. 부등호 > gt 는 같은 뜻이다. "${" 를 표시하기 위해서는 EL 로 감싸야 된다. ${'${'} 로 해야 표시된다.

escapeXml 속성은 브라우저에서 특수한 기능을 하는 문자 표시 여부를 결정한다. false 값일 경우는 태그가 먹힌 굵은 글씨의 bold 가 나오고, true 일 경우는 '<' '>'를 각각 '&lt;','&gt;' 로 변환한다. 결과는 <b>bold</b> , 브라우저에서 태그가 보이도록 나온다.

큰따옴표와 작은따옴표는 바꿔서 쓸 수 있다. 대신 짝이 맞아야 된다. 또한 하나로 다 이어서 쓸 경우 변환과정에서 에러가 나기 때문에 주의해야된다.

따옴표 사용 예

외부

문자열내부

사용

<c:out value='<font color="blue">파랑</font>' />

작은

가능

<c:out value="<font color='blue'>파랑</font>" />

작은

가능

<c:out value="<font color="blue">파랑</font>" />

불가

session 스코프에 name 이라는 key "하늘"을 넣는다. <c:out value="${name}"/> 으로 scope 를 지정하지 않아도 내장 객체를 훑어서 sessionScope에서 걸리는 "name"키를 찾아서 출력한다. 이 값은 스크립틀릿에서도 참고할 수 있다.

page 스코프에 같은 key "hello" 라는 값을 넣으면 <c:out value="${name}"/> 은 더 이상 session 에 있는 값을 가져오지 않는다.

<c:remove/> 를 통해서 scope 속성에 지정된 key 값을 제거한다.

 

예제에서 <c:catch/> 태그는 body 실행 도중에 <%=1/0 %> 에서 예외가 발생한 것을 errmsg 라는 변수에 넣는다. 이 후에 <c:out/> 을 통해서 에러 메시지를 표시한다.

 

4. <c:if/>

<c:if/> 는 흔히 보는 조건문이다. 형식은 다음과 같다.

Syntax 1: Body 없는 경우

<c:if test="testCondition"

var="varName" [scope="{page|request|session|application}"]/>

 

Syntax 2: Body 있는 경우

<c:if test="testCondition"

[var="varName"] [scope="{page|request|session|application}"]>

body content

</c:if>

 

 

<c:if/> 에서 나온 결과를 varName 변수에 넣고, 나중에 활용이 가능하다. 변수의 scope는 임의로 지정할 수 있고, 생략될 경우 기본값은 page 이다.

 

5. <c:choose/>, <c:when/>, <c:otherwise/>

<c:choose/> 태그는 java switch 문과 같지만, 조건에 문자열 비교도 가능하고 쓰임의 범위가 넓다. 또한 <c:if/> 태그에 else 가 없기 때문에 이의 대체 기능도 수행한다.

형식은 다음과 같다.

<c:choose>

body content

(하나 이상의 <when> 과 하나 이하의 <otherwise> 서브태그)

    <c:when test="조건">

        body content

    </c:when>

   

    <c:otherwise>

        conditional block

    </c:otherwise>

</c:choose>

 

조건 판단을 수행하는 간단한 예제이다.

예제 5.   jstlcore02.jsp

<% response.setContentType("text/html"); %>

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

<h3>조건</h3>

파라메터 없음:<c:out value="${empty param.name}" />

<h4>&lt;c:if test=""></h4>

<c:if test="${empty param.name}">

<form>

이름을 적어주세요.<br>

    <input type="text" name="name">

    <input type="submit" value="확인">

</form>

</c:if>

<c:if test="${!empty param.name}">

    안녕하세요. <c:out value="${param.name}"/>.

</c:if>

 

<h4>&lt;c:choose> &ltc:when test=""> &ltc:otherwise></h4>

<c:choose>

    <c:when test="${empty param.name}">

        <form>

        이름을 적어주세요.<br>

            <input type="text" name="name">

            <input type="submit" value="확인">

        </form>

    </c:when>

    <c:when test="${param.name=='admin'}">

        안녕하세요. 관리자님.

    </c:when>

    <c:otherwise>

        안녕하세요. <c:out value="${param.name}"/>.

    </c:otherwise>

</c:choose>

파라메터 name 값이 없는 경우 입력 폼을 출력한다. 파라메터 name 의 값이 "admin"일 경우 관리자를 표시하고, 그 외에는 파라메터 값을 그대로 출력한다.

파라메터의 유무는 empty !empty 연산자를 통해서 확인할 수 있다.

 

6. <c:forEach/>, <c:forTokens/>

<c:forEach/> 는 강력한 반복실행 태그이다. 형식은 다음과 같다.

Syntax 1: 객체 전체에 걸쳐서 반복

<c:forEach [var="varName"] items="collection"

           [varStatus="varStatusName"]

           [begin="begin"] [end="end"] [step="step"]>

    body content

</c:forEach>

 

Syntax 2: 지정한 횟수만큼 반복

<c:forEach [var="varName"]

           [varStatus="varStatusName"]

           begin="begin" end="end" [step="step"]>

    body content

</c:forEach>

 

<c:forEach/> 태그는 여러가지로 활용이 가능하다. 원하는 구간만큼 반복할 수도 있고, 객체를 받아와서 그 객체의 길이만큼 반복할 수도 있다. begin , end 속성은 시작번호와 끝번호를 지정하고, step 속성을 이용해서 증가 구간을 정할 수 있다. var 속성에서 정한 변수로 반복되는 내부 구간에서 사용할 수 있다.

 

<c:forTokens/> java.util.StringTokenizer 를 이용한 것이다. 형식은 다음과 같다.

Syntax

<c:forTokens items="stringOfTokens" delims="delimiters"

[var="varName"]

[varStatus="varStatusName"]

[begin="begin"] [end="end"] [step="step"]>

body content

</c:forEach>

 

<c:forEach/> <c:forTokens/> 를 활용한 예제이다.

예제 6.   jstlcore03.jsp

<% response.setContentType("text/html"); %>

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

<h3>반복</h3>

<h4>&lt;c:forEach></h4>

 

<c:forEach var="one" begin="1" end="10">

    <c:out value="${one}"/>

</c:forEach>

<p><b>header</b></p>

<c:forEach var="h" items="${header}">

    <c:out value="${h.key}:${h.value}"/><br>

</c:forEach>

 

<h4>&lt;c:forTokens></h4>

<c:forTokens var="one"

            items="서울|인천,대전,대구,부산,광주,평양"

            delims="," varStatus="sts">

    <c:out value="${sts.count}:${one}"/>&middot;

</c:forTokens>

<hr>

<c:forTokens var="one"

            items="서울|인천,대전,대구,부산,광주,평양"

            delims=",|" varStatus="sts">

    <c:out value="${sts.count}:${one}"/>&#149;

</c:forTokens>

 

예제의 첫번째 <c:forEach/> 에서는 1에서 10까지 반복하면서 값을 출력한다. 이때 var속성의 one변수에는 진행중인 값이 저장된다.

두번째 <c:forEach/> 반복문을 보면 items 속성에 header 객체를 받아온다. header 객체는 Map 형태이고, getKey() getValue() 메소드의 사용이 가능하기 때문에 h.key h.value 를 통해서 출력할 수 있다.

<c:forTokens/> 태그는 StringTokenizer 와 동일한 기능을 한다. delims 속성에 정해진 char 로 나뉘어지게 된다. 마지막 반복구간에서 마디로 나누는 기준은 , | 두 가지이다.

varStatus 속성에서 정해준 변수는 .index .count 를 사용할 수 있고, 시작 번호는 각각 0 1 이다.

 

7. <c:import/>

이제 소개할 <c:import/> 는 아주 강력한 도구이다. 웹 어플리케이션 내부의 자원 접근은 물론이고, http, ftp 같은 외부에 있는 자원도 가져와서 페이지 내에 귀속시킨다. 자유롭게 가공할 수도 있고, 편집도 가능하다. <c:import/> 의 형식은 다음과 같다.

Syntax 1: 해당 주소를 바로 출력하거나 String 에 담아놓는다.

<c:import url="url" [context="context"]

        [var="varName"] [scope="{page|request|session|application}"]

        [charEncoding="charEncoding"]>

   <c:param> 서브 태그 위치

</c:import>

 

Syntax 2: 해당 주소의 컨텐츠를 Reader 객체로

<c:import url="url" [context="context"]

        varReader="varReaderName"

        [charEncoding="charEncoding"]>

    varReader 를 사용하는 액션

</c:import>

스트림으로 받아와서 파일로 저장하거나, DB에 입력할 수도 있도록 되어있다.

다음은 간단한 예제이다.

예제 7.   jstlcore04.jsp

<% response.setContentType("text/html"); %>

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

 

<c:set var="url" value="http://www.google.co.kr/"/>

<c:import url="${url}" var="u"/>

<c:out value="${url}"/> 가져옵니다.

<hr>

<base href="<c:out value="${url}"/>">

    <c:out value="${u}" escapeXml="false"/>

</base>

<hr>

 

<c:set var="url" value="http://www.okjsp.pe.kr"/>

<c:import url="${url}" var="u"/>

<c:out value="${url}"/> 가져옵니다.

<hr>

<pre><c:out value="${u}"/></pre>

<hr>

 

<c:set var="url" value="ftp://ftp.dacom.co.kr"/>

<c:import url="${url}" var="u"/>

<c:out value="${url}"/> 가져옵니다.

<hr>

<pre><c:out value="${u}"/></pre>

<hr>

 

<c:set var="url" value="jstlcore02.jsp"/>

<c:import url="${url}" var="u">

    <c:param name="name" value="admin"/>

</c:import>

<c:out value="${url}"/> 가져옵니다.

<hr>

<c:out value="${u}" escapeXml="false"/>

<hr>

4개의 주소를 불러오는 예제이다.

처음에는 구글사이트를 불러서 그대로 표시한다. escapeXml 속성을 false 로 해야 브라우저에 태그가 나타나지 않는다.

<base href=""> 태그는 소스를 가져왔을 때 상대경로에 있는 주소의 기준점이 된다. 따라서 상대경로로 표시된 이미지 등을 깨지지 않고 표시할 수 있다.

두번째는 okjsp 사이트를 가져와서 소스를 보여준다. escapeXml 속성이 생략되면 true값으로 지정되고, 태그를 볼 수 있게 했다.

세번째는 ftp.dacom.co.kr 에 있는 내용을 가져온다.

마지막에는 앞에서 보았던 jstlcore02.jsp 를 불러오는 예제이다. <c:param/> 태그를 내부에 두어서 파라메터값을 보낼 수 있다.

 

8. <c:url/>

<c:url/> 태그는 컨텍스트를 자동으로 추가해서 주소를 자동으로 생성해준다. context 속성이 지정되었을 경우 value context 의 값은 / 로 시작을 해야된다. context 속성이 생략되면 당연히 현재의 컨텍스트가 적용된다. <c:url/> 의 형식은 다음과 같다.

Syntax 1: Body 없는 경우

<c:url value="value" [context="context"]

        [var="varName"] [scope="{page|request|session|application}"]/>

 

Syntax 2: Body 있는 경우 쿼리 스트링 파라메터 지정

<c:url value="value" [context="context"]

        [var="varName"] [scope="{page|request|session|application}"]>

    <c:param> 서브태그

</c:url>

 

다음은 간단한 예제이다.

예제 8.   jstlcore05.jsp

<% response.setContentType("text/html"); %>

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

 

<c:url value="/images/tomcat.gif"/>

<img src="<c:url value="/images/tomcat.gif"/>">

코드를 실행하면, <img src="/chap9/images/tomcat.gif">  와 같이 출력이 된다. ROOT 컨텍스트일 경우는 <img src="/images/tomcat.gif"> 와 같이 출력된다.

다른 컨텍스트를 사용하는 경우 정적인 컨텐츠의 주소를 쓰기 위해서는 jsp 에서는 <img src="<%=request.getContextPath()%>/images/tomcat.gif"> 와 같이 처리를 해주어야 되었다. 이런 경우를 대체하는 태그이다.

 

9. <c:redirect/>

response.sendRedirect() 를 대체하는 태그이다. 컨텍스트를 지정해서 다른 컨텍스트로 이동이 가능하다.

<c:redirect/> 의 형식은 다음과 같다.

Syntax 1: Body 없는 경우

<c:redirect url="value" [context="context"]/>

 

Syntax 2: Body 있는 경우 쿼리 스트링 파라메터 지정

<c:redirect url="value" [context="context"]/>

    <c:param> 서브태그

</c:redirect>

 

다음은 간단한 예제이다.

예제 9.   jstlcore06.jsp

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

 

<c:redirect url="/jstlcore01.jsp"/>

<c:url/> 태그와 마찬가지로 context 속성을 지정하면, value context 의 값은 / 로 시작을 해야된다. <c:param/> 태그를 중첩시켜서 사용할 수도 있다.

 

10. <c:param/>

<c:param/> 은 다음과 같이 url 에 바로 붙여서 쓸 수도 있다.

<c:import url="/exec/doIt">

  <c:param name="action" value="register"/>

</c:import>

이 방법은 아래 태그와 같은 효과가 있다.

<c:import url="/exec/doIt?action=register"/>

 

'강의노트 > ' 카테고리의 다른 글

JSTL SQL 태그  (0) 2013.07.11
JSTL 국제화 지역화 태그  (0) 2013.07.10
JSTL_EL  (0) 2013.07.09
JSTL(JSP Standard Tag Library)  (0) 2013.07.09
DTO와 DAO 패턴  (0) 2013.06.14