Java Web10 - JSTL, EL
EL(Expression Language)
<%=session.getAttribute("testValue") %>
<%=request.getParameter("name") %>
<%=request.getAttribute("idx") %>
<%
Person p = (Person)request.getAttribute("person");
%>
<%=p.getName() %>
기존 방식.
${sessionScope.testValue }
${param.name }
${requestScope.idx }
${person.name }
EL을 사용한 방식. 두 방식은 완전히 같은 것이니 간단한 EL을 쓰면 된다.
${person.name }
은 멤버변수에 직접 접근이 아닌 Getter 를 자동으로 호출하므로 멤버변수에 대한 Getter 메서드 정의가 필수다. 즉, ${person.name} 문장은 내부적으로 Person 객체의 getName() 메서드를 자동으로 호출한다.
EL의 연산자
${10 + 20 } // 30
<%=request.getParameter("age") + 20 %> // 2020
${param.age + 20 } // 40
파라미터값을 연산자를 통해 연산도 가능하며, 숫자 데이터의 경우 형변환 생략이 가능하다.
${10 >= 20 }
${10 ge 20 }
${10 == 10 }
${10 eq 10 }
${10 != 10 }
${10 ne 10 }
연산자 기호를 사용하거나 기호에 대응하는 연산자 이름을 사용해도 된다.
// name == ""
// name2 == null
<%=request.getParameter("name") %> // 파라미터 값이 존재하지 않으면 ""
<%=request.getParameter("name2") %> // 파라미터가 존재하지 않으면 null
${param.name } // 파라미터 값이 존재하지 않으면 ""
${param.name1 } // 파라미터가 존재하지 않아도 ""
${empty param.name } // name 파라미터 값이 없음(true)
${empty param.name1 } // name1 파라미터가 없음(true)
${param.name eq null } // null 값이 아니므로 false
${param.name eq "" } // 널스트링 값이므로 true
${param.name ne null } // null 값이 아니므로 true
동등비교연산을 통해 null 값 비교 시 진짜 null 값이 저장된 경우에만 true가 된다. empty 와 동일하게 name 값이 비어있는지 판별하려면 or 연산자 결합이 필요하다.
${param.name eq null or param.name eq "" } // null 값이 아니므로 false
jstl(Jsp Standard Tag Library)
JSP 에서 사용 가능한 커스텀 태그 라이브러리이다.
- JSTL Core : JSTL 의 기본 핵심 기능(조건문, 반복문, 변수 설정 및 출력 등)을 제공한다.
- JSTL Fmt : 데이터 포맷(형식)을 제어 기능을 제공한다.
- JSTL 기능을 사용하려면 해당 라이브러리 다운로드 후 Build path 추가가 필요하다.
- 또한, 등록된 JSTL 라이브러리를 실제 사용하려면 반드시 <%@ %> 디렉티브를 사용하여 taglib 디렉티브를 등록하고 prefix 값과 uri 정보를 설정해줘야한다.
- prefix : 태그에서 사용할 문구(접두어)를 지정하며, 주로 core 의 약자 c 를 사용한다.
- uri : 태그 라이브러리가 존재하는 위치(웹 주소 형식).
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="str" value="Hello, World!" />
${str }
<c:set>
태그를 사용하여 변수선언 및 초기화를 한다.var 속성에 변수명, value 속성에 변수값을 지정하면 된다. scope 속성을 사용하여 변수의 유효범위 지정이 가능하며 생략 시 page 속성이 지정된다. 생성된 변수는 EL 을 사용하여 접근이 가능하다.
<%int num = 20; %>
${num} // 불가능
자바 문법으로 선언된 변수는 EL 에서 직접 접근이 불가능하다.
<c:set var="str" value="Hello, World!" />
<%=str %> // 불가능
<c:set>
태그를 통해 생성된 변수는 기본 자바 문법(표현식 등)으로 접근이 불가능하다.
<%int num = 99; %>
<c:set var="num" value="<%=num %>" />
${num }
<c:set>
태그를 사용하여 자바 변수 선언 및 값 지정 시 표현식을 사용하여 자바 변수 접근이 가능하다.
<%
int num = 99;
pageContext.setAttribute("num", num);
${num }
%>
page 영역 객체(pageContext)의 setAttribute() 메서드를 통해 값 저장 시 EL 로 접근이 가능하다.
<c:remove var="str"/>
<c:remove>
태그를 사용하여 변수값을 삭제한다. EL 로 접근 가능한 변수명만 지정 가능하다.
if문
<c:if test="조건식">
// 조건식 판별 결과가 true 일 때 실행할 문장들...
</c:if>
<c:set var="num" value="10" />
<c:if test="${num gt 0 }"> <%-- ${num > 0 } 동일 --%>
num 값이 0 보다 크다<br>
</c:if>
자바의 if문에 해당하며 else문이 없는 단일 if문과 동일하다.
<c:choose>
<c:when test="조건식1">
// 조건식1 이 true 일 때 실행할 문장들...
</c:when>
<c:when test="조건식2">
// 조건식2 가 true 일 때 실행할 문장들...
</c:when>
<c:otherwise>
// 조건식이 모두 false 일 때 실행할 문장들...(생략 가능 자바의 else문과 동일하다.)
</c:otherwise>
</c:choose>
<c:set var="num" value="10" />
<c:choose>
<c:when test="${num > 0 }"> <%-- 양수 --%>
양수!<br>
</c:when>
<c:when test="${num < 0 }"> <%-- 음수 --%>
음수!<br>
</c:when>
<c:otherwise>
양수도 음수도 아님!<br>
</c:otherwise>
</c:choose>
for문
// 일반 for문
<c:forEach var="변수명" begin="시작인덱스" end="끝인덱스" step="증감값">
// 반복하면서 수행할 작업들...
</c:forEach>
// 향상된 for문
<c:forEach var="변수명" items="${객체(또는 배열)명}">
// 반복하면서 수행할 작업들...
</c:forEach>
<c:forEach var="i" begin="1" end="10">
${i }
</c:forEach>
1에서 10까지 출력된다.
<c:forEach var="subject" items="${subjects }" varStatus="status">
${status.index} 번 배열 데이터 : ${subject }<br>
</c:forEach>
varStatus 속성 사용 시 지정된 객체에 대한 상태 정보를 관리할 수 있다. (속성명.index 로 인덱스 활용 가능).
Leave a comment