본문 바로가기
Programming/Jsp

[JSP] 표현 언어 EL(Expression Language) 문법

by prinha 2020. 7. 14.
반응형

 

 

표현 언어 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 처리하지 않는다. 

 

반응형