2024-10-04 05:00:36

표현 언어(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>

include혹은 forward로 받은 param이 없기 때문에 code의 파라미터는 공백

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