EL (Expression Language)

ybong·2022년 2월 26일
0

EL(Expression Language)

  • 표현언어, EL은 값을 표현하는 데 사용되는 스크립트언어로서, JSP의 기본 문법을 보완하는 역할을 한다.

EL이 제공하는 기능

  • JSP의 scope에 맞는 속성 사용
  • 집합 객체에 대한 접근 방법 제공
  • 수치 연산, 관계연산, 논리연산자 제공
  • 자바 클래스 메소드 호출 기능 제공
  • EL만의 기본 객체 제공

표현언어의 표현방법

문법

${expr}

expr: 표현언어가 정의한 문법에 따라 값을 표현하는 식

예제

<jsp:include page="/module/${skin.id}/header.jsp" flush="true" />
<b>${sessionScope.member.id}</b>님 환영합니다.
  • EL은 JSP의 스크립트 요소 (스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있으며, 표현식을 통해서 표현식보다 편리하게 값을 출력할 수 있다.

EL의 기본 객체

EL 기본객체 사용 예시

  • pageContext와 request가 갖고있는 메서드를 EL로 쓰고 있다.
  • EL에 익숙해지면, java 코드 사용하는 것보다 더 깔끔하게 jsp를 작성할 수 있다.

EL의 데이터 타입

  • 불리언 타입 - true와 false
  • 정수타입 - 0~9로 이루어진 정수 값 음수의 경우 '-'가 붙음
  • 실수타입 - 0~9로 이루어져 있으며, 소수점('.')을 사용할 수 있고, 3.24e3과 같이 지수형으로 표현 가능하다.
  • 문자열 타입 - 따옴표( ' 또는" )로 둘러싼 문자열. 만약 작은 따옴표(')를 사용해서 표현할 경우 값에 포함된 작은 따옴표는 \' 와 같이 \ 기호와 함께 사용해야 한다.
  • \ 기호 자체는 \ 로 표시한다.
  • 널 타입 - null

객체 접근 규칙

${<표현1>.<표현2>}
  • 표현 1이나 표현 2가 null이면 null을 반환한다.
  • 표현1이 Map일 경우 표현2를 key로한 값을 반환한다.
  • 표현1이 List나 배열이면 표현2가 정수일 경우 해당 정수 번째 index에 해당하는 값을 반환한다.
    • 만약 정수가 아닐 경우에는 오류가 발생한다.
  • 표현1이 객체일 경우는 표현2에 해당하는 getter메소드에 해당하는 메소드를 호출한 결과를 반환한다.
    • student.name → student.getname()

EL의 수치 연산자

    • : 덧셈
  • -: 뺄셈
  • *: 곱셈
  • / 또는 div : 나눗셈
  • % 또는 mod : 나머지
  • 숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환 후 연산자를 수행 : ${"10"+1} → ${10+1}
  • 숫자로 변환할 수 없는 객체와 수치 연산자를 함께 사용하면 에러를 발생 : ${"열"+1} → 에러
  • 수치 연산자에서 사용되는 객체가 null이면 0으로 처리 : ${null + 1} → ${0+1}

비교연산자

  • == 또는 eq
  • != 또는 ne
  • < 또는 lt
  • 또는 gt

  • <= 또는 le
  • = 또는 ge

  • 문자열 비교: ${str == '값'} str.compareTo("값") == 0 과 동일

논리연산자

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

empty 연산자, 비교선택 연산자

연산자 우선순위

  1. [] .
  2. ()
  3. (단일) not ! empty
  4. / div % mod
  5. < > <= >= lt gt le ge
  6. == != eq ne
  7. && and
  8. || or
  9. ? :

EL 비활성화: JSP에 명시하기

  • 페이지 지시자에 명시
    <%@ page isELignored = "true"%>
    (디폴트 값이 false로 EL 인식상태)

실습

EL scope 객체 사용

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
  pageContext.setAttribute("p1", "page scope value");
  request.setAttribute("r1", "request scope value");
  session.setAttribute("s1", "session scope value");
  application.setAttribute("a1", "application scope value");
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!--JSP로 출력하는 경우-->
pageContext.getAttribute("p1") : <%=pageContext.getAttribute("p1")%> <br>
<!--EL로 출력하는 경우-->
pageContext.getAttribute("p1") : ${pageScope.p1} <br>
request.getAttribute("r1") : ${requestScope.r1} <br>
session.getAttribute("s1") : ${sessionScope.s1} <br>
application.getAttribute("a1") : ${applicationScope.a1} <br>

pageContextt.getAttribute("p1") : ${p1} <br> <!--key가 겹치지 않는다면 이렇게도 가능, 근데 명시적이지 않음..-->

</body>
</html>
pageContext.getAttribute("p1") : page scope value
pageContext.getAttribute("p1") : page scope value
request.getAttribute("r1") : request scope value
session.getAttribute("s1") : session scope value
application.getAttribute("a1") : application scope value
pageContextt.getAttribute("p1") : page scope value

연산 사용

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% request.setAttribute("k", 10); %>
<% request.setAttribute("m", true); %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>EL연산</h3>
k: ${k} <br>
k + 5 : ${k + 5} <br>
k * 5 : ${k * 5} <br>
k / 5 : ${k / 5} <br>
<h3>EL비교논리연산</h3>
k : ${k} <br>
k > 5 : ${k>5} <br>
k < 5 : ${k<5} <br>
m : ${m} <br>
!m : ${!m} <br>
</body>
</html>
EL연산
k: 10
k + 5 : 15
k * 5 : 50
k / 5 : 2.0
EL비교논리연산
k : 10
k > 5 : true
k < 5 : false
m : true
!m : false

isELIgnored

<%@ page isELIgnored="true" %>
EL연산
k: ${k}
k + 5 : ${k + 5}
k * 5 : ${k * 5}
k / 5 : ${k / 5}
EL비교논리연산
k : ${k}
k > 5 : ${k>5}
k < 5 : ${k<5}
m : ${m}
!m : ${!m}

EL이 해석되지 않고 그대로 문자로 나온다.

profile
study blog

0개의 댓글