JSTL은 JSP Standard Tag Libarary의 약자로 앞서 살펴보았던 커스텀 태그 중 빈번히 사용되는 태그들을 모아둔 라이브러리이다.
JSP 페이지 제작시 자바 코드를 줄이고 태그 형태로 기존에 제공되지 않는 기능을 구현하라면 직접 커스텀 태그를 제작해야 했지만, JSTL을 사용하면 자주 사용되는 많은 기능이 이미 구현되어 있다.
JSTL jar파일을 다운받아 프로젝트의 WebContent/WEB-INF/lib 폴더에 넣는다.
Tomcat 환경에서 직접 웹 애플리케이션을 구동할 경우 tomcat 폴더의 lib 폴더에 복사한다.
우선 JSTL을 사용할 JSP 파일에 태그라이브러리 선언을 해야한다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
c을 접두사로하는 jstl/core 태그라이브러리를 사용한다고 선언한다.
JSTL:을 사용하면 JSP 스크립팅 요소를 사용할 때보다 코드가 간결해진다.
JSTL 라이브러리 종류
JSTL은 내부적으로 다섯 가지 종류의 라이브러리로 구성된다.
각각의 라이브러리에 따라 다른 접두어를 사용한다.
코어(Core)
uri : http://java.sun.com/jsp/jstl/core
접두어 : c
기능 :
변수 선언, 제어문, URL 처리 기능
제일 많이 사용된다.
XML 처리
http://java.sun.com/jsp/jstl/xml
접두어 : x
XML 문서 처리
포매팅(Formatting)
http://java.sun.com/jsp/jstl/fmt
접두어 : fmt
국제화 및 다국어지원 기능, 날짜 시간, 숫자, 형식 관련 기능
데이터베이스(Database)
http://java.sun.com/jsp/jstl/sql
접두어 : sql
데이터베이스 내 데이터 처리를 위한 기능
함수(Function)
http://java.sun.com/jsp/jstl/functions
접두어 : fn
문자열 및 컬렉션 함수
JSTL 태그 라이브러리를 구분하기 위해 사용되는 것은 URI 식별자이다.
JSP 페이지는 JSTL의 URI 식별자를 taglib 지시자를 통해 지정한 후 접두어와 연결해야 한다.
JSTL 코어 태그 라이브러리 사용
JSTL 코어 태그라이브러리는 자바 언어로 사용할 수 있는 다양한 프로그래밍적 기능을 제공하여 스크립틀릿의 많은 기능을 대체할 수 있다.
JSTL 라이브러리 중 실질적으로 많이 사용되는 태그 라이브러리로는 다음과 같은 기능을 구현한다.
출력
Out : JSPWrtier Stream의 내용 출력
예외 처리
Catch : 예외 처리에 사용
변수 처리
Set : 변수 설정
remove : 변수 제거
제어문
If : 기존 if문과 동일
Choose : 기존 case문과 동일
forEach : 컬렉션 같은 객체 요소를 반복할 때 사용
forTokens : 구분자로 토큰을 만들 때 사용
URL
Import : url에 지정한 클래스를 추가
redirect : url의 출력 스트팀을 재정의
url : url을 재작성
출력 처리
<c:out value="출력할 내용: escapeXml="[true/false]" default="출력할내용"/>
value : out 태그를 통해 출력할 값의 지정 및 문자열 지정이 가능하며 속성의 값이 java.io.Reader 타입일 경우 Reader데이터를 읽어 JspWriter 스트림에 값을 출력
excapeXml : HTML 작성에 사용되는 문자들을 변환하며 브라우저가 문자로 출력하도록 지정할지 여부를 지정 , 기본값은 true이다.
< → <
→ gt;
& → &
' → '
"→ "
공백 →
default : value의 속성의 값이 null일 경우 사용될 값을 지정
out 태그의 value 속성에는 표현식과 EL로 지정이 가능하며, 이는 value 속성에 전달되는 값이 null 일 경우도 있다는 것을 의미한다.
예외처리
예외처리는 잘 사용하지 않는다.
예외 객체가 선언된후 예외가 발생하면 사용한다.
${예외객체이름}
→ 예외 원인 출력
변수 처리
JSTL에 제공하는 태그들은 EL 변수로 사용한 값을 지정할 수 있다.
코어 태그 라이버르리에는 이러한 EL의 변수의 값이나 EL 변수 내 프로퍼티 값을 지정하기 위한 set 태그와 변수를 제거하기위한 remove 태그를 제공한다.
set 태그를 이용한 변수 및 프로퍼티 값 설정
코어 태그 라이브러리의 set 태그는 EL변수 및 EL 변수의 프로퍼티 값을 지정하기 위해 사용한다.
<c.:set var="변수명" value="변수값" scope="영역"/>
var : 값을 지정할 변수명 지정
value : var 속성에 지정한 변수의 값을 지정하며 표현식, EL, 문자열 데이터로 지정이 가능
scope : var 속성에 지정한 변수의 사용범위를 지정하며, page, request, session, application 지정이 가능, 지정하지 않을 경우 기본값은 page이다. (생략가능)
set 태그는 객체의 프로퍼티 값도 설정이 가능하다.
<c:set target="대상객체" propery="프로퍼티명" value="프로퍼티값"/>
target : 프로퍼티를 지정할 객체를 지정, 표현식 및 EL 변수로 지정 가능
property : 설정할 프로퍼티명을 지정, target 속성에 명시된 객체가 자바 빈 객체일 경우 setter 메서드가 존재하는 프로퍼티일 경우 사용 가능
value : property 속성에 명시한 프로퍼티의 값을 지정
remove 태그를 이용한 변수 제거
<c:remove var="변수명" scope="영역" />
영역을 지정하지않으면 동일한 변수명은 모두 제거가 된다.
var : 제거할 변수명을 지정
scope : 제거할 변수가 포함된 영역을 지정하며, page,request, session, application 지정 가능, 지정하지 않을 경우 var에 명시된 모든 변수 제거
흐름제어 처리
JSTL에서는 스크립틀릿 내부의 자바 코드로 구현되는 제어문을 대체할 수 있는 흐름제어처리 태그를 제공한다.
스크립틀릿에 사용되는 조건문과 반복문은 코드블록이 복작하게 얽혀 코드의 가독성을 떨어트리는 원인이 된다.
JSTL에서 제공하는 제어문 태그를 사용하면 이러한 코드의 복잡성을 다소 해소할 수 있다.
if 태그
if 태그는 자바의 if 조건문 역할을 하는 태그이다.
if~else if ~ else 구문과 같은 방식은 지원하지 않으며 단일 if문만 지원한다.
<c:if test="조건" var="조건의 결과값을 지정할 EL변수">
조건이 참인 경우 수행할 내용
</c:if>
test : 조건을 지정하며 표현식 EL 사용 가능
var : 조건의 결곽밧이 저장될 EL 변수
choose 태그
choose 태그는 if~else 와 같은 다중 분기 기능을 구현할 수 있는 태그이다.
when 태그와 otherwise 태그를 사용한다.
<c:choose>
<c:when test="조건1">
조건1 수행될 내용
</c:when test="조건1">
<c:when test="조건2>
조건2 수행될 내용
</c:when test="조건2">
...
<c:otherwise>
상단의 when 태그의 조건에 부합되지 않을 경우 수행될 내용
</c:otherwise>
</c:choose>
조건 수행 구현 시 choose 태그가 상위 태그가 되고 이후 각 조건을 처리하기 위해 when 태그가 하위 태그로 입력된다.
otherwise 태그에서 when 태그의 조건을 만족하지 않는 상황을 처리하게 된다.
자바 문법과 비교하면 when 태그가 if, else if , otherwise 태그가 else 구문 과 비슷하며 또한 switch~case 문과 유사한 상태를 가진다.
forEach 태그
forEach태그는 배열, Map, 컬렉션 객체들과 같이 여러 값을 저장할 수 있는 요소들을 반복 처리할 때 사용하는 태그이다.
Java의 for및 while 반복문과 같은 역할을 하고, 일반적으로 상황에 따라 다음 네 가지 방식으로 구현하며 , 태그에 사용되는 속성은 다음과 같다.
var : 태그 내에서 사용할 EL 변수명 지정
items : 실제 반복 처리될 데이터 지정
varStatus : 반복 상태를 저장할 EL 변수명을 지정하고, 관련 프로퍼티 사용
→ index, count, begin, end, step, first, last, current
index : 반복 실행 중인 인덱스
count : 반복 실행 횟수
begin ; forEach 태그의 begin 속성에 지정된 값
end : forEach 태그의 end 속성에 지정된 값
step : forEach 태그의 step 속성에 지정된 값
first : 현재 반복 시작 실행일 경우 true
last : 현재 반복 종료 실행일 경우 true
current : 현재 반복에서 사용할 컬렉션 내 객체
—
begin : 시작 인덱스 값 지정
end : 종료 인ㄷ게스 값 지정
step : 인덱스의 중심 값 지정
다음 첫번째 방식의 경우 반복에 사용될 데이터 없이 시작 인덱스와 종료 인덱스만을 명시하여 수행할 문장을 단순 반복하여 처리할 수 있다.
step 속성은 필요치 않을 경우 생략해도 무방하다.
<c:forEach begin="시작인덱스" end="종료 인덱스" step="인덱스 증감값">
반복 처리 부분
</c:forEach>
두번째 방식은 첫번째 방식과 비슷하며 var 속성을 이용해 현재 반복 중인 인덱스 값이 할당될 EL 변수명을 지정할 수 있다.
<c:forEach var="변수명" begin="시작인덱스" end="종료인덱스" step="인덱스 증감값">
반복 처리 부분
</c:forEach>
items 속성에 배열이나 Map 및 컬렉션 객체와 같이 여러 데이터를 저장하는 요소를 지정할 수 있으며 현재 반복 대상 데이터를 가리킬 EL 변수명을 var 속성으로 지정하게 된다.
<c:forEach var="변수명" items="반복 데이터">
반복 처리 부분
</c:forEach>
만약 반복될 문장 내에 반복에 관련된 데이터가 활용되어야 할 경우 다음과 같이 varStatus 속성을 이용할 수도 있다.
<c:forEach var="변수명" items="반복 데이터" varStatus="반복 상태 변수명" begin="시작 인덱스" end ="종료인덱스" step="인덱스 증감값">
반복 처리 부분
</c:forEach>
첫번째 forEach 태그는 단순히 태그 내 데이터를 반복하여 출력하고, 두 번쟤의 경우 반복 인덱스의 계산식에 var 속성을 사용하여 숫자의 합이 출력된다.
세번째 및 네번째 forEach태그에서는 collection을 사용하고 필요에 따라 varStatus 속성을 사용하여 반복 상태 변수를 통해 추가적으로 기능을 수행한다.
forTokens 태그
forTokens태그는 Java의 for문과 java.util.StringTokenizer를 사용하여 문자열에 포함한 특정 문자를 토큰으로 지정한 후 반복 수행시키는 기능 처럼 문자열에 특정 문자를 기준으로 우너본 문자열을 부분 문자열로 나누어주기 위한 기능을 제공한다.
따라서 전화번호 및 주민등록번호와 같이 데이터 자체에 구분 문자가 포함되거나 데이터베이스의 내용을 CSV파일로 추출했을 때 유용하게 사용할 수 있다.
<c:forTokens var="토근이대입될 변수" items="토큰을 포함한 원본 문자열" delims="토큰문자">
...
</forTokens>
URL 처리
JSTL 코어 태그 라이브러리에는 URL 처리를 위해 URL을 생성하기 위한 url 태그와 리다이렉트 처리를 위한 redirect 태그 , 인클루트 방식과 유사한 import 태그를 제공한다.
JSTL에서 제공하는 이러한 URL 처리 태그들은 기존에 사용했던 스크립틀릿, 표현식, 액션 태그 등의 사용방식에 비해 내외부 자원의 활용도가 높고 구조적 구현이 가능하여 유용하게 활용된다.
redirect 태그
redirect태그는 response 내장객체의 sendRedirect() 메서드처럼 태그에 지정한 페이지로의 리다이렉트 기능을 제공한다.
따라서 redirect 태그를 사용하면 JSP 페이지 외의 웹 자원 그리고 다른 웹 서버의 자원도 호출이 가능하다.
redirect 태그는 다음과 같이 구현하며 url 속성에는 호출할 URL을, context 속성에는 콘텍스트 경로를 지정할 수 있으나 일반적으로 url 속성만 사용한다.
리다이렉트될 페이지에 전송할 파라미터가 있을 경우 param 태그를 사용하여 지정해주며 파리미터는 여러 개 지정이 가능하다.
<c:redirect url="호출할 URL" context="컨텍스트 경로">
<c:param name="파라미터명1" value="값1"/>
...
</c:redirect>
import 태그
import 태그는 jsp:include 액션 태그와 유사하게 현재 JSP 페이지에 다른 웹페에지의 결과를 포함시키는 기능을 수행한다.
그러나 import 태그는 JSP 페이지가 아닌 다른 종류의 웹 페이지 및 다른 서버의 웹 페이지도 불러올 수 있다는 점에서 차이가 있다.
<c:import url="포함할 URL" var="URL 데이터를 저장할 EL 변수명" scope="영역" charEncoding="문자셋">
<c:param name="파라미터명1" value="값1"/>
...
</c:import>
url 속성에는 현재 JSP 페이지를 포함할 URL을 지정하고 var 속성에는 url 속성에 지정한 URL로부터 읽어온 데이터를 저장할 EL 변수명을 지정한다. var 속성이 지정되지 않을 경우 읽어온 데이터를 바로 출력하게 된다.
scope 속성에는 var 속성이 지정되었을 경우 해당 EL 변수가 저장될 영역을 지정할 수 있으며 charEncoding 속성에는 데이터를 읽어올 때 사용할 문자셋을 지정할 수 있다.
param 태그에는 import 대상 URL에 전송할 파라미터를 지정해줄 수 있으며 여러 개의 파라미터 지정이 가능하다.
url 태그
url 태그는 간단히 말해 URL 전용 set 태그라고 볼 수 있는 태그이다.
즉 , 특정 URL 및 전송 파라미터를 설정한 내용을 변수에 저장하는 용도로 사용하며 파라미터 지정도 가능하다.
url 태그는 다음과 같이 구현한다.
url태그 역시 앞서 살펴보았던 redirect나 import 태그와 마찬가지로 param 태그를 사용하여 대상 URL 주소에 전송할 파라미터를 지정할 수 있다.
<c:url var="지정한 URL 내용을 저장하기 위한 변수명" value="대상URL" scope="변수 저장 영역">
<c:param name="파라미터명1" value="값1"/>
...
</c:url>
'Back-end' 카테고리의 다른 글
Lombok (0) | 2021.10.06 |
---|---|
Spring 기본 세팅 (0) | 2021.10.06 |
EL(Expression Language) (0) | 2021.09.05 |
데이터베이스 프로그래밍 (0) | 2021.09.04 |
시큐리티 커스텀 로그인 폼 (0) | 2021.09.03 |