표현 언어(EL)란
- 다른 형태의 스크립트 언어로서 스크립트 요소 중 하나이다.
- 표현식보다 간결하고 편리하다
- 기능
- JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용
- 수치 연산, 관계 연한, 논리 연산자 제공
- 자바 클래스 메소드 호출 기능 제공
- 쿠키, 기본 객체의 속성 등 JSP 를 위한 표현 언어늬 기본 객체 제공
- 람다식을 이용한 함수 정의와 실행
- 스트림 API를 통한 컬렉션 처리
- 정적 메소드 실행
- 구성
- ${ expression }
- EL 에서 사용할 수 있는 기본 객체
기본 객체 | 설 명 |
pageContext | JSP의 pageContext 기본 객체와 동일하다 |
pageScope | pageContext 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
requestScope | request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
sessionScope | session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
applicationScope | application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
param | 요청 파라미터의 <파라미터 이름, 값> 매핑을 저장한 Map 객체 |
paramValues | 요청 파라미터의 <파라미터 이름, 값 배열> 매핑을 저장한 Map객체 |
header | 요청 정보의 <헤더 이름, 값> 매핑을 저장한 Map 객체 |
headerValues | 요청 정보의 <헤더 이름, 값 배열> 매핑을 저장한 Map 객체 |
cookie | <쿠키 이름, Cookie> 매핑을 저장한 Map 객체 |
initParam | 초기화 파라미터의 <이름, 값> 매핑을 저장한 Map 객체 |
예제
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("name", "홍길동");
session.setAttribute("ID", "admin");
application.setAttribute("appValue", "EL Object");
%>
<h3>
요청 URI : ${pageContext.request.requestURI}<br>
code의 파라미터 : ${param.code }<br>
쿠키의 JSESSIONID 값 : ${cookie.JSESSIONID.value}<br>
request의 name 속성: ${requestScope.name }<br>
session의 ID 속성: ${sessionScope.ID }<br>
application의 appValue 속성: ${applicationScope.appValue}<br>
request의 name 속성 : ${name }<br>
session의 ID 속성 : ${ID }<br>
</h3>
</body>
</html>
EL의 기본 연산자
- 수치 연산자 : +, -, *, / (또는 div), % (또는 mod), 단항연산자(-)
- 자바 연산자와 동일
- 수치 연산자는 정수 타입과 실수 타입에만 적용
- 숫자 타입과 객체를 수치 연산자와 함께 사용하는 경우
- 해당 객체를 숫자로 변환 후 연산 수행
- $ {"10" + 1} => 11
- 비교 연산자 : ==, !=, <, >, <=, >=
- 자바 연산자와 동일
- 문자열을 비교할 경우 String.compateTo() 메소드 사용
- ${ value == "홍길동" } 으로 사용 가능
- 논리 연산자 : && (and), || (or), ! (not)
- empty 연산자 : 검사할 객체가 텅 빈 객체인지 검사
- empty<값>
- <값> 이 null 이면 true
- <값> 이 빈 문자열 ("") 이면 true
- <값> 이 길이가 0인 배열이면 true
- <값> 이 빈 Collection이면 true
- 이 외의 경우에는 false
- 비교 선택 연산자 : <수식> ? <값> : <값2>
- 문자열 연결
- + 연산자를 이용한 문자열 연결은 불가능
- += 연산자를 통해 문자열 연결
- 세미콜론 연산자
- 세미콜론 연산자를 이용하면 두 개의 식을 붙일 수 있다.
- ex) ${ 1 + 1; 10 + 10 } => 출력 결과는 20
- 할당 연산자
- 할당 연산자를 이용하면 코드를 사용하여 EL 변수를 생성할 수 있다.
- ex) ${ var = 10 }
- 주의점 : 할당 연산자도 출력 결과를 생성하므로, 할당만 원할 경우 세미콜론(;) 후에 빈 문자열 ('')로 출력을 안보이게 해야함
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<jsp:useBean id="calc" class="Week6.calc"/>
<jsp:setProperty name="calc" property="*"/>
<body>
<h3>EL 연산자 결과</h3>
<br>
x = ${calc.num1 }, y = ${param.num2 }<br>
x + y = ${requestScope.num1 + calc.num2 }<br>
x - y = ${pageScope.num1 + param.num2 }<br>
x * y = ${paramValues.num1[0] * calc.num2 }<br>
x / y = ${calc.num1 / calc.num2 }<br>
x % y = ${calc.num1 % calc.num2 }
<hr>
x와 y가 모두 양수입니까? ${calc.num1 > 0 && calc.num2 > 0 }<br>
x와 y가 같습니까? ${calc.num1 == calc.num2 }
<hr>
${id ="admin"}<br>
${strArr = ['가', '나', '다']; '' }<br>
strArr의 값은 ${strArr }입니다.
<hr>
${var == "admin" }<br>
${strArr[0] += strArr[1] += strArr[2] }<br>
</body>
</html>
람다식
람다식 호출 방법
- 람다식은 함수의 일종
- 람다식을 할당한 greaterThan을 함수처럼 호출
- ${ greaterThan = (a, b) -> a > b ? true : false; '' }
- ${ greaterThan(1, 3) }
- 람다식을 특정 변수에 할당하지 않고 바로 호출 가능
- ${ ((a,b) -> a > b ? true : false)(1, 3) }
- 재귀 호출도 가능
- ${ factorial = (n) -> n == 1 ? 1 : n * factorial(n - 1); '' }
- $ {factorial(5) }
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>람다식 예제</h3>
1. 두 개의 숫자 중 큰 수 찾기<br>
${max = (a, b) -> a > b ? a : b;'' }
(3, 5) 중 큰 수 = ${max(3, 5) }<br><br>
2. 두 문자열이 같은지 체크하기<br>
${strEQ = (str1, str2) -> str1 == str2; '' }
("admin", "홍길동") 두 문자열은 같은가? ${strEQ("admin", "홍길동") }<br><br>
3. 피타고라스의 정리<br>
${Func = (a, b) -> Math.sqrt(a*a + b*b); '' }
두 변의 길이가 3, 4인 직각 삼각형의 빗변의 길이는 ${Func(3, 4) }이다<br>
</body>
</html>
스트림 API
- EL문은 for문이나 while 문과 같은 반복문을 제공하지 않는다.
- EL 3.0 버전부터는 컬렉션 객체를 위한 스트림 API가 추가되었다.
- 세미콜론 연산자와 할당 연산자를 사용하면 EL 만으로 표현 가능
- ${ lst = [1, 2, 3, 4, 5]; sum = lst.stream().sum();'' }
- 스트림(stream)은 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복문
- 기본 형식
- stream()을 이용한 스트림 생성
- List를 포함한 java.util.Collection 타입의 객체에 대해 stream() 메소드를 실행하면 EL 스트림 객체를 생성한다
- 일단 스트림을 생성하면 스트림 객체를 이용해서 중간 변환과 최종 연산을 통해 새로운 결과를 생성할 수 있다.
사용 가능한 메소드
- distinct() 중복 제거
- filter() 원하는 조건에 맞는 데이터 추출
- map() 데이터 변환
- sorted() 데이터 정렬
- 내림차순으로 정렬하고 싶은 경우에는 sorted() 메소드에 값을 비교할 때 사용할 람다식을 전달한다
- (x1, x2) -> x1 < x2 ? 1 : -1
- 두 값을 비교해서 순서를 바꿔야 한다면 1, 그렇지 않다면 -1
- limit() 데이터 개수 제한
- toList(), toSet(), toMap() : 자료 구조로 리턴
- sum() : 합계
- count() : 계수
- average() : 평균
- min(), max() : 최소값, 최대값
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${varList = [2, 11, 7, 4, 8, 5, 8]; '' }
${varList.stream().distinct().toList() }<br>
${varList.stream().filter(x -> x % 2 == 0).toList() }<br>
${varList.stream().sorted((x1, x2) -> x1 < x2 ? 1 : -1).toList() }<br>
${varList.stream().sorted().toList() }<br>
${varList.stream().sum() }<br>
${varList.stream().count() }<br>
${varList.stream().average().get() }<br>
${varList.stream().min().get() }<br>
${varList.stream().max().get() }<br>
${varList.stream().map(x -> x * x).toList() }<br>
</body>
</html>
'JSP공부' 카테고리의 다른 글
표준 태그 라이브러리 JSTL (0) | 2024.10.17 |
---|---|
JavaBeans 자바빈 (0) | 2024.10.04 |
JSP 액션 태그 (1) | 2024.10.03 |
JSP (1) | 2024.10.03 |
Servlet (0) | 2024.10.03 |