개요
JSTL(JSP Standard Tag Library)를설명한다.
목차
1. 개요.. 3
2. 설정.. 3<?xml:namespace prefix = o /><?xml:namespace prefix = o />
3. JSTL의사용.. 4
4. Expression Language. 5
(1) Expression Language 개요.. 5
(2) Expression Language 기본객체.. 6
(3) 객체사용.. 6
(4) 연산자.. 9
5. core. 10
(1) c:out10
(2) c:set11
(3) c:remove. 11
(4) c:if11
(5) c:choose, c:when, c:otherwise. 12
(6) c:forEach. 12
(7) c:forTokens14
(8) c:url, c:param. 14
(9) c:import15
(10) c:redirect16
(11) c:catch. 16
6. 참고자료.. 16
JSTL(JSP Standard Tag Library)를설명한다. 프레임워크에서는 JSTL을구성하는 4개의태그라이브러리중에서 core 태그라이브러리만을사용한다.
표 1.
JSTL 태그라이브러리
JSTL을사용하려면아래파일이웹어플리케이션디렉토리에위치해야한다.
파일
|
설명
|
WEB-INF/lib/jstl.jar
|
JSTL API 라이브러리
|
WEB-INF/lib/standard.jar
|
JSTL 구현라이브러리
|
WEB-INF/tld/c.tld
|
JSTL core TLD 파일
|
표 2.
JSTL 설정을위한파일
J2EE 1.3에서는 JSTL 1.0 라이브러리를, J2EE 1.4에서는 JSTL 1.1 라이브러리를사용한다. 라이브러리는다음(http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html)에서다운로드한다.
그리고 web.xml 파일에태그라이브러리를설정한다. 아래는 J2EE 1.3을사용하는경우의설정이다.
web.xml
<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
그리고아래는 J2EE 1.4를사용하는경우의설정이다.
web.xml
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
</jsp-config>
JSTL을사용하는모든 JSP 파일상단에아래내용을추가한다.
Example.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
그런데 J2EE 1.3과 J2EE 1.4에따라서 uri 속성의값이다르다. 이에따른수정영향을최소화하기위해서 BaseJsp.jsp 파일을사용한다.
Example.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ include file="/BaseJsp.jsp" %>
BaseJsp.jsp의내용은아래와같다. 프레임워크가제공하는태그라이브러리설정도포함한다.
BaseJsp.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="framework" uri="http://www.naver.com/ctl/framework" %>
<%@ taglib prefix="ui" uri="http://www.naver.com/ctl/ui" %>
JSTL은 Expression Language(이하 EL)를사용한다. EL은데이터혹은객체를표현하는데사용하는스크립트언어로 ${} 안에서사용한다.
// 동적인표현작업수행
${Some Expression}
EL로아래의작업을수행한다.
JSP 저장영역(page, request, session, application)에대한접근
java.util.Collection, java.util.Map, 배열등의객체처리
POJO 유형의객체처리
수치, 비교, 논리연산자적용
J2EE 1.3에서는 EL을 JSTL 태그의속성값에서만사용할수있다. 그러나 J2EE 1.4에서는 EL을 JSP와 JSTL 모두에서사용할수있다.
EL에서사용가능한주요 JSP API에대한 Alias는아래와같다.
종류
|
기본객체
|
예제
|
JSP
저장영역
|
pageScope - PageContext 속성
requestScope - HttpServletRequest 속성
sessionScope - HttpSession 속성
applicationScope - ServletContext 속성
|
${requestScope.name}
|
HTTP
요청
파라미터
|
param - HttpServletRequest 파라미터
paramValues - 동일파라미터이름에값이 2개이상존재하는경우
|
${param.name}
|
JSP
객체
|
pageContext - PageContext
cookie - 이름을키로, Cookie를값으로하는 java.util.Map
header - 해더이름을키로, 해더값을값으로하는 java.util.Map
headerValues - 동일해더이름에값이 2개이상존재하는경우
initParam - JSP 초기변수
|
${cookie.JSESSIONID.name}
${headerValues['HOST'][0]}"
|
표 3.
EL 기본객체
기본데이터타입(Boolean, Integer, Long, String 등)은아래처럼사용한다.
request.setAttribute("name", "성선임");
// 성선임을출력한다.
${requestScope.name}
// 성선임을출력한다. 영역을지정하지않으면 page, request, session, application 순
// 으로검색한다.
${name}
// null을출력하지않고아무것도출력하지않는다.
${password}
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><?xml:namespace prefix = st1 /><?xml:namespace prefix = st1 /><?xml:namespace prefix = st1 />POJO 객체의경우에는파라미터가없는 get으로시작하는메소드에서 get을제외한나머지메소드이름의첫번째단어를소문자로해서사용한다.
Book.java
public class Book {
private String isbn;
public Book(String isbn) {
this.isbn = isbn;
public void getIsbn() {
return this.isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String toString() {
return "book-object";
}
}
Example.jsp
Book book = new Book("100");
request.setAttribute("favoriteBook", book);
// toString 메소드가반환하는값을출력한다. 즉 book-object를출력한다.
${favoriteBook}
// . 연산자를사용해서 getIsbn 메소드가반환하는값을출력한다. 즉 100을출력한다.
${favoriteBook.isbn}
// [] 연산자를사용해도결과는동일하다.
${favoriteBook['isbn']}
// 값이없는경우에 NullPointerException이발생하지않는다.
${nullBook.isbn}
// 해당하는메소드가없는경우에는예외가발생한다.
${book.title}
배열객체는아래처럼사용한다.
Book[] books = new Book[2];
books[0] = new Book("100");
books[1] = new Book("200");
request.setAttribute("books", books);
// 100을출력한다.
${books[0].isbn}
// 200을출력한다.
${books[1].isbn}
java.util.Map 객체는아래처럼사용한다. 단키의유형은항상 java.lang.String이어야한다.
Map map = new HashMap();
map.put("one", new Integer(1));
map.put("sub.one", new Integer(2));
request.setAttribute("numbers", map);
// .와 [] 연산자를모두사용할수있다. 1을출력한다.
${number.one}
${number['one']}
// 키가 . 등의문자를포함하면 [] 연산자를사용한다. 2를출력한다.
${number['sub.one']}
// java.util.Map은키가존재하지않아도예외가발생하지않는다.
${number.two}
EL에서아래의수치연산자를사용할수있다.
연산자
|
설명
|
예제
|
결과
|
+
|
더하기
|
${10 + 2}
|
12
|
-
|
빼기
|
${10 - 2}
|
8
|
*
|
곱하기
|
${10 * 2}
|
20
|
/ 또는 div
|
나누기
|
${10 / 2} 또는 ${10 div 2}
|
5
|
% 또는 mod
|
나머지
|
${10 % 3} 또는 ${10 mod 3}
|
1
|
표 4.
EL 수치연산자
숫자형이아니면숫자형으로자동전환을한후에연산을수행한다.
// 101이아닌 11을출력한다.
${"10" + 1}
// null은 0으로처리한다. 1을출력한다.
${null + 1}
// 숫자가아니면예외가발생한다.
${"일" + 10}
EL이제공하는비교및논리연산자는아래와같다. >, < 등 XML 태그와혼동할우려가있는연산자는문자열연산자(gt, lt)로표현하는것을권장한다.
연산자
|
예제
|
결과
|
== 또는 eq
|
${5 == 5} 또는 ${5 eq 5}
|
true
|
!= 또는 ne
|
${5 != 5} 또는 ${5 ne 5}
|
false
|
< 또는 lt
|
${5 < 7} 또는 ${5 lt 7}
|
true
|
> 또는 gt
|
${5 > 7} 또는 ${5 gt 7}
|
false
|
<= 또는 le
|
${5 <= 5} 또는 ${5 le 5}
|
true
|
>= 또는 ge
|
${5 >= 6} 또는 ${5 ge 6}
|
false
|
&& 또는 and
|
${true && false} 또는 ${true and false}
|
false
|
|| 또는 or
|
${true || false} 또는 ${true or false}
|
true
|
! 또는 not
|
${!true} 또는 ${not true}
|
false
|
empty
|
${empty name}
|
name이 null이거나빈문자열이면 true
|
not empty
|
${not empty name}
|
name이 null도아니고빈문자열도아니면 true
|
표 5.
EL 비교및논리연산자
객체를화면에출력한다.
// out.println(request.getAttribute("name"));
<c:out value="${name}"/>
// 값이없는경우에기본값을출력하려면 default 속성을이용한다.
<c:out value="${age}" default="값이없습니다."/>
// 기본적으로 XML 문자를 escape한다. Escape 하지않으려면 escapeXml을 false로한다.
<c:out value="${name}" escapeXml="false"/>
저장영역에객체를저장한다.
// request.setAttribute("name", "<?xml:namespace prefix = st2 ns = "urn:schemas:contacts" /><?xml:namespace prefix = st2 /><?xml:namespace prefix = st2 /><?xml:namespace prefix = st2 />송태섭");
// scope 속성으로는 page(기본), request, session, application을사용.
<c:set scope="request" var="name" value="송태섭"/>
// Book book = (Book) request.getAttribute("book");
// book.setIsbn("300");
<c:set scope="request" target="book" property="isbn" value="300"/>
저장영역에서객체를삭제한다.
// request.removeAttribute("name");
<c:remove scope="request" var="name"/>
조건문을제어한다.
// test 속성의값이 true면 c:if 태그의 body 내용을수행한다.
<c:if test="${not empty flag}">
flag가존재하면이영역을수행한다.
</c:if>
복합조건문을제어한다.
// c:choose 태그는 1개이상의 c:when 태그와 0 또는 1개의 c:otherwise 태그로구성
<c:choose>
<c:when test="${flag == 1}">
flag가 1이면이영역을수행한다.
</c:when>
<c:when test="${flag == 2}">
flag가 2이면이영역을수행한다.
</c:when>
<c:otherwise>
flag가 1도 2도아니면이영역을수행한다.
</c:otherwise>
</c:choose>
반복문을수행한다.
<%
for (int i = 0; i < 10; i++) {
out.println(i);
}
%>
// 0 1 2 3 4 5 6 7 8 9를출력한다.
<c:forEach begin="0" end="9" var="i">
<c:out value="${i}"/>
</c:forEach>
step 속성으로간격을조정한다.
<%
for (int i = 0; i < 10; i += 2) {
out.println(i);
}
%>
// 0 2 4 6 8을출력한다.
<c:forEach begin="0" end="9" step="2" var="i">
<c:out value="${i}"/>
</c:forEach>
java.util.Collection 객체나배열에대해서는아래처럼한다.
<%
Collection books = (Collection) request.getAttribute("books");
for (Iterator all = books.iterator(); all.hasNext();) {
Book each = (Book) all.next();
out.println(each.getIsbn());
}
%>
<c:forEach items="${books}" var="book">
<c:out value="${book.isbn}"/>
</c:forEach>
items 속성값으로기본타입의배열, java.util.Collection, java.util.Map, java.util.Iterator, java.util.Enumeration, java.lang.Object 배열, 콤마로이루어진 java.lang.String 등의객체를사용할수있다.
java.util.Map 객체는아래처럼사용한다.
<%
Map books = new HashMap();
books.put("one", new Book("100"));
books.put("two", new Book("200"));
request.setAttribute("books", books);
%>
// one 100 two 200을출력한다. (순서는정확하지않다.)
<c:forEach items="${books}" var="book">
<c:out value="${book.key}"/>
<c:out value="${book.value.isbn}"/>
</c:forEach>
구분자로반복문을수행한다.
//1 2 3 4를출력한다.
<c:forTokens delims="," items="1,2,3,4" var="i">
<c:out value="${i}"/>
</c:forTokens>
begin, end, step 속성으로시작위치, 종료위치, 간격을조정한다.
URL를처리한다.
// UserForm.jsp를출력한다.
<c:url value="UserForm.jsp"/>
// value 속성값이 /로시작하면컨텍스트를포함한다.
// 컨텍스트를 web으로가정하면 /web/UserForm.jsp를출력한다.
<c:url value="/UserForm.jsp"/>
// 다른컨텍스트를사용하려면 context 속성을사용한다.
// 이때는 value와 context 속성의값이모두 /로시작해야한다.
// /other/UserForm.jsp를출력한다.
<c:url value="/UserForm.jsp" context="/other"/>
scope과 var 속성을이용해서 URL을화면에출력하지않고 JSP 영역에저장할수있다.
c:param 태그를이용해서 Query String을 URL에추가한다.
// 파라미터값을 escape한다. 따라서
// UserForm.jsp?name=%EC%A0%95%EB%8C%80%EB%A7%8C을출력한다.
<c:url value="UserForm.jsp">
<c:param name="name" value="성선임"/>
</c:url>
c:param 태그는 c:import와 c:redirect 태그에서도동일한방법으로사용한다.
특정 JSP의내용을화면에포함해서출력한다.
// UserForm.jsp의내용을화면에포함하여출력한다.
<c:import url="UserForm.jsp"/>
데이터인코딩에문제가있으면 charEncoding 속성을사용한다.
<c:import url="UserForm.jsp" charEncoding="UTF-8"/>
// context 속성을이용하면다른어플리케이션의 JSP도포함할수있다.
<c:import url="/UserForm.jsp" charEncoding="UTF-8" context="/other"/>
var와 varReader 속성을이용하면내용을화면에출력하지않고변수에저장할수있다.
다른경로로이동한다.
// 앞에데이터를웹브라우저에전송하는코드가없어야한다.
<c:redirect url="http://www.naver.com"/>
예외를처리한다.
// var 속성값으로발생한예외객체를 page 영역에저장한다.
<c:catch var="e">
<%
if (true) throw new RuntimeException();
%>
</c:catch>
<c:out value="${e}"/>
The J2EE 1.3 Tutorialhttp://java.sun.com/j2ee/1.3/docs/tutorial/doc/index.html
The J2EE 1.4 Tutorialhttp://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html
JSTL in Action
JSTL 1.0 Specificationhttp://jcp.org/aboutJava/communityprocess/final/jsr052