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 속성은 값 중에 포함된 < > & ' " 문자들을 각각 < > & ' " 로 출력한다. 생략될 경우 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><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"/>
" 큰따옴표 사용주의; ' 작은따옴표로 대치 <c:out value='<font color="blue">파랑</font>'/> <c:out value='<font color="blue">파랑</font>' escapeXml="false"/>
<hr><h4><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><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><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 일 경우는 '<'과 '>'를 각각 '<','>' 로 변환한다. 결과는 <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><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><c:choose> <c:when test=""> <c: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><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><c:forTokens></h4> <c:forTokens var="one" items="서울|인천,대전,대구,부산,광주,평양" delims="," varStatus="sts"> <c:out value="${sts.count}:${one}"/>· </c:forTokens> <hr> <c:forTokens var="one" items="서울|인천,대전,대구,부산,광주,평양" delims=",|" varStatus="sts"> <c:out value="${sts.count}:${one}"/>• </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 |