JSTL: core
CORE, 코어
기능 : 변수지원, 흐름제어, URL처리
접두어(Prefix) : c
directive : <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
EL 지원 기능 : catch, out, remove, set
흐름 제어 기능 : choose, forEach, forTokens, if
URL 관리기능 : import, param, redirect, param, url
목차
catch
choose, when, otherwise
forEach
forTokens
import
if
out
param
redirect
set, remove
url
catch
body 위치에서 실행되는 코드의 예외를 잡아내는 역할을 담당한다.
<c:catch var="name">
body content
</c:catch>
<%@ page contentType = "text/html; charset=utf-8" %>
<%@ 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>
choose - when - otherwise
<c:choose/> 태그는 java의 switch 문과 같지만, 조건에 문자열 비교도 가능하고 쓰임의 범위가 넓다. 또한 <c:if/> 태그에 else가 없기 때문에 이의 대체 기능도 수행한다.
<c:choose>
body content
(하나 이상의 <when>과 하나 이하의 <otherwise> 서브태그)
<c:when test="조건_1">
body content
</c:when>
<c:when test="조건_2">
body content
</c:when>
:
<c:otherwise>
conditional block
</c:otherwise>
</c:choose>
● 조건을 판단하는 간단한 예
<%@ page contentType = "text/html; charset=utf-8" %>
<%@ 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>
● 기타 예제
<c:choose>
<c:when test="${param.num1%12==0}">
${param.num1 }은 3과 4의 배수<br/>
</c:when>
<c:when test="${param.num1%3==0}">
${param.num1 }은 3의 배수<br/>
</c:when>
<c:when test="${param.num1%4==0}">
${param.num1 }은 4의 배수<br/>
</c:when>
<c:otherwise>
${param.num1 }은 3또는 4의 배수가 아님<br/>
</c:otherwise>
</c:choose>
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 속성에서 정한 변수로 반복되는 내부 구간에서 사용할 수 있다.
● begin - end
<table>
<tr><td>Value</td>
<td>Square</td></tr>
<c:forEach var="x" begin="0" end="10" step="2">
<tr><td><c:out value="${x}"/></td>
<td><c:out value="${x * x}"/></td></tr>
</c:forEach>
</table>
● 컬렉션의 멤버들 사이를 반복할 때 <c:forEach> 태그의 추가 애트리뷰트인 items 애트리뷰트가 사용된다.
<c:forEach var="dto" items="${list}">
이름:${dto.name}, 제목:${dto.subject}<br/>
</c:forEach>
● varStatus은 상태 값을 의미하며 다음의 값을 갖는다.
- current : 현재 아이템
- index : 0부터의 순서
- count : 1부터의 순서
- first : 현재 루프가 처음인지 반환
- last : 현재 루프가 마지막인지 반환
- begin : 시작값
- end : 끝값
- step : 증가값
<c:forEach items="${RESULT}" var="RESULT" varStatus="status">
forEach의 현재 아이템은 : ${status.current}
</c:forEach>
● 기타 예제
<c:forEach var="n" begin="1" end="9">
${param.num}*${n}=${param.num*n}<br/>
</c:forEach>
<c:forEach var="dto" items="${list}">
이름:${dto.name},
제목:${dto.subject}<br/>
</c:forEach>
<c:forEach var="dto" items="${list}" varStatus="s">
이름:${dto.name},
제목:${dto.subject}<br/>
현재아이템:${s.current}<br/>
0부터의순서:${s.index}<br/>
1부터의순서:${s.count}<br/>
처음이냐?:${s.first}<br/>
마지막이냐?:${s.last}<br/>
</c:forEach>
<c:forEach var="dto" items="${lists}">
<dl>
<dd class="num">${dto.num}</dd>
<dd class="subject"><a href="">${dto.subject}</a></dd>
<dd class="name">${dto.name}</dd>
<dd class="created">${dto.created}</dd>
<dd class="hitCount">${dto.hitCount}</dd>
</dl>
</c:forEach>
forTokens
<c:forTokens/> 는 java.util.StringTokenizer 를 이용한 것이다
<c:forTokens items="stringOfTokens" delims="delimiters"
[var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
<%@ page contentType = "text/html; charset=utf-8" %>
<%@ 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>
import
<c:import/> 는 아주 강력한 도구로 웹 어플리케이션 내부의 자원 접근은 물론이고, http, ftp 같은 외부에 있는 자원도 가져와서 페이지 내에 귀속시킨다. 자유롭게 가공할 수도 있고, 편집도 가능하다.
- 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>
<%@ page contentType = "text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="url" value="http://www.daum.net/"/>
<c:import url="${url}" var="u"/>
<c:out value="${url}"/> 가져옵니다.
<hr/>
-- 홈페이지 결과 출력<br/>
<c:out value="${u}" escapeXml="false"/>
<hr/>
<c:set var="url" value="http://www.naver.com"/>
<c:import url="${url}" var="u"/>
<c:out value="${url}"/> 가져옵니다.
<hr/>
-- 소스 출력<br/>
<pre><c:out value="${u}"/></pre>
<hr/>
<c:set var="url" value="gugu.jsp"/>
<c:import url="${url}" var="u">
<c:param name="su" value="5"/>
</c:import>
<c:out value="${url}"/> 가져옵니다.
<hr/>
<c:out value="${u}" escapeXml="false"/>
<hr/>
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>
<form method="post">
수: <input type="text" name="num">
<input type="submit" value="결과">
</form>
//액션이 없어서 자기 자신에게 parameter를 전송하는 폼
<c:if test="${not empty param.num }">
<c:if test="${param.num % 2 == 0}">
${param.num}은 짝수<br/>
</c:if>
<c:if test="${param.num % 2 != 0 }">
${param.num}은 홀수<br/>
</c:if>
</c:if>
<c:if test="${dataCount==0}">
등록된게시물이음슴
</c:if>
<c:if test="${dataCount!=0}">
${pageIndexList}
</c:if>
<c:if/> 에서 나온 결과를 varName 변수에 넣고, 나중에 활용이 가능하다.
변수의 scope는 임의로 지정할 수 있고, 생략될 경우 기본 값은 page 이며 else 문은 존재 하지 않는다.
● 자바스크립트 제어
// 자바스크립트가 특정조건에 외부노출되는 것을 막음
<c:if test="${sessionScope.session.userId == dto.userId}">
function updateBoard(boardNum)
{
var url = "<%=cp%>/board/update.action"
location.href = url;
}
</c:if>
out
JSP의 표현식을 대체하는 것으로 가장 많이 사용된다.
- Syntax 1 : body 없는 경우
<c:out value="value" [escapeXml="{true|false}"] [default="기본_값"] />
- Syntax 2 : body 있는 경우
<c:out value="value" [escapeXml="{true|false}"] />
기본_값
</c:out>
Hello <c:out value="${user.username}" default="Guest"/>!
<c:out value="${user.company}" escapeXml="false"/>
<c:set var="timezone" scope="session">
<c:out value="${cookie['tzPref'].value}" default="CST"/>
</c:set>
escapeXml 애트리뷰트 또한 선택사항이다.
"<", ">", "&" 같은 캐릭터가 <c:out> 태그에 의해 아웃풋 될 때 종료되는지의 여부를 제어한다.
escapeXml이 true로 설정되어 있다면 이 캐릭터들은 상응하는 XML 인터티(<, >, &)로 바뀐다.(escapeXml 기본값 true)
param
보통 import, redirect, url 태그와 같이 쓰이는 태그. "파라미터=값" 형식을 표현한다.
<c:param 속성="값".../>
<c:import url="/exec/doIt">
<c:param name="action" value="register"/>
</c:import>
// 이 방법은 아래 태그와 같은 효과가 있다 :
<c:import url="/exec/doIt?action=register"/>
redirect
response.sendRedirect()를 대체하는 태그. 컨텍스트를 지정해서 다른 컨텍스트로 이동이 가능하다.
- Syntax 1 : Body 없는 경우
<c:redirect url="value" [context="context"]/>
- Syntax 2 : Body 있는 경우 쿼리 스트링 파라미터 지정
<c:redirect url="value" [context="context"]/>
<c:param> 서브태그
</c:redirect>
<% response.setContentType("text/html"); %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<c:redirect url="/test.jsp"/>
set, remove
set는 JSP의 setAttribute()와 같은 역할을 한다. (page|request|session|application) 범위의 변수(속성)를 설정한다.
remove는 JSP의 removeAttribute()와 같은 역할을 한다. (page|request|session|application) 범위의 변수(속성)를 제거한다.
- Syntax 1 : scope 에 해당하는 변수에 속성 값을 정한다.
<c:set value="value" var="varName" [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>
※ scope 속성이 생략될 경우 기본 값은 page다.
※ var와 target은 동시에 사용할 수 없다.
<c:set var="testObject" value="hello world!"/> // request.setAttribute("testObject", "hello world!")
<c:out value="${testObject}"/> // request.getAttribute("testObject")
var속성의 경우는 비교적 간단하다.
<jsp:useBean id="map" class="java.util.HashMap"/>
<c:set target="${map}" property="hi" value="hello world!"/> // map.put("hi", "hello world!")
<c:out value="${map.hi}"/> // map.get("hi")
<jsp:useBean id="vo" class="com.test.TestVO"/>
<c:set target="${vo}" property="name" value="who?"/> // vo.setName("who?")
<c:out value="${vo.name}"/> // vo.getName()
<c:forEach items="${sampleList}" var="list">
<c:set target="${list}" property="col1" value="1234"/> // sampleList.get(loop).setCol1("1234")
<tr>
<td>${list.col1}</td> // sampleList.get(loop).getCol1()
<td>${list.col2}</td>
<td>${list.col3}</td>
<td>${list.col4}</td>
<td>${list.col5}</td>
<td>${list.col6}</td>
</tr>
</c:forEach>
target속성은 jsp에서 객체 생성 후 사용하거나 기존 객체의 getter/setter를 이용하는 방식이다.
url
<c:url/> 태그는 컨텍스트를 자동으로 추가해서 주소를 자동으로 생성해준다. context 속성이 지정되었을 경우 value와 context 의 값은 /로 시작을 해야 된다. context 속성이 생략되면 당연히 현재의 컨텍스트가 적용된다.
- 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>
<% 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"/>' />
출처 - http://noritersand.tistory.com/113