EL & JSTL

BrokenFinger98·2024년 9월 27일
0

EL

EL (Expression Language)

  • EL은 표현을 위한 언어로 JSP 스크립트의 표현식을 대신하여 속성 값을 쉽게 출력하도록 고안된 language이다
  • 즉 표현식 (<%= %>)를 대체할 수 있다
  • EL 표현식에서 도트 연산자 왼쪽은 반드시 java.util.map객체 또는 Java Bean 객체여야 한다
  • EL 표현식에서 도트 연산자 오른쪽은 반드시 맵의 키이거나 Bean 프로퍼티여야 한다
  • EL에서 제공하는 기능
    • JSP의 네가지 기본 객체가 제공하는 영역의 속성(attribute) 사용
    • 자바 클래스 메소드 호출 기능
    • 표현 언어만의 기본 객체 제공
    • 수치, 관계, 논리 연산 제공

EL 문법

// 스크립트릿
<%= ((com.ssafy.model.MemberDto)request.getAttribute("userinfo")).getZipDto().getAddress() %>

// Expression Language
${userinfo.zipDto.address}

// [EL 문법] Map을 사용하는 경우
${Map.Map의 키}

// [EL 문법] Java Bean을 사용하는 경우
${Java Bean.Bean 프로퍼티}

[] 연산자

  • EL에는 Dot 표기법 외에 [] 연산자를 사용하여 객체의 값에 접근할 수 있다
  • [] 연산자 안의 값이 문자열인 경우, 이것은 맵의 키가 될 수도 있고, Bean 프로퍼티나 리스트 및 배열의 인덱스가 될 수 있다
  • 배열과 리스트인 경우, 문자로 된 인덱스 값은 숫자로 변경하여 처리합니다
// [] 연산자를 이용한 객체 프로퍼티 접근
${userinfo["name"]}

// Dot 표기법을 이용한 객체 프로퍼티 접근
${userinfo.name}

// 리스트나 배열 요소에 접근
// Servlet
String[] names = {"홍길동", "이순신", "임꺽정"};
request.setAttribute("userNames", names);

// JSP
${userNames[0]}    // 홍길동 출력
${userNames["1"]}  // 문자열인 인덱스 값이 숫자로 바뀌어 userNames[1]의 결과인 이순신 출력

내장객체

  • EL 내장객체는 JSP 페이지의 EL 표현식에서 사용할 수 있는 객체
categoryidentifierTypedescription
JSPpageContextJava Bean현재 페이지(jsp)의 프로세싱과 상응하는 PageContext instance
범위(scope)pageScopeMappage scope에 저장된 객체를 추출
requestScopeMaprequest scope에 저장된 객체를 추출
sessionScopeMapsession scope에 저장된 객체를 추출
applicationScopeMapapplication scope에 저장된 객체를 추출
요청 매개변수paramMapServletRequest.getParameter(String)을 통해 정보를 추출
paramValuesMapServletRequest.getParameterValues(String)을 통해 정보를 추출
요청 헤더headerMapHttpServletRequest.getHeader(String)을 통해 헤더 정보를 추출
headerValuesMapHttpServletRequest.getHeaders(String)을 통해 헤더 정보를 추출
쿠키cookieMapHttpServletRequest.getCookies()를 통해 쿠키 정보를 추출
초기화 매개변수initParamMapServletContext.getInitParameter(String)를 통해 초기화 파라미터 추출

EL 사용

  • pageContext를 제외한 모든 EL 내장 객체는 Map이다
  • 그러므로 keyvalue의 쌍으로 값을 저장하고 있다
  • 기본 문법 ${expr}

EL에서 객체 접근

  • request.setAttribute(”userinfo”, “아리랑”);
    1. ${requestScope.userinfo}
    2. ${pageContext.request.userinfo}, ${userinfo}
  • url?name=아리랑&fruit=사과&fruit=바나나
    1. ${param.name}
    2. `${paramValues.fruit[0]}, ${paramValues.fruit[1]}``
// EL에서 request 객체 접근
Method is : ${pageContext.request.method}

//Servlet
request.setAttribute("ssafy.user", memberDto);

// Case #1 : 에러
${ssafy.user.name}  // ssafy라는 속성은 존재하지 않음

// Case #2 : request 내장객체에서 [] 연산자를 통해 속성 접근
${reqeustScope["ssafy.user"].name}
  • ${cookie.id.value}
    1. Cookienull이라면 null return

    2. null이 아니라면 id를 검사 후 null이라면 null return

    3. idnull이 아니라면 value값 검사

      EL은 값이 null이라도 null을 출력 하지 않는다 (빈문자열)

// 스크립트릿을 통한 쿠키 값 출력
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
	if(cookie.getName().equals("userId")){
		out.println(cookie.getValue());
	}
}

// EL 내장 객체를 통한 쿠키 값 출력
${cookie.userId.value}

EL Operator(연산자)

  • 대부분 java와 동일
description
산술+, -, *, /, (div), %, (mod)
관계형== (eq), != (ne), < (lt), >(gt), <= (le), >= (ge)
3항 연산자조건 ? 값1 : 값2
논리&& (and), ll (or), ! (not)
타당성검사empty
  • empty 연산자에서 ture를 return 하는 경우 >> ${empty var}
    1. 값이 null이면 true
    2. 값이 빈 문자열(””) 이면 true
    3. 길이가 0인 배열([]) 이면 true
    4. Map 객체는 true
    5. Collection 객체이면 true

EL에서 객체 method 호출

<%
List<MemeberDto> list = dao.getMembers();
request.setAttribute("users", list);
%>

회원 수 : ${requestScope.users.size()}, ${users.size()}

주의 >> ${users.size} == <%=request.getAttribute("users").getSize()%>

JSTL

JSTL (JSP Standard Tag Library)

자바서버 페이지 표준 태그 라이브러리(JavaServer Pages Standard Tag Library, 약칭 JSTL)은 Java EE 기반의 웹 애플리케이션 개발 플랫폼을 위한 컴포넌트 모음이다. JSTL은 XML 데이터 처리와 조건문, 반복문, 국제화와 지역화와 같은 일을 처리하기 위한 JSP 태그 라이브러리를 추가하여 JSP 사양을 확장했다. JSTL은 JSR 52로서 JCP 하에서 개발되었으며, 2006년 5월 8일에 JSTL 1.2가 출시되었다.

JSTL은 JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공한다. 표준화된 태그 셋을 사용하여 자바 코드가 들락거리는 것보다 더 코드의 유지보수와 응용 소프트웨어 코드와 사용자 인터페이스 간의 관심사의 분리로 이어지게 한다.

JSTL

Tag

  • directive 선언 형식
  • <%@ taglib prefix=”prefix” uri=”uri” %>
libraryprefixfunctionURI
corec변수 지원, 흐름제어, URL처리jakarta.tags.core
XMLxXML 코어, 흐름제어, XML 변환jakarta.tags.xml
국제화fmt지역, 메세지 형식, 숫자 및 날짜 형식jakarta.tags.fmt
databasesqlSQLjakarta.tags.sql
함수Collection, String 처리jakarta.tags.functions

core tag

  • 선언 : <%@ taglib prefix=”c” uri=”jakarta.tags.core” %>
functiontagdescription
변수지원setjsp page에서 사용 할 변수 설정
remove설정한 변수를 제거
흐름제어if조건에 따른 코드 실행
choose, when, otherwise다중 조건을 처리할 때 사용(if ~ else if ~ else)
forEacharray나 collection의 각 항목을 처리할 때 사용
forTokens구분자로 분리된 각각의 토큰을 처리할 때 사용 (StringTokenizer)
URL처리importURL을 사용하여 다른 자원의 결과를 삽입
redirect지정한 경로로 redirect
urlURL작성
기타태그catchException 처리에 사용
outJspWriter에 내용을 처리한 후 출력

변수 선언 : <c:set>

  • <c:set> 액션은 변수나 특정 객체의 프로퍼티에 값을 할당할 때 사용
  • value 속성의 값이나 액션의 Body content로 값을 설정
  • var 속성은 변수를 나타내며, 변수의 생존범위는 scope 속성으로 설정 (디폴트는 page)
  • 특정 객체의 프로퍼티에 값을 할당할 때는 target 속성에 객체를 설정하고 property에 프로퍼티명을 설정
/// value 속성을 이용하여 생존범위 변수 값 할당
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>

// 액션의 Body 컨텐츠를 사용하여 생존범위 변수 값 할당
<c:set value="value" [scope="{page|request|session|application}"]>
body content
</c:set>

// value 속성을 이용하여 대상 객체의 프로퍼티 값 할당
<c:set value="value" target="target" property="propertyName"/>

// 액션의 Body 컨텐츠를 사용하여 대상 객체의 프로퍼티 값 할당
<c:set target="target" property="propertyName">
body content
</c:set>

예외 : <c:catch>

  • 기본적으로 JSP 페이지는 예외가 발생하면 지정된 오류페이지를 통해 처리한다
  • <c:catch> 액션은 JSP 페이지에서 예외가 발생할 만한 코드를 오류페이지로 넘기지 않고 직접 처리할 때 사용
  • var 속성에는 발생한 예외를 담을 page 생존범위 변수를 지정
  • <c:catch><c:if> 액션을 함께 사용하여 Java 코드의 try ~ catch 와 같은 기능을 구현할 수 있다
/// try ~ catch 구문
try {
	String str = null;
	out.println("Length of string : " + str.length());
} catch (Throwable ex){
	out.println("예외가 발생하였습니다 : " + ex.getMessage());
}

// <c:catch> 와 <c:if> 사용하기
<%@ page contentType="text/html" pageEncoding="UTF-8" errorPage="error.jsp" %>
<%@ taglib prefix="c+ uri="http://java.sun.com/jsp/jstl/core"%>

<c:catch var="ex">
<%
	String str = null;
	out.println("Length of string : " + str.length()); // 예외 발생!!
%>
</c:catch>

<c:if test="${ex != null}">
	예외가 발생하였습니다. ${ex.message}
</c:if>

조건문 : <c:if>, <c:choose> <c:when> <c:otherwise>

  • <c:if> 액션은 test 속성에 지정된 표현식을 평가하여 결과가 true인 경우 액션의 Body 컨텐츠를 수행
  • <c:if> 액션의 var 속성은 표현식의 평가 결과인 Boolean 값을 담을 변수를 나타내며, 변수의 생존범위는 scope 속성으로 설정
  • <c:choose> <c:when> <c:otherwise> 액션을 사용하면 if, else if, else 와 같이 처리할 수 있다
/// <c:if> 액션 사용 예
<c:if test="${userType eq 'admin'}">
<jsp:include page="admin.jsp" />
</c:if>

/// <c:if> 액션의 var 속성
<c:if test="${userType eq 'admin'}" var="accessible">
<jsp:include page="admin.jsp" />
</c:if>
...
<c:if test="${category == 'user' && menu == 'list'}">
회원 목록.
</c:if>

/// <c:choose>, <c:when>, <c:otherwise> 액션 사용 예
<c:choose>
	<c:when test="${userType == 'admin'}">
		관리자 화면...
	</c:when>
	<c:when test="${userType == 'member'}">
		회원 사용자 화면...
	</c:when>
	<c:otherwise>
		일반 사용자 화면...
	</c:otherwise>
</c:choose>

반복문 : <c:forEach>

  • <c:forEach> 액션은 컬렉션에 있는 항목들에 대하여 액션의 Body 컨텐츠를 반복하여 수행
  • 컬렉션에는 Array, Collection, Map 또는 콤마로 분리된 문자열이 올 수 있다
  • var 속성에 반복에 대한 현재 항목을 담는 변수를 지정하고 items 속성은 반복할 항목들을 갖는 컬렉션을 지정
  • varStatus 속성에 지정한 변수를 통해 현재 반복의 상태를 알 수 있다
/// <c:forEach 액션의 다양한 활용>
<b>1) courses 리스트를 반복하면서 과정 출력하기</b><br/>
<c:forEach var="course" items="${courses}">
    ${course.name}<br/>
</c:forEach>

<b>2) courses 리스트를 반복하면서 순번과 과정 함께 출력하기</b><br/>
<c:forEach var="course" items="${courses}" varStatus="varStatus">
    ${varStatus.count}. ${course.name}<br/>
</c:forEach>

<b>3) 짝수번째 과정만 출력하기</b><br/>
<c:forEach var="course" items="${courses}" begin="0" end="5" step="2">
    ${course.name}<br/>
</c:forEach>

<b>4) 숫자 1부터 5까지 출력하기</b><br/>
<c:forEach var="value" begin="1" end="5" step="1">
    ${value}<br/>
</c:forEach>
profile
나는야 개발자

0개의 댓글