1. EL ( Expression Language )
EL은 JSP의 출력 문법을 대체하는 표현 언어입니다.
- <%= i %>
- JSP에서의 값 표기법이며, i는 변수입니다.
- ${ i }
- EL에서의 값 표기법이며, i는 이름입니다.
객체 Scope에서 애트리뷰트의 이름이 같을 경우, Scope가 작은 범위에서 큰 범위로 해당 이름이 존재하는지 찾습니다.
예를 들어, request scope에 A 애트리뷰트가 있고 session scope에 동일한 이름의 A 애트리뷰트가 있을 때,
${ A }의 결과는 request scope에 있는 A 애트리뷰트의 값이 출력될 것입니다.
EL 표기법에서 파라미터의 값은 param 키워드를 통해 가져올 수 있습니다.
또한 JSP 값 표기법에서 파라미터는 문자열이지만, EL에서 숫자는 숫자로, 문자열은 문자열로 인식합니다.
예를 들어, 클라이언트로부터 localhost:8080/testing/test.sjp?a=10 으로 요청이 올 때,
test.jsp 파일에서 아래와 같이 작성하면,
<%= request.getParameter("a") + 100 %> JSP => 10100 ${param.a + 100 } EL => 110
JSP 값 표기법에서는 a가 문자열이기 때문에 10100이 되지만,
EL 표기법에서는 10을 정수형으로 인식하기 때문에 110이 됩니다.
EL 표기법에서는 자주 사용될 수 있는 객체들을 미리 정의해놓았습니다.
내장 객체
pageScope |
page Scope에 접근하기 위한 객체 |
reqeustScope |
request Scope에 접근하기 위한 객체 |
sessionScope |
session Scope에 접근하기 위한 객체 |
applicationScope |
application Scope에 접근하기 위한 객체 |
param |
파라미터 값을 가져오기 위한 객체 |
header |
헤더 값을 가져오기 위한 객체 |
cookie |
쿠키 값을 가져오기 위한 객체 |
initParam |
JSP 초기 파라미터를 가져오기 위한 객체 |
pageContext |
pageContext 객체에 접근하기 위한 객체 |
이전 글에서 객체 Scope 테스트를 할 때 EL 표기법을 사용했었는데, 각 객체 Scope에 접근할 수 있었던 이유는 EL 표기법에서 내장 객체를 제공하기 때문입니다.
2. JSTL ( JavaServer Pages Standard Tag Library )
JSTL은 태그를 통해 JSP 코드를 관리하는 라이브러리로서, JSP의 가독성이 좋아집니다.
라이브러리이기 때문에 JSTL을 사용하려면, 라이브러리를 다운로드 해서 추가해야 합니다. ( 링크 )
그리고 JSP 페이지에서 아래의 세 줄을 맨 위에 작성해야 해야 JSTL 문법을 사용할 수 있습니다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
태그의 종류에는 core , format , function , xml , sql 이 있습니다.
태그의 속성들이 워낙 많기 때문에 이 글에서 전부 다룰 수는 없을 것 같습니다.
그래서 자주 사용되는 내용만 예제로 살펴보고, 나머지는 치트시트 링크로 대체하겠습니다. ( JSTL cheat sheet - 링크 )
1) set
2) if
3) choose
4) foreach
5) import
6) 날짜 format
<fmt:parseDate value='${ vo.regDate }' var='regDate' pattern="yyyy-MM-dd H:m" />
<td><fmt:formatDate value="${ regDate }" pattern="MM월dd일 H:m"/></td>
- vo.regDate는 MySQL의 Datetime 타입의 값이라고 가정합니다.
- Datetime은 2018-03-17 11:48:33 의 format을 갖는데, 이를 JSP에서 그대로 사용하는 것은 보기가 안좋으므로 "03월17일 11:48"의 format으로 바꾸는 예제입니다.
- 검색을 하시면 더 많은 pattern이 있으므로 참고하시면 될 것 같습니다.
7) split
<c:set var="phone" value="${ fn:split(userVO.phone , '-') }" />
- 문자열을 구분자에 따라 배열로 만드는 함수입니다.
- 예를 들어, 핸드폰번호 010-1111-1111 이라는 문자열이 있을 때 하이픈 "-"를 기준으로 파싱하고 싶을 때 사용합니다.
8) 합계
<c:set var ="total" value = "0" />
<c:forEach var="price" items="${prices}">
<c:set var= "total" value="${ total + price }"/>
</c:forEach>
<c:out value="${total}"/>
9) 개행처리
데이터를 추가할 때 textarea로 입력된 값은 개행처리가 되어 DB에 저장되어 있습니다.
그런데 서버로부터 데이터를 불러와 JSP에 값을 출력 해보면 개행처리가 되지 않습니다.
이를 해결하기 위해서는 pageContext와 더불어 JSTL replace 함수를 사용하면 됩니다.
<%
pageContext.setAttribute("newLine", "\n");
%>
<td align="center">
${fn:replace(productVO.info, newLine, '<br>') }
</td>
10) JSTL 적용 전과 적용 후 비교 ( 1 )
11) JSTL 적용 전과 적용 후 비교 (2)
이상으로 JSTL과 EL에 대해 알아보았습니다.
JSP 파일에 스클립틀릿 <% %>을 사용하는 것보다, JSTL과 EL 사용을 권장합니다.
그 이유는 <% %>을 사용하면 HTML 태그를 들여쓰기 할 때 가독성이 떨어지기 때문입니다.
또한 퍼블리셔와 협업할 때, 그 분들의 작업공간에 Java 코드가 있으면 보기가 불편하실겁니다.
그리고 개발자 입장에서도 나중에 Spring 프레임워크에서도 JSTL/EL 표기법을 사용하는데, JSTL/EL을 사용하는 것이 데이터를 사용함에 있어 훨씬 효율적입니다.