JSP

[JSP_12 중요!] EL 표기법 (간결하게 jsp 표현 가능)

korany 2023. 3. 20. 17:04

EL표기법 : jsp에서 사용되는 표현식을 더 간결하게 사용할 수있도록 해 주는 표현형태
EL(Expression Language) - EL로 값을 표현하려면 jsp의 관리하에 있는 4개의 영역에서만 사용을 할 수있다


4개의 영역이란?

1) pageScope: 단 하나의 페이지(현재페이지)에서만 값을 저장하고 공유할 수 있다
일종의 private영역 
2) *requestScope (가장많이쓰임!) : 지역개념으로 페이지가 닫히면 영역도 종료가 된다.
최대 두개의 페이지에서 값을 저장하거나 공유할 수 있다.
3) sessionScope : 전역 개념으로 브라우저가 완전히 종료되기 전까지는 영역이 살아있다.
같은 웹 브라우저 내에서 요청되는 페이지들에게 값을 공유 
일종의 public같은 느낌
4) applicationScope : 한 프로젝트에서 요청되는 페이지들 간 값을 공유

 

 

 


0. Scope에 저장하고 EL로 출력한다

- EL표현식을 사용하기 위해선 4가지 영역 중 한 영역에 변수가 저장 되어있어야 한다.

Scope영역 저장 형식 : request.setAttribute("key값", "value값");

EL의 표현 형식 : ${   영역 . 변수   } 

여기서 1번 처럼 영역을 생략할 수 있다

1. (중요) 생략된 EL 표현식 :  ${ hi }

<% 
	//requestScope에 값을 저장 
 	request.setAttribute("hi", "안녕안녕!");
%>
<body>
	EL 표현식 (생략방식) : ${ hi }
</body>

(그동안 일반 jsp의 표현식에선 아래처럼 스크립트릿을 사용해왔었음)

<% String msg = "안녕"; %>

<body>
일반 jsp 표현식
<%= msg %>
</body>

2. 오리지널 EL표현식 : ${ requestScope.hi }

- EL표현식을 사용할땐 생략된 표현식을 주로 사용하지만 

 다른영역이지만 이름이 같은 데이터를 가져오고 싶을때 영역의 이름까지 지정해준다.

<%
 	//requestScope에 값을 저장
    request.setAttribute("msg", "request 영역입니다");
    
    //sessionScope에 값을 저장
    session.setAttribute("msg", "session 영역입니다");
%>
<body>
	EL 표현식 (오리지널 방식) : ${ requestScope.msg }
	EL 표현식 (오리지널 방식) : ${ sessionScope.msg }
</body>


- 파라미터가 있다면 그 중 age를 가져오기 jsp?age=30 *중요*

<body>
	EL 표현식 (파라미터) : ${ param.age }
</body>

- 생략식을 사용했을 때 영역의 참조 순서

1. pageScope     2. requestScope     3. sessionScope     4.applicationScope

 


3. EL표기법의 연산자

 \ 를 $기호 앞에 붙였을때  해당 $부분 주석처리됨

1) 기본 연산자

1. EL표기법의 기본 연산자
	\${ 1 + 1 } 
	\${ 1 + 1 } = ${ 1 + 1 } 
	\${ 10 / 3 } = ${ 10/3 }


2) 비교 연산자 (중요!)

gt : >    ge : >=

lt : <     le : <=

eq : ==    ne : !=

mod %

\${ 3 > 2 } = ${ 3 > 2 } or ${ 3 gt 2 }
	${ 3< 2 } or ${3 lt 2 } 
	${ 3 ge 2 } or ${ 3 >= 2 } 
	${ 3 == 2 } or ${ 3 eq 2 }
	${ 3 != 2 } or ${ 3 ne 2 }


3) 삼항 연산자

파라미터값 : ${ param.msg == null ? '값 없음' : param.msg }
파라미터값  추천방식 : ${ empty param.msg ? '값 없음' : param.msg }


4) 논리 연산자

\${ 10 gt 3 && 5 eq 5 }  = ${ 10 gt 3 && 5 eq 5 }
\${ 10 gt 3 and 5 eq 5 } = ${ 10 gt 3 and 5 eq 5 }

 


4. EL표기법은 어떠한 방식에 담겨있어도 모두 출력할 수 있다

1) HashMap 내용 출력하기

 //HashMap의 정보를 출력해보자
 	<%
    	Map<String, Object> map = new HashMap<>();
    	map.put("name", "홍길동");
    	map.put("age", 20);
    	map.put("tall", 167.2);
    	//EL표기법으로 가져오고싶을때 4가지 스코프를 사용해서 저장을 먼저 해야한다.
    	request.setAttribute("myMap", map);
     %>
     
     <body>
		HashMap 내용 출력하기
		이름 출력 : \${ myMap.get("name")} = ${ myMap.get("name") }
		나이 출력(생략 해서) : \${ myMap['age'] } = ${ myMap['age'] } 
		신장 출력(더 생략해서) : \${ myMap.tall } = ${ myMap.tall } -> 가장 많이 사용하는 방법 
    </body>


2) vo 내용 출력하기

<%    	//request영역에 VO를 저장하고 출력해보자
    	//vo1
    	TestVO vo1 = new TestVO();
    	vo1.setName("일길동");
    	vo1.setAge(11);
    	
		//vo2
    	TestVO vo2 = new TestVO();
    	vo2.setName("이길동");
    	vo2.setAge(22);
    	
    	//scope에 vo를 저장한다
    	request.setAttribute("vo", vo1);
%>
<body>
	vo 내용 출력하기
	이름 : \${ vo.getName() } = ${ vo.getName() } 
	이름 : \${ vo.name } = ${ vo.name}

너무 중요!! 
getName으로 접근하지 않아도 출력 가능하지만 
그 이유는 vo.name이 내부적으로 설정되어 있는 getter로 알아서 접근해주기 때문이다. 
따라서 vo를 생성할때 getter를 생략해선 안됨!


3) ArrayList 내용 출력하기

<%
		//ArrayList에 담긴 vo들의 정보를 출력해보자
    	List<TestVO> list = new ArrayList<>();
    	list.add(vo1);
    	list.add(vo2);
    	
    	//scope에 ArrayList를 저장한다
    	request.setAttribute("arr", list);
%>
<body>
	ArrayList 내용 출력하기
	이름 : ${ arr.get(0).getName() }
	(생략해서) 이름 : ${ arr[0].name } / 
    			나이 :  ${ arr[0].age }
	
</body>