티스토리 뷰

Expression Language(표현 언어 또는 익스프레션 언어)

  • - 값을 표현하는데 사용되는 새로운 스크립트 언어로 JSP의 기본문법을 보완하는 역활을 한다.
  • - JSP 네 가지 기본 객체가 제공하는 영역의 속성 사용
  • - 집합 객체에 대한 접근 방법 제공
  • - 수치 연산, 관계 연산, 논리 연산자 제공
  • - 자바 클래스 메서드 호출 기능 제공
  • - 표현 언어만의 기본 객체 제공

EL 기본 문법

${식 }
  • - EL은 다음과 같이 $와 괄호('{' 와 }')' 그리고 표현식을 사용하여 값을 표현한다.
  • - 식 부분에는 표현 언어가 정의한 문법에 따라 값을 표현하는 식이 온다. (액션태그 또는 커스텀태그의 속성 값, 표현식)
  • - JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있다.
  • - EL은 JSP의 스크립트요소(스크립트 릿 ,표현식,선언부)를 제외한 나머지 부분에서 사용될 수 있다.

ex)

<b>${sessionScope.member.id}</b>님 환영합니다.

 

또한 곧바로 값을 계산할 수 있는데 아래 예를 살펴보자 !

<%
	Member m= new Member();
    m.setName("이름1");
    
%>

<c:set var="m" value="<%=m %>" />
<c:set var="name" value="${m.name}" />  <%-- 이 시점에 바로 값 계산 --%>
<% m.setName("이름2"); %>
${name} <%--name의 값은 "이름1" --%>

->한 마디로, <c:set>이라는 JSTL 태그는 EL변수를 생성해주는 기능을 제공한다.

 위 코드에서 EL변수 name의 값으로 ${m.name}을 지정했는데, m.name을 계산한 결과인 즉, m.getName()의 결과인 "이름1"을 name값으로 할당한다. 따라서 그 뒤에 m.setName()으로 값을 변경하더라도 name변수의 값은 변경되지 않는다.

 

반면 , value값에 "#{m.name}" 처럼 "#"을 넣을 경우에는 값을 계산하지 않고 name변수 값을 m.name으로 가져온다고 생각하자. 결과적으로, "#"을 사용하면 변경된 값을 출력하게된다. (단, #을 사용할 경우 일반 텍스트에서 사용하면 에러가 발생한다)

 

 

EL 기본 객체

- 표현 언어도 11개의 기본 객체를 제공한다.

- 값이 존재하지 않을 경우 null을 출력하지 않고 아무것도 출력하지 않는다.

 

 기본 객체

 설명

 pageContext

 JSP의 page 기본 객체와 동일하다. 

 pageScope 

 pageContext 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

 requestScope 

 request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

 sessionScope

 session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

 applicationScope 

 application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 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(이름)의 결과와 동일) 

ex)

${cookie.ID.value} //이름이 ID인 쿠키 값 출력
${param.code}    //이름이 code인 파라미터의 값 출력

 EL 객체 접근

- ${ <표현1>.<표현2> } 또는 ${ <표현1>[<표현2>] } 형식을 사용한다.

 

- <표현1>을 <값1>로 변환한다.

 

- <값1>이 null이면 null을 리턴한다.

 

- <값1>이 null이 아니면 <표현2>를 <값2>로 변환한다.

 

- <값2>가 null이면 null을 리턴한다.

 

- <값1>이 Map, List, 배열인 경우

    A.<값1>이 Map 이면

       i . <값1>.containsKey(<값2>)가 false이면 null을 리턴한다.

       ii. 그렇지 않으면 <값1>.get(<값2>)를 리턴한다.

    B.<값1>이 List나 배열이면

       i. <값2>가 정수값인지 검사한다.(정수값이 아닐 경우 에러 발생)

       ii. <값1>.get(<값2>) 또는 Array.get(<값1>, <값2>)를 리턴한다.

       iii. 위 코드가 익셉션을 발생하면 에러를 발생한다.

- <값1>이 다른 객체이면

    A.<값2>를 문자열로 변환한다.

    B.<값1>이 이름이 <값2>이고 읽기 가능한 프로퍼티를 포함하고 있다면 프로퍼티의 값을 리턴한다.

    C.그렇지 않을 경우 에러를 발생한다.

 

 EL 수치 연산자

- '+' : 덧셈

- '-' : 뺄셈

- '*' : 곱셈

- '/' 또는 div : 나눗셈

- '%' 또는 mod : 나머지

- 숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환한 후 연산자를 수행한다. (단, 숫자로 변환할 수 있는 객체)

- 객체가 null이면 0으로 처리된다.

- 나눗셈 연산자는 피연산자를 Double 타입으로 변환한 뒤 연산을 수행한다.

- += : 문자열 연결

ex)

${"10"+1} // +연산자는 수치 연산자이므로 "10"을 숫자로 먼저 변환하고 연산수행

오류)

${"일"+10} //오류 "일"을 숫자로 변환 X

EL 비교 연산자

- '==' 또는 eq : 같은가

- '!=' 또는 nu : 같지 않은가

- '<' 또는 lt : 작은가

- '>' 또는 gt : 큰가

- '<=' 또는 le : 작거나 같은가

- '>=' 또는 ge : 크거나 같은가

 

단, 문자열을 비교할 경우 String.compareTo()메서드를 사용한다. (객체 역시 비교 )

ex)

${someValue =='2004' }  //이 코드는 scomeValue.compareTo("2004")==0 과 같은 의미

EL 논리 연산자

- '&&' 또는 and : 그리고

- '||' 또는 or : 이거나

- '!' 또는 not : 부정

 

EL empty 연산자

- empty <값>

- 검사할 객체가 null 인지 검사하기 위해 사용한다.

- <값>이 null이면 true

- <값>이 빈 문자열("")이면 true

- <값>이 길이가 0인 배열이면 true

- <값>이 빈 Map이면 true

- <값>이 빈 Collection이면 true

- 이 외의 경우에는 false

 

EL 비교 선택 연산자

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

- <수식>의 결과값이 ture 이면 <값1>을 리턴하고, false이면 <값2>를 리턴한다.

 

EL 연산자 우선순위

- 우선순위가 높은순으로 먼저 실행되고, 같을 경우 왼쪽에서 오른쪽으로 진행된다.

-    []    .

-    ()

-    -(단일)    not    !    empty

-    *    /    div    %    mod

-    +    -

-    <    >    <=    >=    lt    gt    le    ge

-    ==    !=    eq    ne

-    &&    and

-    ||    or

-    ? :

 

EL 특수문자 처리

- \${식} 또는 \#{식}

- JSP 템플릿 텍스트에서 처리할때 앞에 역슬래시(\)를 위치시킨다.

 

EL 객체의 메서드 호출

- JSP 2.2 버전에 추가된 기능으로 객체의 메서드를 직접 호출할 수 있다.

- 자바빈스타일의 메서드, 리턴타입이 void이거나 파라미터 개수의 관계없이 호출 된다.

 

// ELMethod.java
 
package com.tistory.gangzzang;
 
import java.util.HashMap;
import java.util.Map;
 
public class ELMethod {
   
  private Map memberMap = new HashMap();
   
  public int sumNumber(int num1, int num2) {
    return num1 + num2;
  } // sumNumber : 두 정수를 더한다.
   
  public void setMember(String name, String tel) {
    memberMap.put(name, tel);
  } // setMember : memberMap에 회원 추가한다.
   
  public String getMember(String name) {
    return memberMap.get(name);
  } // getMember : memberMap에서 회원 이름의 연락처를 얻는다.
   
  public String getInfo() {
    return "EL 메서드 호출";
  } // getInfo : 정보 출력
   
} // ELMethod


출처: https://gangzzang.tistory.com/entry/JSP-표현-언어Expression-Language-또는-익스프레션-언어 [갱짱.study]
<!-- elMethod.jsp --> 
<%@page import="com.tistory.gangzzang.ELMethod"%> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% ELMethod elMethod = new ELMethod(); request.setAttribute("el", elMethod); %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL 메서드</title>
</head>
<body>
${ el.getInfo() } <br><br> 회원 추가 : ${ el.setMember('Gz', '01012345678') } <br><br>
회원 연락처 : ${ el.getMember('Gz') } <br><br>
두 정수의 합 : ${ el.sumNumber(5, 10) } 
</body>
</html> 
<!-- 실행결과 EL 메서드 호출 회원 추가 : 회원 연락처 : 01012345678 두 정수의 합 : 15 -->

EL 클래스 정적 메서드 호출

- EL 3.0버전부터는 쉽고 빠르게 정적 메서드 호출을 할 수 있다. (3.0이하는 따로 있으니 찾아보기)

- JSP 코드만 작성하면 된다. (TLD파일이나 web.xml파일 설정을 할 필요가 없다.)

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="util.FormatUtil"%>
<%
	request.setAttribute("price",12345L);
%>

<html>
<head>
<title> EL함수 호출 </title>
</head>
<body>

가격은<b>${FormatUtil.number(price,'#,##0') }</b>원 입니다.
</body>
</html>

//02행 정적 메서드를 포함한 클래스를 임포트한다.
//10행 EL에서 임포트한 클래스의 정적 메서드를 호출한다.