출처: http://greatbeat.tistory.com/tag/JSTL
커스텀태그를 공부하면서 jsp페이지에서 자바코드를 추출하는데 탁월한 성능을 발휘하는 모습을 보았다. 허나 이것을 만든다고 생각하면, 아직도 좀 아찔한 감이 남아있다. 개발시간은 촉박한데, 로직 부분을 빼낸다고, tld 만들고, 태그핸들러 만들고, 컴파일하고, 잘 동작하는지 테스트해보고 하려면 사실 시간이 더 많이 소요되기 때문에 망설여지는 것이 사실이다.
하지만 커스텀태그 소개하면서 계속 얘기했던 것은 자주 쓰이는 커스텀태그들을 표준으로 정해서 모아놓은 것이 있으니까, 이것들만 잘 찾아서 쓰면 된다고 얘기했다. 정말 알짜들만 모아놓았다. 최정예 커스텀태그들을 모아서 이름을 붙여준 것이 JSP Stadard Tag Library 이고, 줄여서 JSTL 이라고 부른다. JCP(http://www.jcp.org )에서 표준을 제정했다. JSR-52 에서 각계의 전문가들이 심사 후에 알짜들을 모아놓은 것이다.
집필하는 현재 JSTL은 JSP2.0 스펙에 포함되었다. 따라서 JSP2.0 의 표준을 제일 먼저 구현해서 참고를 삼는 톰캣5.0 이 정식으로 발표된다면, 별다른 설치를 하지 않고 바로 JSTL을 사용할 수 있게 된다. (이미 발표된 톰캣5.0 알파버전에는 JSTL의 기능은 빠져 있다. EL 과 심플 커스텀태그와 태그파일의 기능은 들어가 있고, JSTL과 JSF는 빠져있다.)
JSTL 은 EL 을 이용해서 객체의 접근을 쉽게 할 수 있다. jsp 에서 객체의 접근은 먼저 선언부터 되어야 되지만, EL에서는 별다른 선언없이도 객체를 받아서 처리할 수 있게 되었다. 이에 관해서는 후에 예제를 통해서 살펴보겠다.
JSTL 에 관련된 최신 정보는 sun의 jstl 홈페이지 http://java.sun.com/products/jsp/jstl 와 자카르타 프로젝트의 taglibs http://jakarta.apache.org/taglibs 를 통해서 얻을 수 있다.
JSTL은 태생이 커스텀태그이기 때문에 jsp와 밀접하게 관계가 있다. application, session, request, response, pageContext 등의 내장객체에 쉽게 접근하며, 그 외에도 파라메터, 헤더, 쿠키 등을 복잡한 코드를 사용하지않고, 쉽게 직관적으로 사용할 수 있다. 또한 기본적인 연산이나 객체의 비교 등을 .equals() 메소드 등을 이용하는 대신 == 와 같이 쉽게 구현했으며, 조건, 반복, 이동에 대한 태그를 지원하기 때문에 태그만으로도 반복 기능을 구현할 수 있다.
JSTL 의 처리영역은 크게 4가지로 나누어진다. core, format, xml, sql 로 기능이 구분되고, 각각의 기능은 이름이 말해 주듯, 기본기능, 형식화, xml처리, sql처리를 담당한다.
JSTL은 JSP2.0 표준 스펙에 포함이 되었지만 아직 이 스펙을 지원하는 제품이 나오지 않은 상태이기 때문에 기존의 톰캣4에서 사용할 수 있게 설치하는 법을 알아보려고 한다.
JSTL은 현재 자카르타의 taglibs 서브 프로젝트에서 받아올 수 있다. http://jakarta.apache.org/taglibs 에 접속하고, Downloads 링크를 클릭한다. Release 버전과 Nightly Build 버전이 있는데, 정식 릴리스 버전은 현재 1.0.3 까지 나와있다.
http://www.apache.org/dist/jakarta/taglibs/standard/ 에 가면 바이너리 빌드를 받아 볼 수 있다. jakarta-taglibs-standard-current.zip 를 다운로드 받아서 적당한 위치에 압축을 푼다.
jakarta-taglibs 디렉토리 아래 standard 에서 standard-examples.war 파일을 jstl.war 파일로 이름을 바꾼 뒤에 Tomcat 4 가 설치된 디렉토리의 webapps 디렉토리에 복사한다.
server.xml 의 <Host> 에 unpackWARs="true" 로 설정되어 있다면, jstl 이라는 디렉토리가 자동으로 생기면서 jstl.war 의 압축이 풀린 뒤에 브라우저에서 http://localhost:포트/jstl 로 예제 웹 어플리케이션을 실행해 볼 수 있다.
기존의 컨텍스트에서 JSTL을 사용하기 위해서는 웹 어플리케이션의 WEB-INF/lib 디렉토리에 필요한 라이브러리를 복사하면 된다. JSTL 의 주된 라이브러리 파일은 jstl.jar, standard.jar 이고, xml에서 지원되는 기능을 사용하기 위해서 jaxen-full.jar, saxpath.jar, jaxp-api.jar 파일 등이 필요하다. 이 파일들을 웹어플리케이션의 WEB-INF/lib 에 복사하고, 컨텍스트를 리로드한다. 구체적인 파일들의 명세는 다음과 같다.
이름
|
설명
|
파일
|
JSTL 1.0 API 클래스
|
jstl 1.0 API 클래스
|
jstl.jar
|
JSTL 1.0 구현 클래스
|
JSTL 구현
|
standard.jar
|
Jaxen 1.0
|
Xpath 엔진
|
jaxen-full.jar
|
Saxpath 1.0
|
Xpath 파싱에 필요 sax 방식
|
saxpath.jar
|
Jdbc 2.0 선택 패키지
|
JDBC 구현 클래스
j2se1.4, 톰캣4 기본포함
|
jdbc2_0-stdext.jar
|
Jaxp 1.2 구현
|
jaxp 1.2 호환 파서 필요
|
jaxp-api.jar
dom.jar
sax.jar
xercesImpl.jar
|
Xalan
|
아파치 xslt 변환기
|
xalan.jar
|
만일 톰캣4의 ROOT 컨텍스트에 설치를 한 경우에는 webapps/ROOT/WEB-INF/ 아래에 lib 디렉토리를 만들고 jstl 의 필요한 JAR 파일들을 복사해 놓으면 된다.
tld파일이 없거나, web.xml 파일에 8개의 tld 파일을 등록하지 않아도 표준태그는 사용할 수 있도록 되어 있다.
4가지의 JSTL 태그마다 EL 기반과 RT 기반의 태그로 나눠진다. 태그핸들러의 종류는 똑같지만 차이가 있다면 value 값으로 EL 을 사용하느냐 아니면 스크립트의 표현식을 허용하느냐의 차이다. 이에 관해서는 후에 살펴보겠다.
서버에 따라서 필요한 경우가 있으므로 간략히 방법을 설명하면, jakarta-taglibs 의 standard 디렉토리에 있는 tld 디렉토리의 8개의 tld 파일을 웹 어플리케이션의 WEB-INF/ 아래에 적당한 위치에 복사한 뒤에 이 파일들의 위치를 web.xml 에 등록한다.
|
EL은 다양한 위치에 있는 데이터에 접근하기 위한 언어이다. 문법체계가 직관적으로 아주 쉽다. jsp 에서는 모든 변수의 생성과 선언을 반드시 표시를 해주어야 되지만 EL은 그 과정 없이 바로 접근이 가능하다.
EL임을 표시하는 형식은 ${} 이다. 이 안에 들어있는 것은 EL 로 처리된다. 내장객체의 접근이 가능하고, 산술연산과 비교연산이 가능하다.
자바스크립트와 비슷한 방법으로 객체 내부의 자원에 접근이 가능하다. dot(.) 과 bracket([]) 모두를 이용해서 접근할 수 있으며, 예를 들면
${header.cookie} 와 ${header['cookie']} 는 같은 결과 값을 얻을 수 있다. 만일 user-agent 처럼 - 와 같이 있을 경우는 ${header['user-agent']} 로 접근하는 것이 좋다.
[] 를 이용해서 객체에 접근할 경우에 index 를 대신해서 사용할 수도 있다.
다음 예제는 이전 내용을 요약한 것이다.
|
<% response.setContentType("text/html;"); %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<h3>header</h3>
<c:forEach items="${header}" var="h">
</c:forEach>
<c:out value="${header.cookie}"/><br/>
<c:out value='${header["cookie"]}'/>
|
header 라는 객체가 갖고 있는 값들을 불러서 보여주는 소스이다. request.getHeader() 로 가져올 수 있는 것인데, 훨씬 깔끔한 소스로 보여진다.
JSTL 태그에서 기본적으로 EL을 사용한다. var 속성은 변수를 지정하는데, 여기에는 문자열 상수로 지정되며, 이 후에 이 변수를 참조하기 위해서는 EL 을 사용한다.
EL 로 접근할 수 있는 내장 객체들은 다음과 같다.
pageScope
|
page scope 의 변수들
|
requestScope
|
request scope 의 변수들
|
sessionScope
|
session scope 의 변수들
|
applicationScope
|
application scope 의 변수들
|
param
|
parameter 변수들 문자열
|
paramValues
|
parameter 변수들 문자열 배열
|
header
|
HTTP request 헤더
|
headerValues
|
HTTP request 헤더 문자열 배열
|
initParam
|
컨텍스트 초기 변수 web.xml 에서 지정
|
cookie
|
쿠키 변수들
|
pageContext
|
현재 페이지의 pageContext 객체
|
pageScope 의 변수는 스크립틀릿의 변수와는 틀리며, 이를 이용하려면 조금은 번잡한 과정을 거치게 된다. 따라서 가능하면 스크립틀릿은 사용하지 않기를 권장한다. 이를 활용하는 소스이다.
|
<% response.setContentType("text/html;"); %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="c_rt" uri="http://java.sun.com/jstl/core_rt" %>
<% String[] abc = {"빨강","파랑","노랑"}; %>
<c:set var="t" value="hello"/>
<c_rt:set var="color" value="<%=abc%>"/>
<h3>pageScope</h3>
<c:forEach items="${pageScope}" var="h">
<c:out value="${h}"/><br/>
</c:forEach>
<h3>colors</h3>
<c:forEach items="${color}" varStatus="i">
<c:out value="${i.count}"/>.
<c:out value="${color[i.index]}"/><br/>
</c:forEach>
|
<c:forEach/> 를 통해서 pageScope 의 값을 모두 출력해보면, String 배열변수인 abc 는 접근할 수 없게 되어있다. <c:set/> 과 <c_rt:set/> 으로 정해놓은 t와 color 만 나타나는 것이 보인다.
color 의 값을 출력하는 코드를 보면 color 의 인덱스를 이용해 배열 내용을 뽑아 왔다. varStatus 대신 var 변수를 통해서 바로 내용을 출력할 수도 있다.
value 가 들어가는 자리에 표현식을 쓰기 위해서는 RT 기반의 태그를 사용해야 된다. 만일 <c_rt:set var="color" value="<%=abc%>"/> 에서 <c_rt:set/> 대신 <c:set/> 를 사용하면 color 가 갖게 되는 값은 "<%=abc%>" 문자열이 되어버린다.
null 인지 아닌지 판단하기 위해서는 empty 라는 키워드를 사용한다. 세션 값이 없으면 세션에 값을 저장하고, 있을 경우 하나를 더한 후에 출력하는 코드이다
|
<% response.setContentType("text/html;"); %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<c:if test="${!empty hit}">
<c:set var="hit" value="${hit+1}" scope="session"/>
<c:out value="${hit}"/> 번 리로드되었습니다.
</c:if>
<c:if test="${empty hit}">
<c:set var="hit" value="1" scope="session"/>
세션에 값을 저장했습니다.
<br>
<a href="jstlel03.jsp">reload</a>
|
EL 의 장점은 객체의 접근이 쉽다고 했다. ${empty 객체} 를 통해서, 객체의 null 을 확인할 수 있다. ${!empty hit} 는 ${!empty sessionScope.hit} 로 대치해도 같은 결과가 나온다.
EL 의 연산자는 관계연산자, 산술연산자, 논리연산자, empty 연산자가 있고 다음 표와 같다.
연산자 구분
|
연산자
|
관계
|
< lt > gt <= le >= ge == eq != ne
|
산술
|
+ - * / div % mod
|
논리
|
&& and || or ! not
|
Empty
|
empty
|
연산자들간의 우선순위는 다음과 같다.
1. [] .
2. ()
3. - (단항) not ! empty
4. * / div % mod
5. + - (이항)
6. < > <= >= lt gt le ge
7. == != eq ne
8. && and
9. || or
가장 빈번하고 자주 쓰이는 것이다. Core 의 태그들은 다음과 같이 정리된다.
기능
|
태그
|
prefix
|
EL 지원
|
catch , out , remove , set
|
c
|
흐름 제어
|
choose (when , otherwise) , forEach , forTokens , if
|
URL 관리
|
Import (param) , redirect (param) , url (param)
|
가장 많이 쓰게 되는 것은 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의 스펙에서는 이 경우 빈 문자열("")또는 기본값으로 처리한다고 명시되어있다.
<c:set/> 의 기본형식은 다음과 같다. scope 속성이 생략될 경우 기본값은 page 이다.
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>
|
변수에 값을 할당한다. 빈과 같은 객체에 할당하기 위해서는 target 과 property속성을 이용한다.
<c:remove/> 는 JSP 의 removeAttribute() 와 같은 역할을 한다. 해당 scope 에 있는 변수를 제거하는 역할을 한다.
<c:catch/> 는 body 위치에서 실행되는 코드의 예외를 잡아내는 역할을 담당한다. var 속성을 지정해서 변수를 선언하면 그 변수에 예외의 내용이 들어가게 된다.
다음 예제는 이상의 태그를 사용한 예제이다.
|
<% response.setContentType("text/html"); %>
<%@ taglib uri="http://java.sun.com/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"/>
" 큰따옴표 사용주의; ' 작은따옴표로 대치
<c:out value='<font color="blue">파랑</font>'/>
<c:out value='<font color="blue">파랑</font>' escapeXml="false"/>
set session scope var "name": <c:set var="name" value="하늘" scope="session"/>
c:out name: <c:out value="${name}"/>
expression name: <%= session.getAttribute("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")%>
<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/> 을 통해서 에러 메시지를 표시한다.
<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 이다.
<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>
|
조건 판단을 수행하는 간단한 예제이다.
|
<% response.setContentType("text/html"); %>
<%@ taglib uri="http://java.sun.com/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 연산자를 통해서 확인할 수 있다.
<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/> 를 활용한 예제이다.
|
<% response.setContentType("text/html"); %>
<%@ taglib uri="http://java.sun.com/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>
<c:forTokens var="one"
items="서울|인천,대전,대구,부산,광주,평양"
delims=",|" varStatus="sts">
</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 이다.
이제 소개할 <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>
|
|
<% response.setContentType("text/html"); %>
<%@ taglib uri="http://java.sun.com/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}"/> 가져옵니다.
<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}"/> 가져옵니다.
<c:out value="${u}" escapeXml="false"/>
|
다국어 문서를 처리할 때 유용하고, 날짜와 숫자 형식을 다루는 fmt 태그는 다음과 같은 종류가 있다.
기능
|
태그
|
prefix
|
Locale 설정
|
setLocale, requestEncoding
|
fmt
|
메시지 처리
|
bundle, message(param), setBundle
|
숫자 날짜 형식
|
formatNumber, formatDate, parseDate, parseNumber, setTimeZone, timeZone
|
<c:if/> 태그와 마찬가지로 xml태그에도 <x:if/> 가 있고 형식은 <c:if/> 태그와 유사하다. <x:if/>의 형식은 다음과 같다.
|
org.apache.xml.utils.WrappedRuntimeException:
The output format must have a '{http://xml.apache.org/xslt}content-handler' property! |