JSTL (JSP Standard Tag Library)

이기현·2020년 1월 10일
0

2020Camp

목록 보기
5/16

1. JSTL의 이해

일반적으로 알고있는 JSTL이란 JSTL + EL의 조합을 말한다.

HTML 코드 내에 java 코드인 스크립틀릿 <%= student %>를 ${student}로, <%=if %>문을 <c:if>, <%=for%>문을 <c:forEach>로 대체하여 사용한다.

예전에는 스크립틀릿을 많이 사용했지만 가독성이 떨어지고, 뷰와 비즈니스로직의 분리로 인해 현재는 JSTL을 많이 사용하는 추세다. JSTL과 EL은 보통 함께 사용하는데 그 이유와 각각의 개념, 각각의 차이와 문법을 정리해보도록 하자.

  • JSTL이란 JSP 표준라이브러리(JSP Standard Tag Library) 이다.
  • JSP에서 사주 사용하는 기능(반복과 조건, 데이타 관리 포맷, XML 조작, 데이타베이스 액세스)을 구현하는 커스텀 태그 라이브러리 모음이다.
  • 시간, 날짜, 숫자의 포맷이나 문자열 가공등의 처리에서 비즈니스로직과 프리젠테이션 로직을 분리할 수 있게 해준다.
  • JSTL은 EL(Expression Language)를 사용하여 표현한다.

EL 이란

EL의 정식 명칭은 표현 언어(Expression Language)라고 하며 줄여서 EL이라고 부른다.

JSP 2.0 스펙에 새로 추가된 스크립트 언어로서 초기의 EL은 JSTL의 액션 태그에서만 작동하는 문제가 있었는데, JSP 2.0 부터는 JSP 컨테이너가 EL표현식을 해석할 수 있게 도어 표준 액션 태그, 커스텀 태그, 템플릿 데이터와 같이 자바코드를 사용해야 했던 모든 곳에 EL을 사용할 수 있다.

EL은 자바스크립트에서 확장된 Xpath에서 힌트를 얻어 만들어진 언어로 값이 없는 변수(null)에 대해 좀 더 관대하고 데이터 형 변환을 자동으로 해주는 특징이 있다. EL을 사용하면 값이 없거나 형 변환 등에 전혀 신경 쓸 필요 없이 서버로 전송해서 형변환 없이 사용할 수 있다.

EL의 사용법

<%= name %>
${name}

Advantage of JSTL

  • Fast Development JSTL provides many tags that simplify the JSP.
  • Code Reusability We can use the JSTL tags on various pages.
  • No need to use scriptlet tag It avoids the use of scriptlet tag.

너무나 정리가 잘 되어있는 사이트가 있다 !!

http://wiki.gurubee.net/pages/viewpage.action?pageId=26740270

2. JSTL 라이브러리

5가지의 라이브러리가 존재한다.
jstl.PNG

2.3 JSTL 사용

  • 아래와 같이 taglib 지시문을 이용하여 선언하고 접두어를 이용하여 사용한다.
 <!-- 선언부 -->
<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions" %>

<!-- 사용-->
<c:set var="hello" value="Hello" />
${hello}

3. Core Tag의 이해

JSTL 태그 라이브러리 중에 가장 많이 사용하는 태그이다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>로 선언을 해줘야 사용할 수 있다.

3.1 <c:set/>, <c:remove/>

변수의 선언 및 제거 역할을 한다.
set : JSP의 setAttribute()와 같은 역할.
remove : JSP의 removeAttribute()와 같은 역활

<!-- scope 속성은 선택적이며 page로 기본 설정되어 있다. -->
<c:set  var="변수명"  value="할당된 값"
        scope="변수의 유효 범위 page|request|session|application" />

<!-- 간단 사용 예 -->
<c:set var="country" value="Korea" />
<c:set var="intArray" value="<%=new int[] {1,2,3,4,5} %>" />
<c:remove var="country" />

3.2 <c:out/>

변수의 출력 기능을 한다. JSP의 표현식(<%= %>)을 대체하는 기능이다.
escapeXML값이 true일 경우 값 중에 포함된 <,>,&,'," 문자들을 각각 <, >, &, ', "로 변환하여 출력 한다.
default 속성과 excapeXML 속성을 사용하지 않는 경우 EL형식으로 많이 사용한다.

<!-- Syntax -->
<c:out var="변수명" default="기본값" escapeXML="true|false" />

<!-- 간단 사용 예 -->
<p><c:out value="${country}" default="Korea" escapeXml="true"/></p>
<p>${country}</p>
<p>${intArray[0]}</p>

3.3 <c:if/>

조건문으로 if문과 동일하지만 else 구문이 없다.
테스트의 결과를 var와 scope 속성을 통해 범위 변수로 할당할 수 있다.
이 기능은 테스트 비용이 비쌀 경우 유용하다.

<!-- Syntax -->
<c:if test="expression"  var="name"  scope="scope">
body content
</c:if>

<!-- 간단 사용 예 -->
<c:set var="login" value="true" />

<c:if test="${!login}"> <p><a href="/login.ok">로그인</a></p></c:if>
<c:if test="${login}"> <p><a href="/logout.ok">로그아웃</a></p></c:if>

<!-- 아래 예제와 같이 null 비교를 하지 않고 empty 비교를 하면 null과 ""를 동시에 체크할 수 있다. -->
<c:if test="${!empty country}"><p><b>${country}</b></p></c:if>

3.4 <c:choose/>, <c:when/>, <c:otherwise/>

java의 swith문과 비슷하지만 문자열 비교도 가능하다.
<c:if/>문에 else 구문이 없기 때문에 else의 대체 기능으로 많이 사용한다

<!-- Syntax -->
<c:choose>
<c:when test="expression">
body content
</c:when>
...
<c:otherwise>
body content
</c:otherwise>
</c:choose>

<!-- 간단 사용 예 -->
<c:choose>
  <c:when test="${login}">
    <p><a href="/logout.ok">로그아웃</a></p>
  </c:when>
  <c:otherwise>
    <p><a href="/login.ok">로그인</a></p>
  </c:otherwise>
</c:choose>

3.5 <c:forEach/>

반복문을 실행할 때 사용 한다.
정수 범위내의 반복(이를 테면, 자바의 for 문)과 컬렉션내의 반복(자바의 Iterator와 Enumeration 클래스)을 지원한다.
begin : 시작값 , end : 마지막값 , step : 증가값, var 변수, items:컬렉션 객체, varStatus : 추가속성값

<!-- 정수 범위내의 반복 Syntax -->
<c:forEach var="name" varStatus="name"
            begin="expression" end="expression" step="expression">
  body content
</c:forEach>

<!-- 컬렉션 범위내의 반복 Syntax -->
<c:forEach var="name" items="expression" varStatus="name"
           begin="expression" end="expression " step="expression">
  body content
</c:forEach>

<!-- forEach 정수 범위내의 반복 -->
<c:forEach var="i" begin="0" end="10" step="2" varStatus="x">
  <p> i = ${i}, i*i = ${i * i} <c:if test="${x.last}">, last = ${i}</c:if> </p>
</c:forEach> 

<!-- forEach 컬렉션 범위내의 반복 -->
<%
  java.util.List list = new java.util.ArrayList(); 

  java.util.Map map = new java.util.HashMap();
  map.put("color","red");
  list.add(map);
  
  map = new java.util.HashMap();
  map.put("color","blue");
  list.add(map);
  
  map = new java.util.HashMap();
  map.put("color","green");
  list.add(map);
  
  request.setAttribute("list", list);
%>

<c:forEach var="map" items="${list}" varStatus="x">
  <p> map(${x.index}) = ${map.color}  </p>
</c:forEach>

3.6 <c:forTokens/>

문자열을 주어진 구분자(delimiter)로 분할 하여 반복문을 실행한다.

<c:forTokens var="color" items="빨|주|노|초|파|남|보" delims="|" varStatus="i" >
     <c:if test="${i.first}">color : </c:if>
     ${color} 
     <c:if test="${!i.last}">,</c:if>
</c:forTokens>

4. Format Tag의 이해

Format 관련 태그는 국제화와 포맷팅을 지원하는 라이브러리로 구성되어 있다.
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 선언을 해줘야 사용할 수 있다.
라이브러리가 많지만 자주 사용하는 몇 개에 대해서만 알아 보도록 하자

4.1 <fmt:formatNumber>

숫자의 형식을 특정 포맷으로 표현하는 태그이다. (Number → String)
value : 특정 형식으로 표현 할 값
type : 숫자, 통화, 퍼센트 중 지정 (number|currency|percent)
pattern : 사용자가 지정한 형식 패턴. (ex. #,#00.0#)

<!-- Syntax -->
<fmt:formatNumber value="numericValue"
        [type="{number|currency|percent}"]
        [pattern="customPattern"]
        [var="varName"]
        [scope="{page|request|session|application}"]/>

<!-- 간단 사용 예 -->
<fmt:setLocale value="ko_KR"/>
<p>number  : <fmt:formatNumber value="1234567.89" type="number"/></p>
<p>currency : <fmt:formatNumber value="1234567.89" type="currency" currencySymbol="" /> </p>
<p>percent : <fmt:formatNumber type="percent">0.159</fmt:formatNumber></p>
<p>pattern=".000"    :<fmt:formatNumber value="1234567.1" pattern=".000" /></p>
<p>pattern="#,#00.0#":<fmt:formatNumber value="1234567.891" pattern="#,#00.0#"/></p>

4.2 <fmt:parseNumber/>

formatNumber와 반대로 정해진 문자열에서 숫자를 파싱한다. . (String → Number)
integerOnly : 주어진 값에서 Integer 부분만 파싱할지 여부

<!-- Syntax -->
<fmt:parseNumber [type="{number|currency|percent}"]
        [pattern="customPattern"]
        [parseLocale="parseLocale"]
        [integerOnly="{true|false}"]
        [var="varName"]
        [scope="{page|request|session|application}"]> 

<!-- 간단 사용 예 -->
<p>number  : <fmt:parseNumber value="1,234,567.89" type="number"/></p>
<p>currency : <fmt:parseNumber value="12345abcdef" integerOnly="false" type="number" /></p> 

4.3 <fmt:formatDate/>

날짜와 시간 형식을 표현하는 태그이다.
value : 특정 형식으로 표현 할 값
type : 숫자, 통화, 퍼센트 중 지정 (number|currency|percent)
pattern : 사용자가 지정한 형식 패턴. (ex. #,#00.0#)

<!-- Syntax -->
<fmt:formatDate value="date"
        [type="{time|date|both}"]
        [dateStyle="{default|short|medium|long|full}"]
        [timeStyle="{default|short|medium|long|full}"]
        [pattern="customPattern"]
        [timeZone="timeZone"]
        [var="varName"]
        [scope="{page|request|session|application}"]/>

<!-- 간단 사용 예 -->
<c:set var="now" value="<%= new java.util.Date() %>" />
<p> date full : <fmt:formatDate value="${now}" type="date" dateStyle="full" /></p>
<p> date short : <fmt:formatDate value="${now}" type="date" dateStyle="short" /></p>
<p> time : <fmt:formatDate value="${now}" type="time" /></p>
<p> both full : <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full" /></p>
<p> pattern 1 : <fmt:formatDate value="${now}" pattern="yyyy-MM-dd aa hh:mm:ss" /></p>
<p> pattern 2 : <fmt:formatDate value="${now}" pattern="yyyy-MM-dd  hh:mm:ss" /></p> 

5. Function Tag의 이해

Functon 태그는 자주 사용하는 유틸 함수의 기능을 제공한다.
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 선언을 해줘야 사용할 수 있다.

자세한내용은

http://wiki.gurubee.net/pages/viewpage.action?pageId=26740270
여기에서 확인하도록 하자 !

profile
실력을 쌓아가는 하루하루

0개의 댓글