본문 바로가기
WEB/JSP Servlet

표현언어 : 기초, 연산자

by 노랑파랑 2016. 11. 2.
반응형




표현 언어

* Expression Language (EL)

* JSTL 2.0 버전부터 JSP에 포함되었다. 값을 표현하는 스크립트 언어로써, JSP의 스크립트 요소를 보완하는 역할을 한다.

* 다른 형태의 스크립트 언어로 표현식보다 간결하고 편리하기때문에 많이 사용한다.

* 액션 태그, JSTL 속성값으로 사용하능 하고, 비스크립트 요소 부분에서도 값을 출력하기 위해 사용 가능.

* 스크립트 요소 (스크립트릿, 표현식, 선언부)를 제외하고 사용할 수 있다.



표현언어 제공 기능

* JSP 기본 객체가 제공하는 영역의 속성 사용

* 수치, 관계, 논리 연산자 제공

* 자바 클래스 메소드 호출 기능

* JSP를 위한 표현 언어의 기본 객체 제공

* 람다식을 이용한 함수 정의와 실행

* 스트림 API를 통한 컬렉션 처리

* 정적 메소드 실행




1. EL의 구성

*  ' $ ' 과 ' { ' , ' } '을 사용해 값을 표현한다.

${ 값 표현식}

* JSP 2.1버전부터는 '$' 뿐만 아니라 '#' 구문도 사용 가능하다. 

* '#' 형식은 JSF(JavaServer Faces)에서 사용한 EL 구문으로 Deferred Expression이라 부른다.

* 위의 두 형식 ('$'과 '#') 차이점은 실제 EL 값을 생성하는 시점이다.

* '$' 형식은 해당 구문을 분석할 때 곧바로 값을 계산한다.

<%
People p = new People();
p.setName("이름1");
%>
<c:set var="p" value-"<%= p %>" />
<c:set var="name" value="${p.name}" />     // 곧바로 EL 계산
<% p.setName("이름2"); %>
${name} // name 출력

     * 해당 결과 값은 "이름1"이다. <c:set> 태그로 EL변수를 만들고 EL 변수 name의 값으로 ${p.name}을 지정했는데 

이 때 3번째 줄(p.setName())에서 지정한 "이름1"을 name의 값으로 할당한다. 

때문에 7번째줄에서 새로 p.setName()으로 값을 변경해도 출력되는 값은 "이름1"이다.

* '#' 형식은 해당 값이 실제로 사용될 때 값을 계산한다.

<%
People p = new People();
p.setName("이름1");
%>
<c:set var="p" value="<%= p %>" /> 
<c:set var="name" value="#{p.name}" />    // 값 생성하지 않음
<% p.setName("이름2"); %>
${name}    // 이 때 값 생성 = 이름2
<% p.setName("이름3"); %>
${name}    //이 때 값 생성 = 이름3

* '$' 형식과는 달리 p.name을 사용할 때 실제 값은 생성하지 않고 name 변수의 값을 p.name으로부터 가져온다라고만 설정했다. 

그 후 실제로 값을 사용할 때 값은 생성하여 p.setName()으로 값을 변경하면 값이 필요할 때 계산하기 때문에 변경된 값을 출력한다.

* 곧바로 값이 생성되는 것이 아니기 때문에 탬플릿 텍스트에서는 사용할 수 없다. 

 ${name}님 안녕하세요 // 사용 가능

 #{name}님 안녕하세요  // 사용 불가





2. EL 기초

* 자료 타입, 수치 연산자, 논리 연산자, 비교 연산자를 제공한다.


1) EL 데이터 타입 

* boolean : true 와 false 반환

* 정수 :  0 ~ 9로 이루어진 값을 정수로 사용한다. 음수의 경우 (-)가 붙는다. 정수 타입은 java.lang.Long 타입이다.

* 실수 :  0 ~ 9로 이루어진 값을 실수로 사용한다. 소수점(.)을 사용할 수 있고, 3.24e3과 같이 지수형으로 표현 가능. 실수 타입은 java.lang.Double

* 문자열 : 따옴표( " or ' )로 둘러싼 문자열. 만약 작은따옴표(')를 표현하고싶은 경우에는 값에 포함된 작은따옴표는 \'과 같이 \기호와 함께 가용해야 한다. \기호 자체는 \\로 표시한다. 

* 널 : Null



2) EL의 기본 객체

* JSP의 기본 객체를 EL이 사용할 수 있다.

* EL은 값이 존재하지 않으면 아무것도 출력하지 않는다.



3) 객체 접근

* 이름이 ID인 Cookie를 출력하고 싶다면 아래와같이 사용한다.

${cookie.ID.value}

* 이 때 EL의 cookie 객체는 <cookie 이름, Cookie 객체> Map이기 때문에 cookie.ID는 이름이 ID인 Cookie객체를 반환한다.

* 이는 매핑 정보를 담고있는 Map 객체인데 이를 처리하는 과정이 있다.

* EL언어는 객체에 저장된 값에 접근할 때 점(.)이나 대괄호( [ ] )를 사용한다. 따라서 cookie.name이나 cookie['name']은 같은 코드이다.

* 이 때 점(.)을 사용한 표현식은 변환 과정이 복잡하다.

<표현1>.<표현2>

1] <표현1>을 <값1>로 변환

1-1) <값1>이 null이면 null값을 반환한다.

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

2-1] <값2>도 마찬가지로 값이 null이면 null을 반환한다.

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

3-1] Map

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

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

3-2] List 또는 배열

- <값2>가 정수값인지 검사한 후, 정수값이 아닌경우 에러를 발생한다.

- 정수값인 경우 <값1>.get(<값2>) 또는 Array.get(<값1>,<값2>)를 리턴한다.

- 리턴 시 익셉션을 발생하면 에러를 발생시킨다.

4] <값1>이 다른 객체이면

4-1] <값2>를 문자열로 변환한다.

4-2] <값1>객체가 <값2>를 이름으로 갖는 읽기 가능한 프로퍼티를 포함하고 있다면, 프로ㅍ티의 값을 리턴한다.

4-3] 그렇지 않을 경우 에러를 발생한다.



4) 객체 탐색

* JSP의 네 가지 기본객체 PAGE, REQUEST, RESPONSE, APPLICATION 영역에 저장된 속성에 접근할 때는 

pageScope, requestScope, responseScope, applicationScope 기본 객체를 이용한다. 

* 영역을 나타내는 위 네가지 EL 객체를 사용하지 않고 이름만 지정한다면 EL은 네 개의 영역을 차례대로 탐색하고 검색해서 해당 속성이 존재하는지 확인한다.



5) 수치 연산자

1] 종류

▷ + 연산자 : 덧셈

▷ - 연산자 : 뺄셈

▷ / 또는 div : 나눗셈

▷ * 연산자 : 곱셈

▷ % 또는 mod : 나머지 

▷ - 단항 연산자 : 단항 뺄셈

* 각 연산자의 의미는 자바 연산자와 완전히 같으며, 나눗셈과 나머지를 구하는 연산자의 경우 div, mod가 추가되었다.

* 수치 연산자는 실수 타입에서만 사용 가능하며, 숫자 타입과 객체를 수치 연산자와 상ㅇ할 경우 해당 객체를 숫자로 변환한 후에 연산을 수행해야 한다.

* 예를 들어 ${"10" + 1} 이면 문자열인 10과 1의 연산으로 101이 된다고 보지만, EL에서 + 연산자는 수치 연산자로 10을 먼저 숫자로 변환 후 덧셈하기 때문에 결과는 숫자 11이다. ( JavaScript와 같음)



6) 비교 연산자

1] 종류

▷ == 또는 eq

▷ != 또는 ne

▷ < 또는 lt

▷ > 또는 gt

▷ <= 또는 le

▷ >= 또는 ge

* 문자열과 객체를 비교할 경우에는 String.compareTo() 메소드를 사용한다.



7) 논리 연산자

1] 종류

▷ && 또는 and

▷ || 또는 or

▷ ! 또는 not



8) empty 연산자

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

empty<값>

* 값에 따라 리턴 값이 결정된다.

▷ Null : True 리턴

▷ 빈 문자열( " " ) : True 리턴

▷ 길이가 0인 배열 : True 리턴

▷ 빈 Map : True 리턴

▷ 빈 Collection : True 리턴

* 이 외에는 모두 false 리턴



9) 비교 연산자

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

* 수식의 결과 값이 True이면 <값1> False이면 <값2>를 반환한다.



10) 문자열 연결

* Java에서 "문자" + "열" = (String) "문자열"

* EL에서 "문자" + "열" = Error

* 그 이유는 EL에서 (+) 수치 연산자는 "문자"와 "열"을 숫자로 변환하려 했으나 변환하지 못했기 대문이다.

* 그러므로 문자열을 연결하려면 += 연산자를 사용한다.

<% request.setAttribute("JSP", "EL"); %>

${"문자" += "열" }    //문자열

${"언어 : " += JSP }     // 언어 : EL



11) 컬렉션

* EL에서 Collection을 위한 표현식을 지원하지 않기 때문에 사용하려면 스크립트릿을 이용해 List객체를 생성해야 한다.

<%

List<Long> value = Arrays.asList(1L, 2L, 3L, 4L);

request.setAttribute("vals", value);

%>


${myfunc : sum(vals)}

* EL 3.0 버전부터는 EL 식에서 직접 List, Map, Set 타입의 객체를 생성할 수 있게 되었다.

// 위 코드와 동일하다

<c:set var="vals" values="${ [1, 2, 3, 4] }" />

${myfunc : sum(vals)}


// 변수가 필요 없다면

${myfunc : sum{ [1, 2, 3, 4,] }


// EL에서 List 타입 생성

[원소1, 원소2, 원소3]

// 각 항목에 접근 (변수 이용)

<c:set var="vals" values=" ${ [1, 2, 3, 4] }" />

${vals[2]}    // 2


// Map 타입의 컬렉션 객체 생성

['name' : 홍길동, 'age' = 20 ]

// Map 객체 사용

<c:set var="man" value="${ [ 'name' : 홍길동, 'age'=20 ] }" />

${man.name}, ${man.age}


// Set 타입의 EL객체 생성

<c:set var="exam" value="${ [ '가', '나', '다' ] }" />

${exam}




12) 세미콜론 연산자

* 두 개의 식을 연결한다.

${ 1 + 1 ; 10 + 10}

* 결과는 20으로 ${ A ; B }를 사용하면 A는 출력되지 않고 B만 출력된다. 



13) 할당 연산자

* EL 변수를 생성할 수 있다.

* 할당 연산자 자체도 출력 결과를 생성한다.

* 할당 연산자의 결과를 응답 결과에 포함시킬 이유가 별로 없기 때문에 이 때 세미콜론 연산자를 사용하면 할당 연산자의 결과 대신 빈 문자열을 출력할 수 있다.



14) 연산자 우선순위

▷ [ ] .

▷ ( )

▷ -(단항) not ! empty

▷ * / div % mod

▷ + -

▷+=

▷ < > <= >= lt gt le ge

▷ == != eq ne

▷ && and

▷ || or

▷ ? :

▷ ->

▷ =

▷ ;



15) 특수문자 처리

* EL에서 따옴표(" or ')나 표현 기호($, #)를 출력하고 싶으면 \(역슬래시) 뒤에 해당 문자를 위치시킨다.

반응형

'WEB > JSP Servlet' 카테고리의 다른 글

표현언어(EL) 비활성화 방법  (0) 2016.11.05
표현언어 : 람다식, 스트림 API  (0) 2016.11.04
JSTL : 함수  (0) 2016.10.30
JSTL : 국제화 태그  (0) 2016.10.30
JSTL : 코어 태그  (0) 2016.10.28