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>