표현 언어 EL(Expression Language)란?
JSP페이지에 사용되는 선언문(<%!%>), 스크립트릿(<%%>), 표현식(<%=%>)과 같은 자바코드를 대신
좀 더 쉽고 자연스러운 형태로 태그(주로 액션태그)의 속성 값을 지정하고 객체의 메소드에 지정하는 방법을 제공
표현 언어의 특징 및 기능
- 파라미터 값이 null 이어도 상관없음
- 파라미터 값의 파싱(변환작업)을 신경 쓰지 않아도 됨
- 변수와 연산자를 포함하고 함수를 호출할 수 있음
- JSP의 영역(page, request, session, application)에 저장된 어떤 속성 및 자바 빈이라도 표현언어의 변수로서 사용
- 표현언어의 표현식은 숫자, 문자열, boolean 값 및 null 같은 상수 값(리터럴)들도 포함 할 수 있음
- 내장 객체 지원
표현 언어의 작성 방법
- 표현 언어는 항상 ${ 로 시작해서 } 로 끝남 -> ${num}
- 표현식 안에 연산식 가능 -> ${num + 1}
- 표현식에는 브라켓 연산자 ( bracket ([ ]) operator)를 사용할 수 있음 -> ${article[“num”] + 1}
- 동적으로 값을 받도록 JSTL이나 커스텀 태그의 JSP 액션의 속성에 값을 지정할 때도 사용할 수 있음
-> <c:out value="${article.num + 1}"/>
[유동적인 속성 값 지정]
기존코드 : <someTags:aTag attribute="<%=aName%>">
표현언어 : <someTags:aTag attribute="${aName}">
[객체의 getter메소드에 접근]
기존코드 : <%=aCustomer.getAddress()%>
표현언어 : ${aCustomer.address}
표현언어의 연산자
표현 언어의 내장객체
내장객체는 ${ sessionScope.id } 와 같이 표현식에서 사용
기본 객체 |
설명 |
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(이름)의 결과와 동일) |
<예제 살펴보기 1>
<%@ 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>
<%
// 각각 자기 자신이 관리하는 영역(Scope)에 데이터(id와 키정보)를 저장하여 관리
pageContext.setAttribute("id","hi1"); // pageScope영역
request.setAttribute("id","hi2"); // requestScope영역
session.setAttribute("id","hi3"); // sessionScope영역
application.setAttribute("id","hi3"); // applicationScope영역
%>
<jsp:include page="scope.jsp" />
</body>
</html>
<%@ 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>scope 영역은? ${id }</h3>
</body>
</html>
결과물 : scope 영역은? : hi2 --> request영역 -> page는 객체 페이지가 소멸되서 없어져서 request 호출
session영역, application 영역 출력하려면 ${객체.속성} 해주기
<%@ 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>scope 영역은? ${pageScope.id }</h3>
</body>
</html>
결과물 : scope 영역은? --> page영역 --> 페이지 소멸 / null인데도 불구하고 에러가 떨어지지 않음
<예제 살펴보기 2>
<%@ 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>
<!-- 아이디 비밀번호 쿼리스트링 -->
<a href="param.jsp?userid=hello&pwd=1111">param 테스트</a>
</body>
</html>
<%@ 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>
아이디는? ${param.userid}
비밀번호는? ${param.pwd}
</body>
</html>
결과물 : param테스트 클릭 --> 아이디는? hello 비밀번호는? 1111
EL에서 스코프(Scope) 객체의 속성 참조
EL에서는 단순히 속성명만을 지정해준 경우 암묵적으로 네가지 Scope객체를 차례대로 탐색-> getAttribute()를 호출하여 값을 얻어냄
우선 순위 : pageScope -> requestScope -> sessionScope -> applicationScope
EL 비활성화 -> web.xml 파일에 비활성화 옵션 설정
<!-- EL ${식} 비활성화 -->
<jsp-config>
<jsp-property-group>
<url-pattern>/디렉터리명/*</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
<!-- EL #{식} 비활성화 -->
<jsp-config>
<jsp-property-group>
<url-pattern>/디렉터리명/*</url-pattern>
<deferred-syntax-allowed-as-literal>true</deferred-syntax-allowed-as-literal>
</jsp-property-group>
</jsp-config>
JSP 페이지내에서 page 디렉티브에서 비활성화 설정
- web.xml 파일 여부와 상관없이 page 디렉티브를 이용해서 활성화 또는 비활성화가 가능하다.
- isELIgnored : true일 경우 EL ${식}을 일반 문자열로 처리한다.
- deferredSyntaxAllowedAsLiteral : true일 경우 EL #{식}을 일반 문자열로 처리한다.
<!-- EL ${식} 비활성화 -->
<%@ page isELIgnored="true" %>
<!-- EL #{식} 비활성화 -->
<%@ page deferredSyntaxAllowedAsLiteral="true" %>
- web.xml 파일 버전에 따른 EL 자동 비활성화
- 서블릿 2.3 버전의 web.xml : EL 미지원
- 서블릿 2.4 버전의 web.xml : #{식} 미지원
- 서블릿 2.5 / 서블릿 3.0 버전의 web.xml : ${식}, #{식} 지원
- 비활성화 처리 여부
web.xml <el-ignored> |
page isELIgnored |
EL 처리여부 |
설정하지 않음 |
설정하지 않음 |
web.xml 파일이 서블릿 2.3 또는 그 이전버전이라면 EL 처리하지 않는다. |
false |
설정하지 않음 |
EL 처리한다. |
true |
설정하지 않음 |
EL 처리하지 않는다. |
상관없음 |
false |
EL 처리한다. |
상관없음 |
true |
EL 처리하지 않는다. |
'Programming > Jsp' 카테고리의 다른 글
[JSP] 내장객체(Implicit Object)와 영역(Scope) (0) | 2020.07.21 |
---|---|
[JSP] JDBC 커넥션풀 설정 소스 / server.xml / web.xml (0) | 2020.07.21 |
[JSP/Servlet] HTTP Redirect / Dispatcher (forward, include) (0) | 2020.07.21 |
[JAVA/JSP] 모델2 기반의 MVC(MODEL-VIEW-CONTROLLER) Design Pattern (0) | 2020.07.14 |
[JSP/DB] JDBC 데이터베이스 연동 - Oracle SQL (0) | 2020.07.08 |