Expression Language(EL, 표현언어)

hyekyeong Song·2020년 8월 8일
1

JSP

목록 보기
3/3

1. 표현언어

: 표현언어는 JSP 2.0 버전부터 JSP에 포함되었다. 정리한 이 내용은 JSP2.3과 쌍을 이루는 표현언어 버전 3.0이다.
표현언어는 값을 표현할 때 사용하는 스크립트 언어로, JSP의 스크립트 요소를 보완하는 역할을 한다.

1) 기능

1) JSP의 네 가지 기본 객체가 제공하는 영역의 속성을 사용
2) 수치 연산, 관계 연산, 논리 연산자 제공
3) 자바 클래스 메서드 호출 기능 제공
4) 쿠키, 기본 객체의 속성 등 JSP를 위한 표현언어의 기본 객체 제공
5) 람다식을 이용한 함수 정의와 실행 (EL 3.0)
6) 스트림 API를 통한 컬렉션 처리 (EL 3.0)
7) 정적 메서드 실행 (EL 3.0)

실제 프로젝트에서는 표현식보다 표현 언어를 사용하는 것이 더 간결하고 이해가 쉽기때문에 표현언어를 주로 사용한다.

2) 구성

값 표현 방법

${표현식}

3) 사용할 수 있는 범위, 값 생성 시점

: EL은 액션태그나 JSTL의 속성값으로 사용할 수 있다. 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있으며, EL을 통해 표현식보다 편리하게 값을 출력할 수 있다.

${expr}은 구문을 분석할 때 곧바로 값을 계산한다.

<%
  Person p = new Person();
  p.setName("이름1");
%>
<c:set var="p" value="<%= p %>" />
<c:set var="name" value="${p.name}"/>
<% p.setName("이름2"); %>

${name}

위의 코드를 실행하면 <c:set var="name" value="${p.name}"/> 시점에 바로 값을 계산해 저장하므로 ${name}의 값은 "이름1"이 된다.

2. EL 기초

: EL은 일종의 스크립트 언어로 자료타입, 수치 연산자, 논리 연산자, 비교 연산자 등을 제공한다.

1) EL의 데이터 타입과 리터럴

  • Boolean : ture, false
  • 정수 타입
  • 실수 타입
  • 문자열 타입
  • 널 타입 : null

2) 기본 객체

: JSP는 EL에서 사용할 수 있는 기본 객체를 제공한다. 이 객체를 이용해 요청 파라미터나 세션 속성값 등을 표현언어에서 사용할 수 있다.

기본객체설명
pageContextJSP의 page 기본객체와 동일
pageScopepageContext 기본객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map객체
requestScoperequest 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map객체
sessionScopesession 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map객체
applicationScopeapplication 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map객체
param요청 파라미터의 <파라미터 이름, 값> 매핑을 저장한 Map객체. 파라미터 값 타임은 String이고, request.getParameter(이름) 결과와 동일.
paramValues요청 파라미터의 <파라미터이름, 값 배열> 매핑을 저장한 Map객체. 값 타입은 String[]으로 request.getParameterValues(이름)의 결과와 동일.
header요청 정보의 <헤더이름, 값 배열> 매핑을 저장한 Map객체. request.getHeader(이름)결과와 동일
headerValues요청 정보의 <헤더이름, 값 배열> 매핑을 저장한 Map객체. request.getHeaders(이름) 결과와 동일
cookie<쿠키이름, Cookie> 매핑을 저장한 Map객체. request.getCookies()로 구한 Cookie 배열로부터 매핑을 생성
initParam초기화 파라미터의 <이름, 값> 매핑을 저장한 Map객체. application.getInitParameter(이름) 결과와 동일

3) 객체 접근

(1) 객체에 저장된 값에 접근하는 방법

: EL언어는 객체에 저장된 값에 접근할 때 점(.)이나 대괄호([])를 사용한다.

<표현1>.<표현2>
<표현1>[<표현2>]

예시

${cookie.ID.value}

(2) <표현1>.<표현2> 표현식의 값 변환 과정

  1. <표현1>을 <값1>로 변환
  2. <값1>이 null이면 null 리턴.
  3. <값1>이 null이 아닐 경우 <표현2>를 <값2>로 변환
    1) <값2>가 null일 경우 null 리턴
  4. <값1>이 Map, List, 배열일 경우
    1) Map일 경우
    -(1) <값1>.containsKey(값2)가 false이면 null리턴
    -(2) flase가 아니면 <값1>.get(값2)리턴
    2) List, 배열일 경우
    -(1) <값2>가 정수값이 아니면 에러
    -(2) 정수값일 경우 <값1>.get(<값2>) 또는 Array.get(<값1>, <값2>)리턴.
    -(3) 위의 코드가 익셉션을 발생하면 에러 발생
  5. <값1>이 다른 객체이면
    1) <값2>를 문자열로 변환
    2) <값1> 객체가 <값2>를 이름으로 갖는 읽기 가능한 프로퍼티를 포함하고 있다면 프로퍼티 값을 리턴.
    3) 그렇지 않을 경우 에러 발생

4) 수치 연산자

  • + 연산자
  • - 연산자
  • * 연산자
  • / 또는 div
  • % 또는 mod
  • - 단항 연산자

수치 연산자는 정수 타입과 실수 타입에 대해서만 동작한다. 숫자 타입과 객체를 수치 연산자와 함께 사용할 경우 해당 객체를 숫자로 변환한 후에 연산을 수행한다.

5) 비교 연산자

  • == 또는 eq (문자열 비교시 String.compareTo() 메서드 사용)
  • != 또는 ne
  • < 또는 lt
  • > 또는 gt
  • <= 또는 le
  • >= 또는 ge

6) 논리 연산자

  • && 또는 and
  • || 또는 or
  • ! 또는 not

7) empty 연산자

: empty 연산자는 검사할 객체가 빈 객체인지 검사할 때사용한다.

empty <>
  • <값>이 null이면 true
  • <값> 빈 문자열("")이면 true
  • <값>의 길이가 0인 배열이면 true
  • <값>이 빈 Map이면 true
  • <값>이 빈 Collection이면 true
  • 이 외의 경우 false

8) 비교 선택 연산자

<수식> ? <값1> : <값2>

<수식> 결과값이 true이면 <값1>리턴, false이면 <값2> 리턴

9) EL 3.0부터 지원하는 연산자

(1) 문자열 연결

+= 연산자로 문자열을 연결할 수 있다.

사용예시

<% request.setAttribute("title", "JSP 프로그래밍"); %>
${"문자" += "열" += "연결"} -> "문자열연결"
${"제목 : " += title } -> "제목 : JSP 프로그래밍"

(2) 컬렉션

: 이전버전까지는 스크립트릿을 이용해 List 객체를 생성해야했다.
EL3.0 부터는 EL식에서 직접 List, Map, Set타입의 객체를 생성할 수 있게 되었다.

  • List 타입 객체 생성
[원소1, 원소2, 원소3]

<c:set var="vals" values="${[1, 2, 3]}" />
  • List 각 항목에 접근
변수명[인덱스]

${vals[2]} -> 3
  • Map 타입 컬렉션 객체 생성
{'name':'홍길동, 'age':20}
  • Map 타입 객체 사용
<c:set var="mem" value="${ {'name':'홍길동, 'age':20} }" />
${mem.name}
  • Set타입 객체 생성, 사용
{원소1, 원소2}

<c:set var="hangul" value="${ {'가', '나'} }" />
${hangul}

(3) 세미콜론 연산자

: 세미콜론 연산자를 사용해 두 개의 식을 붙일 수 있다.
${A ; B} 는 A값을 출력하지 않고 B 값만 출력한다.

(4) 할당 연산자

: 이전까지 EL변수를 생성할 경우 둘 중 하나를 사용한다

<% request.setAttribute("val1", 10L); %>

<c:set var="val1" value="${10}" />

이를 EL3.0 버전은 다음과 같이 할당할 수 있다.

${val1 = 10}

하지만 할당 연산자는 출력 결과를 생성하기 때문에 결과를 응답 결과에 포함시키지 않고 싶을 경우 세미콜론 연산자를 사용해 빈 문자열을 결과로 출력할 수 있다.

${val1 = 10;''}
profile
안녕하세요😀😀

0개의 댓글