본문 바로가기
Programming/JSTL

EL&JSTL

by 막이 2012. 9. 13.
EL (Expression Language)

- JSP 2.0 스펙에 포함되어 JSP에서 자바 scripting 대신에 데이터를 출력하기 위한 기능이 확장된 표현언어이다!!

- 특징!
1. 변수와 연산자를 포함할수 있다.
2. JSP의 scope에 저장된 속성 및 자바 빈 속성도 EL의 변수로 사용 가능하다
3. EL 자체의 내장객체가 제공된다.
4. 표현식에는 숫자, 문자열, boolean 값과 null도 포함할 수 있다.

- 방법!
${표현식}
- 주의 사항
기본적으로 EL 사용을 무시하도록 설정됨, 반드시 page Directive에서 isELlgnored = "false" 로 설정한다.

JSP액션
<jsp:setProperty name="user" property="timezonePref" value='<%=request.getParameter("timezone")%>'>

ex) JSP액션의 애트리뷰느는 정적 캐릭터 스트링이나 익스프레션을 사용하여 지정된다. 위와 같이 <jsp:setProperty>액션의 name과 property 애트리뷰트를 위해 지정된다.반면 익스페레션은 이것의 값 애트리뷰트를 지정하는데 사용된다. 이 액션은 요청 매개변수의 현재 값을 이름이 붙영진 빈 속성으로 할당하는 효과를 갖고 있다. 애트리뷰트 값을 동적으로 지정하기위한 JSP 스팩에 내장된 유일한 메커니즘이다.!! JSP액션은 익스프레션을 사용하여 지정되기 때문에 다른 스크립팅 엘리먼트와 같은 소프트웨어 관리 문제가 일어날 수 있다. 이런 이유로 인해 JSTL 커스텀 태그는 동적 애트리뷰트 값을 지정하기 위한 대안 메커니즘을 지원한다. JSP익스프레션을 사용하는 것보다 JSTL 액션용 애트리뷰트 값이 단순화된 EL을 사용하여 지정 될수 있다. EL은 JSP 컨테이너에 있는 데이터를 검색 및 조작할 식별자, 접근자, 연산자를 제공한다. EL은 객체와 속성들을 검색하면서 간단한 작동을 수행한다. 이것은 프로그래밍 언어도 스크립팅 언어도 아니다. JSTL 태그와 결합하면 간단하고 편리한 표기를 사용하여 복잡한 작동이 표현 될 수 있다!!!!

JSTL액션
<c:out value="${user.firstName}"/>

예제)
EL 사용
JSP 페이지 선언시 isELIgnored="false" 를 추가하여야 한다!!

<%@ page language="java" import="java.util.*" contentType="text/html;charset=euc-kr" isELIgnored="false"%>
버젼에 따라 명시 유무가 틀리지만 isELIgnored="true" 할 경우에는 지원하지 않는다. 아래오 같이 표현식이 출력된다!!



isELIgnored="false" 로 설정할 경우!! 아래와 같이 값이 출력되는것을 확인 할수 있음!! (..) source~



<td width="7%" class="a"><span>${m.name}</span></td>
<td width="5%" class="a"><span>${m.age}</span></td>
<td width="11%" class="a"><span>${m.weight}</span></td>
<td width="5%" class="a"><span>${m.height}</span></td>
<td width="7%" class="a"><span><%=m.getSex() %></span></td>

여러개의 익스프레션들과 정적 테스트를 결합하여 스트링 연결을 통해 동적 애트리뷰트 값을 만들 수 있다!
개별 익스프레션들은 식별자,접근자,리터럴,연산자구성되며 식별자는 데이터 센터에 저장된 데이터 객체를 참조하는데 사용된다. EL은 11개의 식별자를 보유하고 있다!! 리터럴은 고정된 값들(숫자,문자,스트링,부울,null)을 나타낸다.
연산자는 데이터와 리터럴이 결합 및 비교될수 있도록 한다.

정적 텍스트와 여러 EL익스프레션을 결합하여 동정 애트리뷰트 값 지정!!
<c:out value="Hello ${user.firstName} ${user.lastName}"/>
EL은 범위 변수 같은 객체들을 검색하는 빌트인을 지원한다. 특히 EL의 내장 객체중 하나라도 상응하지 않는 EL 익스프레션에 있는 식별자는 네 개(page,request,session,application) 의 JSP SCOP 중 하나에 저장된 객체를 참조하는 것으로 자동 간주 된다..!!!

쉬어가자!!! JSP Action!! 이란??
객체 생성 <jsp:useBean>
객체 속성값 setProperty
객체 속성값 알아보기 getProperty
JSP 액션을 통해서 생성된 객체는 그 객체가 사용될 수 있는 Scope 혹은 LifeCycle을 갖는다.
이것은 생성된 객체의 Reference가 어디에 사용 될 수 있고, 언제 삭제될 것인가를 가진다.
생성된 객체의 라이프 사이클은 scope속성에 의해서 결정되며 가장 긴 LifeCycle 은 application 이고, 가자 짧은 LifeCycle는 page다.

# SCOPE 속성
page 단일 클라이언트 요청에 의해서 생성된 페이지 내에서 접근하여 사용될 수 있다. 실질적으로 PageContext 저장
request 단일 클라이언트 요청이 처리되는 동안에 접근하여 사용될 수 있다. 실질적으로 HttpServletRequest 저장
--page vs request : request에서는 forward나 include를 사용해서 다른페이지로 제어가 이동되는 경우에도 접근이 가능
session 사용자의 세션이 유지되는 어느 곳에서나 접근해서 사용할 수 있다. 실질적으로 HttpSession에 저장
application 웹 응용프로그램의 LifeCycle동안에 웹 응용프로그램 에 소속된 임의의 Servlet 과 JSP에서 접근해서 사용할수 있다. 실질적으로 ServletContext에 저장

# EL 내장객체
Category 식별자 설명
JSP pageContext 현재 페이지의 프로세싱과 상응하는PageContext 인스턴스
범위 pageScope 페이지 범위 애트리뷰트
requestScope 요청범위 애트리뷰트
sessionScope 세션범위
applicationScope 애플리케이션 범위
요청 매개변수 param 요청매개변수의 기본값을 이름
paramValues 요청매개변수의 모든값을 StringArea
요청 헤더 header 요청헤더의 기본값을 이름
headerValues 요청헤더의 모든값을 StringArea
쿠키 cookie 요청에 수단되는 쿠키들을 이름으로
초기화 매개변수 initParam 초기화 매개변수를 이름으로 지정

# JSP 와 EL 내장객체가 일반적인 하나의 객체를 갖는 반면(pageContext)다른 JSP 내장 객체는 EL에서 접근가능하다.
pageContext가 다른 8개의 JSP내장 개체 모두에 Access 할 수 있는 attribute을 갖고 있기 때문..

남아있는 모든 EL 내장 객체들은 맵(map)이다. 이름에 상응하는 객체들을 탐색한다. 첫 번째 네 개의 맵은 이전에 언급한 다양한 애트리뷰트 범위를 나타낸다. 특정 범위 내의 식별자들을 검색하는데 사용될 수 있다. EL이 기본적으로 사용하는 순차적인 탐색 프로세스에 의존하지 않는다.

다음 네 개의 맵은 요청 매개변수와 헤더의 값을 반입하는 용도이다. HPPT 프로토콜이 요청 매개변수와 헤더가 다중 값을 가질 수 있도록 하기 때문에 각각 한 쌍의 맵이 있다. 각 쌍 중에서 첫 번째 맵은 요청 매개변수 또는 헤더에 대한 기본 값을 리턴한다. 실제 요청 시 첫 번째로 지정된 값이 무엇이든 상관없다. 두 번째 맵은 매개변수나 헤더의 값 모두 검색될 수 있도록 한다. 이 맵의 핵심은 매개변수 또는 헤더의 이름이다. 값들은 String 객체의 어레이이다.

쿠키 내장 객체는 요청으로 설정된 쿠키에 대한 접근을 제공한다. 이 객체는 요청과 관련된 모든 쿠키들의 이름을 Cookie 객체들로 매핑하면서 쿠키들의 속성을 나타낸다.

마지막 EL 내장 객체인 initParam은 웹 애플리케이션과 관련된 모든 콘텍스트 초기와 매개변수의 이름과 값을 저장하는 맵이다. 초기화 매개변수들은애플리케이션의 WEB-INF 디렉토리에 있는 web.xml 전개 디스크립터 파일을 통해 정의된다.

접근자 (Accessors)

EL 식별자는 내장 객체 또는 범위 변수로서 설명될 수 있기 때문에 자바 객체로 평가해야한다. EL은 상응하는 자바 클래스에서 프리머티브를 래핑/언래핑한다. 하지만 대부분의 경우 식별자들은 자바 객체에 대한 포인터가 된다.

결과적으로 이러한 객체들의 속성이나, 어레이와 컬렉션의 경우 그들의 엘리먼트에 액세스하는 것이 바람직하다. 이를 위해 EL은 두 개의 다른 접근자를 제공한다. 닷(dot) 오퍼레이터(.)와 브래킷 오퍼레이터([])이다. 이들은 속성과 엘리먼트들이 EL을 통해 연산될 수 있도록 한다.

닷 연산자는 객체의 프로퍼티에 접근하는데 사용된다. ${user.firstName} 익스프레션에서 닷 연산자는 user 식별자에 의해 참조된 객체 중 firstName이라는 이름을 가진 속성에 액세스 한다. EL은 자바 빈 규정을 사용하여 객체 속성에 접근하기 때문에 이 속성에 대한 게터(일반적으로 getFirstName())는 이 익스프레션이 정확히 계산하기 위해서 반드시 정의되어야 한다. 액세스되는 속성이 객체일 때 닷 연산자는 재귀적으로 적용될 수 있다. 예를 들어 가상의 user 객체가 자바 객체로서 구현된 address 속성을 갖고 있다면 닷 연산자는 이 객체의 속성에 액세스 하기 위해 사용될 수도 있다. ${user.address.city} 익스프레션은 이 address 객체 중 중첩된 city 속성을 리턴한다.

브래킷 연산자는 어레이와 컬렉션의 엘리먼트를 검색하는데 사용된다. 어레이와 컬렉션(java.util.List를 구현하는 컬렉션)의 경우 검색될 엘리먼트 인덱스는 브래킷 안에 나타난다. 예를 들어 ${urls[3]} 익스프레션은 이 urls 식별자에 의해 참조된 어레이 또는 컬렉션의 네 번째 엘리먼트를 리턴한다.

java.util.Map 인터페이스를 구현하는 컬렉션의 경우 브래킷 연산자는 관련 키를 사용하여 맵에 저장된 값을 찾는다. 이 키는 브래킷 내에서 지정되고 상응하는 값은 익스프레션 값으로 리턴된다. 예를 들어 ${commands["dir"]} 익스프레션은 commands 식별자에 의해 참조된 Map"dir" 키와 관련된 값을 리턴한다.

익스프레션이 브래킷안에 나타날 수 있다. 중첩된 익스프레션의 계산 결과는 컬렉션이나 어레이의 적절한 엘리먼트를 검색하는 인덱스 또는 키로 작용한다. 닷 연산자가 true라면, 브래킷 연산자도 재귀적으로 적용될 수 있다. 이는 EL이 다차원 어레이, 중첩 컬렉션, 또는 둘의 결합에서 엘리먼트를 검색 할 수 있도록 한다. 더욱이 닷 연산자와 브래킷 연산자는 상호운용성이 있다. 예를들어 한 어레이의 엘리먼트가 객체라면 브래킷 연산자는 그 어레이의 엘리먼트를 검색하는데 사용될 수 있고 닷 연산자와 결합하여 엘리먼트 속성 중 하나를 검색할 수 있다. (예를 들어 ${urls[3].protocol}).

EL이 동적 애트리뷰트 값을 정의하는 간한한 언어로서 작용한다고 볼 때, 자바 접근자와는 다른 EL 접근자의 재미있는 특성 중 하나는 null에 적용될 때 예외를 던지지 않는다는 점이다. EL 접근자가 적용되는 객체(예를 들어 ${foo.bar}${foo["bar"]}foo 식별자)가 null이면 접근자 적용 결과 역시 null이다. 이는 대부분의 경우, 도움이 되는 일이다.

마지막으로 닷 연산자와 브래킷 연산자는 상호 교환될 수 있다. 예를 들어 ${user["firstName"]}user 객체의 firstName 속성을 검색하는데 사용될 수 있다. ${commands.dir}commands 맵에서 "dir" 키와 관련된 값을 반입하는데 사용될 수 있는것과 같은 이치이다.

연산자 (Operators)

식별자와 접근자를 사용하여 EL은 Application 데이터(범위 변수를 통해 노출) 또는 환경 관련 정보(EL 내장 객체를 통해 노출)를 포함하고 있는 객체 계층을 트래버스 할 수 있다.

EL연산자

Category 연산자
산술 +,-,*,/ (or div),%(or mod)
관계형 == (or eq), != (or ne), < (or lt), > (or gt), <= (or le), >= (or ge)
논리 && (or and), || (or or), ! (or not)
타당성검사 empty

산술 연산자를 사용하는 EL 익스프레션

${item.price * (1 + taxRate[user.address.zipcode])}

관계형 연산자 및 논리적 연산자를 사용하는 EL 익스프레션

${(x >= min) && (x <= max)}

리터널 (Literals)
숫자, 캐릭터 스트링, 부울, null은 EL 익스프레션에서 리터럴 값으로 지정될 수 있다. 캐릭터 스트링은 싱글 쿼트 또는 더블 쿼트로 범위가 지정된다. 부울 값은 truefalse로 계산된다.

예제)

Scope - application 사용



결과



Source
<jsp:useBean id="m" class="JSTL.MemberBean" scope="application"/>
<td width="7%" class="a"><span>${applicationScope.m.name}</span></td>

Param사용



결과


Source
<td width="7%" class="a"><span>${param.name}</span></td>

initParam 사용


결과


Web-app 초기 설정


Source
< td width="7%" class="a"><span>${initParam.name}</span></td>


커스텀 태그?
EL 이나 JSP의 표준 액션으로 구현하기 어려운 부분을 해결하기 위해 필요해 의해서 만든 태그를 의미한다!

JSTL (JSP Standard Tag Library)
: 가장 일반적으로 많이 사용되는 커스텀 태그를 표준화 시켜 라이브러리 형태로 제공하는 것!(JSP 2.0 에 포함)
, 일반적으로 모든 개발자가 가장 필요로 하는 구현 내용을 표준 태그로 제공


JSTL을 사용하기 위해서 !!! 준비사항 ㅎㅎ

- JSTL 라이브러리를 다운받아 클래스 패스에 설정!
- JSP에서 taglib 태그로 사용할 라이브러리를 지정!

JSTL 구성요소
- CORE : 공통 필수 기능
- XML : XML 문서 처리 관련 기능
- I18N : 국제화 지원 관련 기능
- SQL : JDBC를 이용한 DB처리 기능

JSTL 라이브러리별 taglib URL과 Prefix

Libray URI Prefix
CORE

http://java.sun.com/jsp/jstl/core

c
XML http://java.sun.com/jsp/jstl/xml x
I18N(국제화) http://java.sun.com/jsp/jstl/fmt fmt
SQL http://java.sun.com/jsp/jstl/sql sql

페이지 지시어에서 사용법

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

CORE Libary
수식,흐름제어,URL을 통한 자원 접근등 가장 일반적으로 필요한 기능으로 구성

 

'Programming > JSTL' 카테고리의 다른 글

JSTL Library  (0) 2013.10.01
JSTL 포맷 fmt  (0) 2013.06.28
eq, ne, empty 사용  (0) 2012.11.30
JSTL 개요  (0) 2012.09.13
jstl <c:choose>,<c:when>,<c:otherwise>테그 사용 예제  (0) 2012.09.12