jstl

Program Language/Frmaework 2009. 12. 21. 15:26

 

개요

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

 

1.
개요

JSTL(JSP Standard Tag Library)설명한다. 프레임워크에서는 JSTL구성하는 4개의태그라이브러리중에서 core 태그라이브러리만을사용한다.

종류

설명

prefix

uri

core

데이터출력, 제어문, URL 처리기본기능

c

http://java.sun.com/jstl/core (1.3)

http://java.sun.com/jsp/jstl/core (1.4)

format

I18N 데이터포멧기능

fmt

http://java.sun.com/jstl/fmt (1.3)

http://java.sun.com/jsp/jstl/fmt (1.4)

xml

XML 문서에대한처리

x

http://java.sun.com/jstl/xml (1.3)

http://java.sun.com/jsp/jstl/xml (1.4)

sql

JDBC 작업수행

sql

http://java.sun.com/jstl/sql (1.3)

http://java.sun.com/jsp/jstl/sql (1.4)


표 1.
JSTL 태그라이브러리

2.
설정

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>

 

3.
JSTL
사용

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" %>

 

4.
Expression Language

(1)
Expression Language
개요

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 모두에서사용할있다.

(2)
Expression Language
기본객체

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 기본객체

(3)
객체
사용

기본데이터타입(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}

 

(4)
연산자

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 비교논리연산자

5.
core

(1)
c:out

객체를화면에출력한다.

 

// 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"/>

 

(2)
c:set

저장영역에객체를저장한다.

 

// 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"/>

 

(3)
c:remove

저장영역에서객체를삭제한다.

 

// request.removeAttribute("name");

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

 

(4)
c:if

조건문을제어한다.

 

// test 속성의값이 true c:if 태그의 body 내용을수행한다.

<c:if test="${not empty flag}">

flag존재하면영역을수행한다.

</c:if>

 

(5)
c:choose, c:when, c:otherwise

복합조건문을제어한다.

 

// 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>

 

(6)
c:forEach

반복문을수행한다.

 

<%

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>

 

(7)
c:forTokens

구분자로반복문을수행한다.

 

//1 2 3 4출력한다.

<c:forTokens delims="," items="1,2,3,4" var="i">

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

</c:forTokens>

 

begin, end, step 속성으로시작위치, 종료위치, 간격을조정한다.

(8)
c:
url, c:param

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 태그에서도동일한방법으로사용한다.

(9)
c:import

특정 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 속성을이용하면내용을화면에출력하지않고변수에저장할있다.

(10)
c:redirect

다른경로로이동한다.

 

// 앞에데이터를브라우저에전송하는코드가없어야한다.

<c:redirect url="http://www.naver.com"/>

 

(11)
c:catch

예외를처리한다.

 

// var 속성값으로발생한예외객체를 page 영역에저장한다.

<c:catch var="e">

<%

if (true) throw new RuntimeException();

%>

</c:catch>

 

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

 

6.
참고
자료

 
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

이 글은 스프링노트에서 작성되었습니다.

Posted by 이버리
,