mojo's Blog
JSP - 커스텀 태그, EL, JSTL 본문
커스텀 태그와 EL
커스텀 태그란?
사용자 정의 태그를 의미한다.
즉 스크립트릿 사용을 줄이고 태그와 같은 형태로 프로그램 코드를 대체하거나 재활용 가능한 구조를 통해 태그 라이브러리로 활용하고자 개발된 규격이다.
외형적 형태로는 XML(HTML) 구조이지만 서블릿 형태로 변환될 때 자바 코드로 변경되어 통합되는 방식이다.
커스텀 태그를 사용하기 위해서는 taglib 지시어를 사용하여 커스텀 태그가 어디에 정의되어 있는지 먼저 선택해야 하며 태그에 사용할 접두어를 지정해야 한다.
커스텀 태그는 잘 사용하면 매우 편하지만 커스텀 태그 자체가 서버에서 해석되는 구조이며, 프로젝트가 특정 커스텀 태그에 종속될 문제가 존재한다.
다음은 특정 상품 코드를 전달하면 해당 상품에 대한 세부 정보를 출력하기 위해 커스텀 태그를 사용한 예시다.
<%@ taglib tagdir="/WEB-INF / tags" prefix="m" %>
<m:printData pid="87459989" />
- 태그 파일로 정의된 커스텀 태그를 사용하며 'Web-INF/tags/printData.tag' 파일로부터 태그 정의를 가지고 온다.
- m은 태그 앞에 붙일 접두어로 태그 파일명이 태그 이름이 된다.
표준 액션과 커스텀 태그
커스텀 태그는 태그 구조로 기능을 구현하는 방식으로 개발자가 필요에 따라 커스텀 태그를 구현해 프로그램에 활용할 수 있다.
<jsp:useBean> 또는 <jsp:setProperty> 역시 커스텀 태그로 jsp에 기본적으로 포함되어 있어 표준 액션이라고 부르며 taglib 지시어 없이 바로 사용할 수 있다.
EL 이란?
표현 언어로 현재 페이지의 자바 객체 혹은 application, session, request, page 와 같은 scope object에 저장된 자바 빈 객체를 손쉽게 접근하고 사용할 수 있게 해준다.
기본적으로 데이터를 표현하기 위한 용도로 설계되었지만 제한된 객체 참조가 가능하며 해당 객체의 메서드 호출도 가능하다.
EL 장점은 다음과 같다.
- 간단한 구문으로 손쉽게 변수/객체를 참조할 수 있다.
- 데이터가 없거나 null 객체를 참조할 때 에러가 발생하지 않는다.
EL을 통해 scope object에 저장된 자바 빈 객체를 참조하는 방법은 다음과 같다.
이름 : ${m.name} <br>
EL을 사용하지 않을 경우 다음과 같이 표현식을 사용하거나 <jsp:getProperty> 액션으로 출력이 가능하다.
이름 : <%= m.name %> <br> // 표현식
이름 : <jsp:getProperty name="m" property="name" /> <br> // 액션 사용
기본적인 사칙연산, 비교연산, 논리연산, 3항 연산 등이 가능하다.
${10 + 20} // 사칙연산, 30
${true && false} // 논리연산, false
${10 >= 20} // 논리 연산, false
${user.name == "홍길동" ? "교수" : "학생"} // 3항 연산, 홍길동이면 교수 출력
참조하는 객체가 배열이나 맵 형태인 경우 다음과 같이 사용된다.
${myList[0]} // 배열인 경우
${myMap["name"]} // 맵인 경우
EL은 기본적으로 모든 Scope에서 자바 빈 객체를 찾는다.
만일 특정 scope 만을 대상으로 참조하려면 '내장객체명Scope.속성이름' 으로 사용할 수 있다.
예를 들어 session, request 모두에 'm'이라는 이름으로 저장된 객체가 있다고 할 때, request scope에 있는 객체를 참조하려면 다음과 같이 사용할 수 있다.
이름: ${requestScope.m.name}
JSTL
JSTL이란?
JSP Standard Tag Library은 JSP에서 스크립트릿, 즉 자바 코드 블록을 사용하지 않고 HTML 형식을 유지하면서 조건문, 반복문, 간단한 연산과 몇몇 유용한 기능을 손쉽게 사용할 수 있도록 지원하기 위해 만들어진 표준 커스텀 태그 라이브러리이다.
규격상 JSTL은 core, xml, I18N(다국어 처리), 데이터베이스, 함수 등으로 구성되어 있으나 뷰 중심의 JSP 구현에는 core 정도만 사용된다.
★ JSTL 설치 및 사용하기
1. Apache Tomcat® - Apache Taglibs Downloads 에 접속하여 <Impl>, <Spec>을 클릭하여 다운로드 한다.
- Impl : taglibs-standard-impl-1.2.5.jar
- Spec : taglibs-standard-spec-1.2.5.jar
2. 다운로드한 라이브러리 파일을 [WEB-INF] -> [lib] 폴더에 복사해 넣어준다.
3. JSTL을 JSP에서 사용하려면 taglib 지시어를 추가해야 한다.
다음에 나올 core 라이브러리 사용을 위해서 다음과 같이 작성한다.
<% taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
core 라이브러리는 변수 처리, 흐름 제어, URL 관리, 출력 등 기본적인 기능을 구현해둔 라이브러리다.
기능 | 태그 | 사용 예 |
변수 관련 | remove, set | 변수 지정과 삭제 |
흐름 제어 | if, choose - when - otherwise, forEach, forTokens | 조건 처리, 반복, 토큰 파싱 |
URL 관리 | import, redirect, url, param | URL 핸들링 |
기타 | catch, out | 에러 처리, 출력 |
제일 많이 사용되는 기능인 흐름 제어와 관련 태그를 살펴보도록 한다.
※ <c:if>
자바의 if 문과 유사하지만 else는 지원하지 않는다.
또한 조건 테스트를 위해 속성을 참조할 범위를 지정할 수도 있지만 필수 사항이 아니다.
사용 형식과 예시는 다음과 같다.
사용 형식
<c:if test="조건" [var="결과 변수"] [scope="{page|request|session|application}" ]>
조건이 참(true) 인 경우 출력되는 부분
</c:if>
사용 예시
<c:if test="${msg == 'user1'}" var="result">
test result : ${result}
</c:if>
※ <c:forEach>
가장 많이 사용되는 태그로 화면에 데이터를 반복해서 출력할 때 주로 사용한다.
자바의 for문과 같은 개념이지만 커스텀 태그 특성상 정밀한 설정이 가능하지 않기 때문에 제공되는 속성을 잘 활용해야 한다.
<c:forEach> 는 진행 상태를 확인하기 위해 index, count 등을 지원하는 varStatus를 제공한다.
사용 형식
<c:forEach [var="참조 객체"] [varStatus="상태 정보 변수"] begin="시작" end="종료"
[step="반복 단계 증가 값, 1이 기본"]>
반복 출력되는 부분
</c:forEach>
사용 예시
<c:forEach var="m" items="${members}" begin="0" varStatus="status" end="5">
index : ${status.index} /
count : ${status.count} <BR>
name : ${m.name} <BR>
email : ${m.email} <BR>
<HR>
</c:forEach>
JSTL과 EL 종합 연습
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>JSTL 종합 예제</title>
</head>
<body>
<h2>JSTL 종합 예제</h2>
<hr>
<h3>set, out</h3>
<c:set var="product1" value="<h2>애플 아이폰</h2>" />
<c:set var="product2" value="삼성 갤럭시 노트" />
<c:set var="intArray" value="${[1, 2, 3, 4, 5]}" />
<p>
product1(jstl):
<c:out value="${product1}" default="Not registered" escapeXml="true" />
</p>
<p> product1(el): ${product1} </p>
<p> intArray[2]: ${intArray[2]} </p>
<hr>
<h3>forEach: 배열 출력</h3>
<ul>
<c:forEach var="num" varStatus="i" items="${intArray}">
<li>${i.index} : ${num} </li>
</c:forEach>
</ul>
<hr>
<h3>if</h3>
<c:set var="checkout" value="true" />
<c:if test="${checkout}">
<p>주문 제품: ${product2}</p>
</c:if>
<c:if test="${!checkout}">
<p>주문 제품이 아님!</p>
</c:if>
<c:if test="${!empty product2}">
<p>
<b>${product2} 이미 추가됨!!!</b>
</p>
</c:if>
<hr>
<h3>choose, when, otherwise</h3>
<c:choose>
<c:when test="${checkout}">
<p>주문 제품: ${product2}</p>
</c:when>
<c:otherwise>
<p>주문 제품이 아님!!</p>
</c:otherwise>
</c:choose>
<hr>
<h3>forTokens</h3>
<c:forTokens var="city" items="Seoul|Tokyo|New York|Toronto" delims="|" varStatus="i">
<c:if test="${i.first}">도시 목록 : </c:if>
${city}
<c:if test="${!i.last}">, </c:if>
</c:forTokens>
</body>
</html>
'JSP' 카테고리의 다른 글
데이터베이스와 JDBC (0) | 2021.12.31 |
---|---|
MVC 패턴의 이해 (0) | 2021.12.31 |
JSP 액션 태그 (0) | 2021.12.29 |
JSP 프로그래밍 (0) | 2021.12.29 |
JSP의 기초 (0) | 2021.12.29 |