- [JSP]표현 언어(Expression Language)란? 목차
Expression Language(표현 언어 또는 익스프레션 언어)
- - 값을 표현하는데 사용되는 새로운 스크립트 언어로 JSP의 기본문법을 보완하는 역활을 한다.
- - JSP 네 가지 기본 객체가 제공하는 영역의 속성 사용
- - 집합 객체에 대한 접근 방법 제공
- - 수치 연산, 관계 연산, 논리 연산자 제공
- - 자바 클래스 메서드 호출 기능 제공
- - 표현 언어만의 기본 객체 제공
EL 기본 문법
${식 }
- - EL은 다음과 같이 $와 괄호('{' 와 }')' 그리고 표현식을 사용하여 값을 표현한다.
- - 식 부분에는 표현 언어가 정의한 문법에 따라 값을 표현하는 식이 온다. (액션태그 또는 커스텀태그의 속성 값, 표현식)
- - JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있다.
- - EL은 JSP의 스크립트요소(스크립트 릿 ,표현식,선언부)를 제외한 나머지 부분에서 사용될 수 있다.
ex)
<b>${sessionScope.member.id}</b>님 환영합니다.
또한 곧바로 값을 계산할 수 있는데 아래 예를 살펴보자 !
<%
Member m= new Member();
m.setName("이름1");
%>
<c:set var="m" value="<%=m %>" />
<c:set var="name" value="${m.name}" /> <%-- 이 시점에 바로 값 계산 --%>
<% m.setName("이름2"); %>
${name} <%--name의 값은 "이름1" --%>
->한 마디로, <c:set>이라는 JSTL 태그는 EL변수를 생성해주는 기능을 제공한다.
위 코드에서 EL변수 name의 값으로 ${m.name}을 지정했는데, m.name을 계산한 결과인 즉, m.getName()의 결과인 "이름1"을 name값으로 할당한다. 따라서 그 뒤에 m.setName()으로 값을 변경하더라도 name변수의 값은 변경되지 않는다.
반면 , value값에 "#{m.name}" 처럼 "#"을 넣을 경우에는 값을 계산하지 않고 name변수 값을 m.name으로 가져온다고 생각하자. 결과적으로, "#"을 사용하면 변경된 값을 출력하게된다. (단, #을 사용할 경우 일반 텍스트에서 사용하면 에러가 발생한다)
EL 기본 객체
- 표현 언어도 11개의 기본 객체를 제공한다.
- 값이 존재하지 않을 경우 null을 출력하지 않고 아무것도 출력하지 않는다.
기본 객체 |
설명 |
pageContext |
JSP의 page 기본 객체와 동일하다. |
pageScope |
pageContext 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
requestScope |
request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
sessionScope |
session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
applicationScope |
application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 |
param |
요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체, 타입은 String (request.getParameter(이름)의 결과와 동일) |
paramValues |
요청 파라미터의 <파라미터이름, 값 배열>매핑을 저장한 Map 객체, 타입은 String[] (request.getParameterValues(이름)의 결과와 동일) |
header |
요청 정보의 <헤더이름, 값> 매핑을 저장한 Map 객체 (request.getHeader(이름)의 결과와 동일) |
headerValues |
요청 정보의 <헤더이름, 값 배열> 매핑을 저장한 Map 객체 (request.getHeaders(이름)의 결과와 동일) |
cookie |
<쿠키 이름, Cookie> 매핑을 저장한 Map 객체 (request.getCookies()로 구한 Cookie 배열로 부터 매핑을 생성) |
initParam |
초기화 파라미터의<이름, 값> 매핑을 저장한 Map 객체 (application.getInitParameter(이름)의 결과와 동일) |
ex)
${cookie.ID.value} //이름이 ID인 쿠키 값 출력
${param.code} //이름이 code인 파라미터의 값 출력
EL 객체 접근
- ${ <표현1>.<표현2> } 또는 ${ <표현1>[<표현2>] } 형식을 사용한다.
- <표현1>을 <값1>로 변환한다.
- <값1>이 null이면 null을 리턴한다.
- <값1>이 null이 아니면 <표현2>를 <값2>로 변환한다.
- <값2>가 null이면 null을 리턴한다.
- <값1>이 Map, List, 배열인 경우
A.<값1>이 Map 이면
i . <값1>.containsKey(<값2>)가 false이면 null을 리턴한다.
ii. 그렇지 않으면 <값1>.get(<값2>)를 리턴한다.
B.<값1>이 List나 배열이면
i. <값2>가 정수값인지 검사한다.(정수값이 아닐 경우 에러 발생)
ii. <값1>.get(<값2>) 또는 Array.get(<값1>, <값2>)를 리턴한다.
iii. 위 코드가 익셉션을 발생하면 에러를 발생한다.
- <값1>이 다른 객체이면
A.<값2>를 문자열로 변환한다.
B.<값1>이 이름이 <값2>이고 읽기 가능한 프로퍼티를 포함하고 있다면 프로퍼티의 값을 리턴한다.
C.그렇지 않을 경우 에러를 발생한다.
EL 수치 연산자
- '+' : 덧셈
- '-' : 뺄셈
- '*' : 곱셈
- '/' 또는 div : 나눗셈
- '%' 또는 mod : 나머지
- 숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환한 후 연산자를 수행한다. (단, 숫자로 변환할 수 있는 객체)
- 객체가 null이면 0으로 처리된다.
- 나눗셈 연산자는 피연산자를 Double 타입으로 변환한 뒤 연산을 수행한다.
- += : 문자열 연결
ex)
${"10"+1} // +연산자는 수치 연산자이므로 "10"을 숫자로 먼저 변환하고 연산수행
오류)
${"일"+10} //오류 "일"을 숫자로 변환 X
EL 비교 연산자
- '==' 또는 eq : 같은가
- '!=' 또는 nu : 같지 않은가
- '<' 또는 lt : 작은가
- '>' 또는 gt : 큰가
- '<=' 또는 le : 작거나 같은가
- '>=' 또는 ge : 크거나 같은가
단, 문자열을 비교할 경우 String.compareTo()메서드를 사용한다. (객체 역시 비교 )
ex)
${someValue =='2004' } //이 코드는 scomeValue.compareTo("2004")==0 과 같은 의미
EL 논리 연산자
- '&&' 또는 and : 그리고
- '||' 또는 or : 이거나
- '!' 또는 not : 부정
EL empty 연산자
- empty <값>
- 검사할 객체가 null 인지 검사하기 위해 사용한다.
- <값>이 null이면 true
- <값>이 빈 문자열("")이면 true
- <값>이 길이가 0인 배열이면 true
- <값>이 빈 Map이면 true
- <값>이 빈 Collection이면 true
- 이 외의 경우에는 false
EL 비교 선택 연산자
- <수식> ? <값1> : <값2>
- <수식>의 결과값이 ture 이면 <값1>을 리턴하고, false이면 <값2>를 리턴한다.
EL 연산자 우선순위
- 우선순위가 높은순으로 먼저 실행되고, 같을 경우 왼쪽에서 오른쪽으로 진행된다.
- [] .
- ()
- -(단일) not ! empty
- * / div % mod
- + -
- < > <= >= lt gt le ge
- == != eq ne
- && and
- || or
- ? :
EL 특수문자 처리
- \${식} 또는 \#{식}
- JSP 템플릿 텍스트에서 처리할때 앞에 역슬래시(\)를 위치시킨다.
EL 객체의 메서드 호출
- JSP 2.2 버전에 추가된 기능으로 객체의 메서드를 직접 호출할 수 있다.
- 자바빈스타일의 메서드, 리턴타입이 void이거나 파라미터 개수의 관계없이 호출 된다.
// ELMethod.java
package com.tistory.gangzzang;
import java.util.HashMap;
import java.util.Map;
public class ELMethod {
private Map memberMap = new HashMap();
public int sumNumber(int num1, int num2) {
return num1 + num2;
} // sumNumber : 두 정수를 더한다.
public void setMember(String name, String tel) {
memberMap.put(name, tel);
} // setMember : memberMap에 회원 추가한다.
public String getMember(String name) {
return memberMap.get(name);
} // getMember : memberMap에서 회원 이름의 연락처를 얻는다.
public String getInfo() {
return "EL 메서드 호출";
} // getInfo : 정보 출력
} // ELMethod
출처: https://gangzzang.tistory.com/entry/JSP-표현-언어Expression-Language-또는-익스프레션-언어 [갱짱.study]
<!-- elMethod.jsp -->
<%@page import="com.tistory.gangzzang.ELMethod"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% ELMethod elMethod = new ELMethod(); request.setAttribute("el", elMethod); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL 메서드</title>
</head>
<body>
${ el.getInfo() } <br><br> 회원 추가 : ${ el.setMember('Gz', '01012345678') } <br><br>
회원 연락처 : ${ el.getMember('Gz') } <br><br>
두 정수의 합 : ${ el.sumNumber(5, 10) }
</body>
</html>
<!-- 실행결과 EL 메서드 호출 회원 추가 : 회원 연락처 : 01012345678 두 정수의 합 : 15 -->
EL 클래스 정적 메서드 호출
- EL 3.0버전부터는 쉽고 빠르게 정적 메서드 호출을 할 수 있다. (3.0이하는 따로 있으니 찾아보기)
- JSP 코드만 작성하면 된다. (TLD파일이나 web.xml파일 설정을 할 필요가 없다.)
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="util.FormatUtil"%>
<%
request.setAttribute("price",12345L);
%>
<html>
<head>
<title> EL함수 호출 </title>
</head>
<body>
가격은<b>${FormatUtil.number(price,'#,##0') }</b>원 입니다.
</body>
</html>
//02행 정적 메서드를 포함한 클래스를 임포트한다.
//10행 EL에서 임포트한 클래스의 정적 메서드를 호출한다.
'Web(국비) > JSP' 카테고리의 다른 글
[JSP]JSTL(표준 태그 라이브러리) (0) | 2019.11.07 |
---|---|
[JSP]-표현언어:람다식, 스트림API (0) | 2019.11.06 |
[JSP]-session이란?(세션과 쿠키의 차이점) (0) | 2019.11.04 |
[JSP]쿠키(Cookie)란? (0) | 2019.11.03 |
[JSP]자바빈과 <jsp:useBean>액션 태그란? (0) | 2019.11.02 |