JSP - EL(Expression Language)
JSP에서 사용하는 '${}'는 EL이라는 표현식이다.
JSP는 주로 HTML 태그들과 자바스크립트, CSS 등을 이용해 코드를 작성한다.
JSP에서는 자바를 사용하기에 자바를 모르는 사람도 JSP 2.0 부터는 사용할 수 있도록 출력용 언어인 'EL'을 개발했다.
EL을 이용하여 자바 코드를 몰라도, getter/setter를 호출하고, 연산 등도 가능해졌다.
EL을 이용하면 자동으로 getter를 호출하게 된다.
예를 들어, DTO 중에서 첫 번째 DTO name과 age를 출력하고 원한다면, getName(), getAge()를 쓰지 않아도 된다.
${list[0].name}, ${list[0].age}
위와 같이 코드를 작성해도 된다.
DTO 클래스에서 private처리가 되어 자바 코드로는 외부에서 바로 접근이 불가능하더라도, EL은 getter를 자동으로 호출하여 가능하게 한다.
EL은 '표현식'이기 때문에 '${}' 안에 표현식이 결과를 만들어 낼 수 있다면 언제든 사용 가능하다.
즉, EL은 JSP에서 간단한 표현식을 활용해 데이터를 출력하는 용도이다. EL이 출력만을 담당하기 때문에 제어문이나 반복문과 같은 '식'이 아닌 '문'을 처리하기 위해서는 따로 JSTL 라이브러리가 필요하다.
JSTL
JSTL은 'JSP에서 동작하는 새로운 태그들의 묶음'이라고 볼 수 있다. 자바 문법보다는 간결하게 제어문이나 반복문 등을 처리하고, 확장이 가능하도록 설계되었다.
JSTL을 사용하려면 라이브러리가 존재해야하기 때문에, build.gradle 파일에 다음과 같이 의존성 라이브러리를 추가해줘야 한다.
dependencies {
compileOnly('javax.servlet:javax.servlet-api:4.0.1')
testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
implementation group: 'jstl', name: 'jstl', version: '1.2'
}
우선, JSP에서 JSTL을 사용하려면 파일 상단에 아래와 같은 태그 관련 설정을 추가해줘야 한다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
위와 같이 '<% %>' 이렇게 작성되는 코드를 JSP에서는 '지시자'라고 한다. 이런 선언이 있어야 JSP에서 JSTL을 이용할 수 있다.
가장 많이 사용하는 반복문 처리 중 하나이다. <c:forEach>는 배열이나 리스트 등의 처리에 사용한다.
<c:forEach>는 다음과 같은 속성을 이용한다.
1) var : EL에서 사용될 변수 이름
2) items : List, Set, Map 등의 컬렉션
3) begin/end : 반복의 시작/끝 값
이렇게 코드를 작성할 수 있을 것이다.
<c:forEach var = "dto" items = "${users}">
<li> ${dto}</li>
</c:forEach>
JSTL 제어문으로 위 2가지가 있다.
<c:if>는 test라는 속성이 존재한다. test 속성값으로는 true/false가 나오는 식이나 변수 등이 들어간다.
<c:choose>는 자바 언어의 switch 구문과 비슷하다. 또한, <c:choose>는 내부에 <c:when test=~~>, <c:otherwise>를 이용해 'if ~ else if ~ else'의 처리도 가능하다.
반복문이나 제어문을 처리하다 보면 '새로운 변수'를 생성해야 하는 경우가 온다. 이럴 때 <c:set>을 이용할 수 있다.
var 속성으로 변수명을 지정할 수 있고, value 속성으로 값을 지정할 수 있다.
<c:set var="friends" value = "10"></c:set>
<ul>
<c:forEach var="human" begin="1" end="10">
<c:if test="${human == friends}">
human is friends
</c:if>
</c:forEach>
</ul>