일반적으로 알고있는 JSTL이란 JSTL + EL의 조합을 말한다.
HTML 코드 내에 java 코드인 스크립틀릿 <%= student %>
를 ${student}
로, <%=if%>
문을 <c:if>
, <%=for%>
문을 <c:forEach>
로 대체하여 사용한다.
예전에는 스크립틀릿을 많이 사용했지만 가독성이 떨어지고, 뷰와 비즈니스로직의 분리로 읜해 현재는 JSTL을 많이 사용하는 추세이다. JSTL과 EL은 보통 함께 사용하는데 그 이유와 각각의 개념, 각각의 차이와 문법이 있다.
정식 명칭은 자바서버 페이지 표준 태그 라이브러리 (JavaServer Pages Standard Tag Library)이고 줄여서 JSTL이라 부른다.
위키피디아를 참조하면, JSTL은 Java EE 기반의 웹 애플리케이션 개발 플랫폼을 위한 컴포넌트 모음이다. JSTL은 XML 데이터 처리와 조건문, 반복문, 국제화와 지역화와 같은 일을 처리하기 위한 JSP 태그 라이브러리를 추가하여 JSP 사양을 확장했ㄷ자.
JSTL은 JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공한다. 표준화된 태그 셋을 사용하여 자바 코드가 들락거리는 것보다 더 코드의 유지보수와 응용 소프트웨어 코드와 사용자 인터페이스 간의 관심사의 분리로 이어지게 한다.
JSTL은 라이브러리이기 때문에 사용하기 전에 core를 header에 추가해주어야 한다.
<% @taglib url="http://java.sun.com/jsstl/core" prefix="c" %>
▶ core의 태그들
<c:set /> : 변수명에 값을 할당
<c:remove /> : 변수 제거
<c:out /> : 값을 출력
<c:if test"" /> : 조건식에 해당하는 블럭과 사용될 scope 설정
<c:choose /> : 다른 언어의 switch와 비슷
<c:when /> : switch문의 case에 해당
<c:otherwise /> : switch문의 default에 해당
<c:forEach items="" /> : 다른 언어의 loop문. items 속성에 배열 할당 가능
정식 명칭은 표현 언어 (Expression Language)라고 하며 줄여서 EL이라고 부른다.
JSP 2.0 스펙에 새로 추가된 스크립트 언어로서 초기의 EL은 JSTL의 액션 태그에서만 작동하는 문제가 있었는데, JSP 2.0부터는 JSP 컨테이너가 EL 표현식을 해석할 수 있게 도어 표준 액션 태그, 커스텀 태그, 템플릿 데이터와 같이 자바 코드를 사용해야 했던 모든 곳에 EL을 사용할 수 있다.
EL은 자바스크립트에서 확장된 Xpath에서 힌트를 얻어 만들어진 언어로 값이 없는 변수(null)에 대해 좀 더 관대하고 데이터 형 변환을 자동으로 해주는 특징이 있다. EL을 사용하면 값이 없거나 형 변환 등에 전혀 신경 쓸 필요 없이 서버로 전송해서 형변환 없이 사용할 수 있다.
<%= name %>
${name}
▶ EL의 내장 객체
${pageScope{ : page Scope에 접근하기 위한 객체
${requestScope} : request Scope에 접근하기 위한 객체
${sessionScope} : session Scope에 접근하기 위한 객체
${applicationScope} : application Scope에 접근하기 위한 객체
${pageContext} : pageContext 객체에 접근하기 위한 객체
${param} : 파라미터 값을 가져오기 위한 객체
${header} : 헤더 값을 가져오기 위한 객체
${cooke} : 쿠키 값을 가져오기 위한 객체
${initParam} : JSP 초기 파라미터를 가져오기 위한 객체
▷ Scope
웹 서버에서 객체 또는 변수가 생성된 후 유효할 수 있는 범위를 의미
종류 (유지범위, 활용방법)
Ⅴ Page Scope
== 요청된 page 내부에서 사용
== 페이지 내에서 지역변수처럼 사용
Ⅴ Request Scope
== 요청부터 응답까지
== Forward를 통해 데이터를 넘길 때 사용
Ⅴ Session Scope
== Web Browser 종료 또는 설정한 시간 동안
== 사용자 별로 정보를 저장할 때 사용 (ex. 장바구니)
Ⅴ Application Scope
== Web Application이 종료될 때까지
== 사용자에게 공통적으로 무엇인가를 보여 줄 때 사용
▶ EL의 연산자 종류 및 표현법
+ : + (덧셈)
- : - (뺄셈)
* : * (곱셈)
/ : div (나눗셈)
% : mod (나머지)
\&\& : and
|| : or
== : eq
!= : ne
< : lt
> : gt
<= : le
>= : ge
Empty : 값이 NULL일 경우 true를 반환
JSTL+EL 조합은 스크립틀릿을 사용할 때보다 훨씬 간경하고 가독성 좋은 HTML 코드를 완성할 수 있다.
스크립틀릿과 HTML 태그들을 함께 사용하지 않아야하는 주된 이유는 가독성 문제이다. JSTL을 사용하면 개발자는 HTML과 태그로만 구성된 일관된 소스를 볼 수 있다.
EX.
<% @taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<body>
<c:forEach var="i" begin="1" end="10" step="1">
<c:out value="${i}"/>
<br/>
</c:forEach>
${person.address.city}
</body>
</html>
// javascript에서 model parameter를 가져오는 방법
var key = '<c:out value='${key}' />';
// javascript에서 context path를 가져오는 방법
var G_CONTEXT PATH = "${pageContext.request.contextPath}";
// jsp에서 url의 get parameter 가져오는 방법
<c:if test="${param.loginFail eq 'true'}>
<div class="login-fail">아이디 혹은 비밀번호가 일치하지 않습니다.</div>
</c:if>
// jsp에서 현재 년도 구하기
<%@taglib prefix="fmt" url="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate var="year" value="${now}" pattern="yyyy" />
<p>Current year: ${year}</p>
<p>Previous Year: ${year - 1 }</p>