본문 바로가기
개발~/JSP

[JSP] 표준 태그 라이브러리(JSTL)

by 보배곰 2017. 3. 5.

JSTL 태그 모아놓은 추천 사이트

https://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm



참고한 책: 최범균의 JSP2.3 웹프로그래밍 기초부터 중급까지 (최범균)

chap12. 표준 태그 라이브러리(JSTL)



▶표준 태그 라이브러리(JSTL, JSP Standard Tag Library)이란?

JSP 페이지에서 많이 사용되는 논리적인 판단, 반복 처리, 포맷 처리를 위한 커스텀 태그를 표준으로 만들어서 정의한 것


▶왜 JSTL을 사용할까?

JSP는 HTML코드와 스크립트릿, 표현식 등의 스크립트 코드가 섞이기 때문에 코드를 보는게 쉽지 않다. 그래서 HTML태그와 비슷한 코드를 사용해서 처리할 수 있도록 만든 것이다. 이렇게 JSTL을 이용하므로써 보기 좋고 이해하기 쉬운 코드를 작성할 수 있다. 


▶JSTL 사용 방법(택 1)

표준 라이브러리..라고 하면서 JSTL 라이브러리를 먼저 받아야 한단다...!

1. maven repository에서 찾아 maven으로 pom.xml에 추가할 수도 있고

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>jstl</artifactId>

    <version>1.2</version>

</dependency> 


2. jar를 WEB-INF/lib 디렉토리에 복사할 수도 있다.

jstl-1.2.jar



▶JSTL이 제공하는 태그

라이브러리 

주요 기능 

접두어 

관련 URI 

 코어

 변수지원

 흐름 제어

 URL 처리 

 http://java.sun.com/jsp/jstl/core 

 XML

 XML 코어

 흐름 제어

 XML 변환

 http://java.sun.com/jsp/jstl/xml

 국제화 

 지역

 메시지 형식

 숫자 및 날짜 형식 

fmt 

 http://java.sun.com/jsp/jstl/fmt 

 데이터베이스 

 SQL 

sql 

 http://java.sun.com/jsp/jstl/sql 

 함수 

 컬렉션 처리 

 String 처리

fn 

 http://java.sun.com/jsp/jstl/functions 

JSTL이 제공하는 태그 중 제일 많이 쓰이는 건 코어이다. JSTL을 실제로 사용할 때 관련 URI를 taglib에 적어주어야 하는데 그때 URI를 다 쓰려고 하지말고 자동완성으로 쓰는 것을 추천한다!



▶코어 태그 라이브러리

코어 태그 라이브러리는 변수설정이나 논리 처리에 사용되는 스크립트 코드를 대체하는 태그를 제공한다. 

코어 태그를 사용하기 위해서는 JSP 페이지에 taglib 디렉티브를 추가해야 한다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

위에서 말했듯이 uri는 다 타이핑하지 말고 eclipse 자동완성 기능(ctrl+space)를 이용하자.

기능 분류 

태그 

설명 

 변수지원

 set 

 JSP에서 사용할 변수를 설정한다. 

 remove 

 설정한 변수를 초기화한다. 

 흐름제어

 if 

 조건에 따라 내부 코드를 실행한다.

 choose 

 다중 조건을 처리할 때 사용된다. 

 forEach 

 컬렉션이나 Map의 각 항목을 처리할 때 사용한다. 

 forTokens 

 구분자로 분리된 각가의 토큰을 처리할 때 사용된다. 

 URL처리

 import 

 URL을 사용하여 다른 자원의 결과를 삽입한다. 

 redirect` 

 지정한 경로로 리다이렉트 한다. 

 url 

 URL을 재작성한다. 

기타 태그 

 catch 

 익셉션을 처리할 때 사용한다. 

 out 

 JSPWriter에 내용을 출력한다. 



▶변수 지원 태그

변수 지원 태그에는 set태그와 remove태그가 있다. 그 중 많이 쓰이는 set 태그를 살펴보자.


▶<c:set> 태그

<c:set> 태그는 EL 변수의 값이나 EL 변수의 프로퍼티 값을 지정할 때 사용된다.

set앞에 쓰인 c는 core의 prefix인 c이다. 이렇게 prefix를 명시해줘야한다.


<c:set> 태그 사용방법으로 2가지가 있다.


1. EL 변수 생성

<c:set var="변수명" value="값" [scope="영역"] />

<c:set var="변수명" [scope="영역"]> 값 </c:set> 


  • var: 값을 저장할 EL 변수의 이름을 지정한다.
  • value: 변수의 값을 지정한다. 표현식, EL, 정적인 텍스트를 사용해서 값을 지정할 수 있다.
  • scope: 변수를 저장할 영역을 지정한다. 값은 page, request, session, application 중 하나가 온다. 기본값은 page

 value에 고정값 넣기

 <c:set var="name" value="홍길동"/>

 Expression 태그를 이용한 가변값 넣기

<c:set var="name" value="<%= m.getFirstName() %>" scope="request" /> 

 EL을 이용한 가변값 넣기

<c:set var="name" value="${ m.lastName } ${ m.firstName }" /> 



2. 객체의 프로퍼티 값을 설정

<c:set target="대상" property="프로퍼티이름" value="값" />

<c:set target="대상" property="프로퍼티이름"> 값 </c:set> 


  • target: 프로퍼티 값을 설정할 대상 객체를 지정한다. 표현식(<%= 변수 %>) EL 변수( ${varName} )를 사용할 수 있다. 대상 객체는 자바빈 객체나 Map이어야 한다.
  • property: 설정할 프로퍼티의 이름을 지정한다. target이 자바빈 객체인 경우 프로퍼티 이름에 해당하는 set 메서드를 제공해야 한다. 예를 들어, 프로퍼티 이름이 name인 경우 target 객체는 setName() 메서드를 제공해야 한다. Map인 경우 Map.put(프로퍼티 이름, 값)을 이용해서 값을 설정한다.
  • value: 프로퍼티의 값을 지정한다.

member.setName("홍길동")과 동일

<% Member member = new Member(); %>

<c:set target="<%= member %>" property="name" value="홍길동"/>

<%= member.getName() %> <%-- 값 홍길동 출력 --%>

 

<c:set var="m" value="<%=member %>"/>

<c:set target="${ m }" property="name" value="홍길동" />

${ m.name } <%-- 값 홍길동 출력 --%>


 prop.set("host", localhost")와 동일


<% Map<String, String> prop = new HashMap<>(); %>

<c:set target="<%= prop %>" property="host" value="localhost" />

<%= prop.get("host") %> <%-- 값 localhost 출력 --%>



 <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>


<html>

   <head>

      <title><c:set> Tag Example</title>

   </head>


   <body>

      <c:set var = "salary" scope = "session" value = "${2000*2}"/>

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

   </body>

</html>

출처: https://www.tutorialspoint.com/jsp/jstl_core_set_tag.htm


▶흐름 제어 태그
흐름 제어 태그에는 if, choose, forEach, forTokens 4가지 태그가 있다.

▶<c:if> 태그
자바 언어의 if 블록과 비슷한 기능을 제공한다. 중첩된 if-else 블록과 같은 효과를 낼 순 없지만 단순한 if 블록을 쉽게 대체할 수 있기 때문에 많이 사용한다.

<c:if test="조건">

...

</c:if> 


<c:if test="true">

무조건 수행

</c:if>

<c:if test="${ param.name == 'bk' }">

name 파라미터의 값이 ${ param.name } 입니다.<br>

</c:if>

<c:if test="${ 18 < param.age }">

당신의 나이는 18세 이상입니다.

</c:if> 


▶<c:choose> 태그

우리가 평소에 쓰는 if-else 태그는 아래와 같이 사용한다.

elseif로 쓰고싶으면 when을 더 추가해주시면 됩니다~ 

<c:choose>

      <c:when test="조건">

        ....

      </c:when>

      <c:otherwise>

        ....

      </c:otherwise>

</c:choose>


<c:choose>

      <c:when test="${ down_url eq null }">

        기간이 만료되었습니다.

      </c:when>

      <c:otherwise>

        <a href="${ down_url }" id="downBtn">다운받기</a>

      </c:otherwise>

</c:choose> 




▶<c:forEach> 태그
forEach 태그는 배열, Collection 또는 Map에 저장되어 있는 값들을 순차적으로 처리할 때 사용한다.

<c:forEach var="변수" items="아이템">

...

</c:forEach> 



for(String name : arrays) 와

<c:forEach var="name" items=" ${ arrays }"> 는

서로 비슷하다고 생각하면 된다.


<c:forEach var="i" begin="1" end="10">

${ i }

</c:forEach> 

 <c:forEach var="i" begin="1" end="10" step="2">

${ i }

</c:forEach>

 <c:forEach var="i" items="${ intArray }" begin="2" end="4">

[${ i }]

</c:forEach>