본문 바로가기

프로그래밍/JSP

[JSP 요약 정리] 12. 표현 언어(Expression Language)

12. 표현 언어(Expression Language)

1) 표현 언어

- 값을 표현하는데 사용하는 스크립트 언어, EL이라 칭함

- 목적: JSP 표현식에 비해 간결한 코드를 사용해서 값 출력 가능

- 사용 형태

${ } : 구문 분석시 곧바로 값을 계산

#{ } : 실제 사용될 때 값을 계산

- 기능

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

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

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

쿠키, 기본 객체의 속성 등 JSP를 위한 표현 언어의 기본 객체 제공

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



2) EL의 기본 객체

pageContext : JSP의 pageContext 기본 객체와 동일

pageScope : pageContext 객체의 속성을 매핑한 Map 객체

requestScope : request 객체의 속성을 매핑한 Map 객체

sessionScope : session 객체의 속성을 매핑한 Map 객체

applicationScope : application 객체의 속성을 매핑한 Map 객체

param : 파라미터의 이름과 값을 매핑한 Map 객체 // getParameter 와 동일

paramValues : 파라미터의 이름과 값배열을 매핑한 Map 객체 // getParameterValues

header : 헤더의 이름과 값을 매핑한 Map 객체 // getHeader

headerValues : 헤더의 이름과 값 배열을 매핑한 Map 객체 // getHeaders

cookie : 쿠키의 이름과 값을 매핑한 Map 객체

initParam : 초기화 파라미터의 이름과 값 매핑을 저장한 Map 객체


3) EL의 특징

- EL은 값이 존재하지 않는 경우 아무것도 출력하지 않는다.

- ${name} 의 형태로 객체를 지정하지 않고 탐색시 page, request, session, application 영역을 차례로 탐색해서 일치하는 속성 값 반환

- EL에서 +는 수치 연산자이므로 문자열+수로 연산시 문자열을 수로 형변환 후 연산

ex. "10" + 1 = 11 // 자바에서는 101

- 수치 연산시 값이 null이면 정수 타입 0을 값으로 사용

- 정수 타입보다 실수 타입을 우선시

- 문자열 비교시 String.compareTo() 메소드를 사용

- '문자'+"열" -> 에러 발생 // += 연산자를 사용해야 함

- 특수문자 형식의 문자열을 출력할 때 역슬래시(\)를 사용

ex. \${expr} 출력시 "${expr} 이 출력됨

- 반환 타입이 void거나 한 개 이상의 파라미터를 가진 static 메소드 사용 가능


4) Empty 연산자

- 객체가 비어있는지 확인

- 형식: empty 값

- 반환값이 true인 경우의 값:  null, "", 빈 Map, 빈 Collection, 길이가 0인 배열


5) 세미콜론 연산자

- 세미콜론 연산자를 사용하면 두개의 식을 붙여서 사용할 수 있다.

- 형식: ${ 식1 ; 식2 } // 식2의 값만 출력됨


6) 할당 연산자

- EL 변수를 생성하기 위해 사용

- 형식: ${ 변수 = 값 }

- 세미콜론 연산자와 함께 사용해서 변수를 생성하고 빈 문자열을 결과로 출력 가능

ex. ${ var1= 10 ; '' }


7) EL 함수

- EL은 자바 코드를 직접 사용할 수 없음 -> 한계를 해결하기 위해 EL 함수를 지정해서 사용

- 사용 방법: 클래스 파일 작성(static  메소드 작성)

-> TLD(Tag Library Descriptor 파일 작성

-> web.xml 파일에 TLD 파일 설정 추가

-> taglib 디렉티브로 명시 후 사용


- taglib 디렉티브 사용 방법

<%@ taglib prefix="pre" uri="uri" %>


8) 간편하게 정적 메소드 호출

- EL함수의 불편함을 해소하기 위해 EL 3.0에서 기능 추가

- page 디렉티브를 통해 선언 후 자유롭게 사용 가능

- 선언 예시

<%@ page import="util.FormatUtil" %> // 선언

${FormatUtil.number(10, 1)} // 클래스내 정적메소드 호출 가능


9) 람다식

- 함수처럼 파라미터를 가진 코드 블록

- 형식: (파라미터1, 파라미터2) -> EL식

- 삼항 연산자 활용 예시

${ greaterThan = (a,b) -> a > b ? true : false; '' } // 람다식으로 함수 선언

${ greaterThan(1,3)} // 호출


${ ((a,b)-> a > b ? true : false)(1,3) } // 생성과 동시에 호출

*파라미터가 1개일 시 괄호 생략 가능

ex. ${ factorial = n -> n== 1 ? 1 : n * factorial(n-1) ; '' }


10) Stream API

- 자바의 스트림 API를 사용 가능(EL 3.0) // 실제로는 EL에서 제공하는 스트림 API를 사용

- 기본 형태

collection.stream() // 스트림 생성

.map // 중간 연산(스트림 변환)

.toList() // 최종 연산(결과 생성)

- 예시

${lst.stream() // 스트림 생성

.filter(x -> x % 2 == 0) // 짝수인 원소만

.map(x -> x * x) // 제곱

.toList() } // 결과 생성

-메소드

filter() : 값을 걸러낼 때 사용 // 매개변수: 람다식(true or false)

map() : 원소를 변환한 값으로 새로운 스트림 생성 // 매개변수: 람다식(연산)

sorted() : 스트림 정렬 // comparable 인터페이스 구현 클래스외엔 람다식으로 비교식 지정

limit() : 지정한 크기의 스트림 생성

toList() : 자바 리스트 객체 생성

toArray() : 자바 배열 객체 생성

count() : 스트림의 원소 수 반환

sum() : 값의 합 반환

average() : 평균 값 반환

min() : 최소값 반환

max() : 최대값 반환


- 조건 충족 요소 확인 메소드

anyMatch() : 조건을 충족하는 값이 있을 경우 true값의 Optional 객체 반환

allMatch() : 모든 원소가 조건을 충족할 때 true값의 Optional 객체 반환

noneMatch() : 조건을 충족하는 원소가 하나도 없을 때 true값의 Optional 객체 반환


- Optional 타입: 결과값이 존재하지 않을 수도 있을 때 사용

get() : 값이 존재할 경우 값을 반환(값이 존재하지 않을 경우 ELException 발생)

orElse(other) : 값이 존재하지 않으면 other 반환

orLeseGet( (()->T) other ) : 값이 존재하지 않으면 람다식 other 실행 결과 반환

ifPresent( ((x) -> void) consumer ) : 값이 존재하면 람다식  consumer를 실행 후 전달


11) 표현 언어 비활성화 방법

- JSP 규약은 EL을 비활성화 시키는 세가지 방법 제공

- web.xml 파일에 EL 비활성화 옵션 추가

<jsp-property-group>

<url-pattern>범위</url-pattern> // EL을 비활성화시킬 페이지 범위 지정

<el-ignored>true</el-ignored> // EL 비활성화 처리

</jsp-property-group>


- JSP 페이지에서 EL 비활성화(page 디렉티브)

<%@ page isELIgnored="true" %> // EL 비활성화

<%@ page deferredSyntaxAllowedAsLiteral="true" %> // #{expr} 형식 EL 비활성화



- web.xml 파일의 버전에 따른 EL처리

web.xml 파일이 사용하는 서블릿 버전에 따라 EL 지원여부 결정

2.3 버전 : EL 미지원

2.4 버전 : #{expr} 미지원

2.5부터 : ${expr}, #{expr} 지원