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을 사용하는 것이 데이터를 사용함에 있어 훨씬 효율적입니다.