본문 바로가기

java

JSP 표현식 언어(EL) 종합

Expression Language

JSP 스펙 2.0

 

EL님에 의해 스크립팅에서 해방된 JSP..............우하하..

요즘 스프링을 하다보니.. JSTL을 자연스럽게 접하게 되면서 기억이 가물가물한걸 살리기 위해 정리함..

잠안자고 뭔짓인지..

 

출처 : Head First Servlets & JSP

 

핵심정리

EL 표현식은 항상 중괄호로 묶고 앞에 달러($)기호를 붙입니다. ${표현식)

표현식에서 첫 번째 변수는 내장 객체거나 아니면 다음 4가지 생존범위에 속하는 속성입니다. (page, request, session, application)

■ 도트 연산자는 맵 키 이름이나 빈 프로퍼티 이름으로 값을 읽습니다. 예를 들어 ${foo.bar}에서 foo가 맵이라면 bar는 키가 될 것이며, foo가 빈이라면 bar는 당연히 프로퍼티가 되겠죠. 여하튼 사용자는 그 값을 읽을 수 있죠. 그리고 도트 연산자의 경우 오른쪽에 어떤 것이 오더라도 그 이름은 자바 명명 규칙을 따라야 합니다. 즉 문자, _, $가 제일 처음에 와야 하며 다음에는 앞에 것에 더하여 숫자까지 나올 수 있지요. 나머진 안됩니다.

■ 도트 연산자 오른쪽에 자바 식별자로서 부적절한 이름은 절대 올 수 없습니다. ${foo.1}과 같이 코딩할 수 없습니다.

[]연산자는 도트 연산자보다 훨씬 기능이 강력합니다. 왜냐구요. []연산자는 배열과 리스트 값도 읽을 수 있으니까. []안에 변수를 포함한 표현식을 쓸 수 있으며, 얼마든지 많은 []을 포함할 수도 있습니다.

■ 예를 들어 musicList ArrayList라고 해봅시다. musicList의 첫 번째 값을 읽으려면 ${musicList[0]}로 해도 되고 ${musicList[0]}로 해도 됩니다. EL에서는 인덱스 값에 따옴표를 허용합니다.

[]안에 있는 것에 따옴표가 없다면, 컨테이너는 이 값이 무언잇진 실행(평가)해봅니다. 따옴표가 있다면, 그리고 연산자 왼쪽이 배열이나 리스트가 아니라면, 프로퍼티나 키 이름이라고 생각하겠죠.

■ 딱 하나만 빼고 EL 내장 객체는 모두 맵입니다. 맵 내장 객체만 있으면 4가지 생존범위 객체에 묶여 있는 속성, 요청 파라미터값, 헤더값, 쿠키값, 컨텍스트 초기화 파라미터에 접근할 수가 있지요. 맵 타입이 아닌 객체는 pageContext뿐인데, 이는 PageContext 객체 참조 변수입니다.

EL 내장 생존범위 객체하고 실제 속성이 묶여 있는 객체하고 헛갈리지 마세요. requestScope 내장 객체하고 실제 JSP request 내장 객체하고 구분해야 합니다. EL에서 request 객체에 접근할 수 있는 유일한 길은 pageContext 내강 객체를 통해서입니다. ( request에 접근하지 않더라도 다른 EL 내장 객체 param/parmaValues, header/headerValues, cookie를 가지고서도 필요한 정보를 읽을 수 있습니다.)

EL 함수를 사용하면 일반 자바 클래스에 있는 정적인 공용(public static)메소드를 호출할 수 있습니다. 함수 이름하고 실제 메소드 이름이 일치할 필요는 없죠! 예를 들어 ${foo:rollIt}라고 해서 메소드 이르이 rollIt()이어야할 필요는 없단 말이지요.

TLD(태그 라이브러리 서술자)파일을 사용해서 함수 (: rollIt())와 실제 정적인 메소드를 서로 매핑합니다. <function>태그에 함수를 정의하는데, 그 하위 태그인 <name>에는 함수 이름을, <function-class>에는 경로까지 기술한 함수 클래스명을, <function-signature>에는 함수의 리턴 타입과 인자가 어떻게 되는지 작성합니다.

JSP에서 함수를 사용하려면, taglib 지시자로 이름공간(namespace)을 선어해야 합니다. taglib 지시자에 있는 앞 첨자(prefix)를 가지고 컨테이너는 코딩에서 호출한 함수가 어느 TLD에 있는지 파악하는데 사용합니다. 예를 들면 : <@ taglib prefix=mine uri=/WEB-INF/foo.tld%>

 

퇴근해서 집구석에서 12:51분에 작성함..

이래저래 스트레스 받네.. 집구석에서 뭐하는 짓이람...;

다음은 테스트해본 코드... 대충~~ ㅋㅋ



<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@page import="java.util.ArrayList"%>

<%@page import="java.util.HashMap"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>EL TEST</title>

</head>

<body>

Code by fransis[2007-06-20]

<%

String[] favoriteMusic  = {"Zero 7", "Tahiti 80", "BT", "Frou Frou"};

request.setAttribute("musicList", favoriteMusic);

 

ArrayList favoriteFood = new ArrayList();

favoriteFood.add("chai ice cream");

favoriteFood.add("fajitas");

favoriteFood.add("thai pizza");

favoriteFood.add("anything in dark chocolate");

request.setAttribute("favoriteFood", favoriteFood);

 

HashMap musicMap = new HashMap();

musicMap.put("Ambient", "Zero 7");

musicMap.put("Surf", "Tahiti 80");

musicMap.put("DJ", "BT");

musicMap.put("Indie", "Travis");

request.setAttribute("musicMap", musicMap);

request.setAttribute("Genre", "Ambient");

 

%>

 

Music is : ${musicList}<br/>

First song is : ${musicList[0]}<br/>

Second song is : ${musicList["1"]}<hr/>

 

Foods are : ${favoriteFood}<br/>

First food is : ${favoriteFood[0]}<br/>

Second food is : ${favoriteFood["1"]}<hr/>

 

Ambient is : ${musicMap.Ambient}<br/>

Ambient is : ${musicMap["Ambient"]}<hr/>

 

Music is : ${musicMap[Genre]}<br/> <!-- 작동함 -->

Music is : ${musicMap["Genre"]}<hr/> <!-- 작동안함 -->

 

<!--

파라미터 넘오는 값..

-->

Request Parma name is : ${param.name}<br/>

Request Parma food is : ${param.food}<br/>

Request paramValues first food is : ${paramValues.food[0]}<br/>

Request paramValues second food is : ${paramValues.food[1]}<br/>

Request paramValues first name is : ${paramValues.name[0]}<hr/>

 

 

<!--

헤더 정보..

-->

Host is : <%= request.getHeader("host") %><br/>

Host is : ${header["host"]}<br/>

Host is : ${header.host}<hr/>

 

<!--

HTTP 요청 메소드 정보..

-->

Method is : <%= request.getMethod() %><br/>

Method is : ${request.method}<br/><!-- 작동안함 -->

Method is : ${requestScope.method}<br/><!-- 작동안함 -->

Method is : ${pageContext.request.method}<hr/><!-- 작동함 -->

 

<!--

Cookie 요청 메소드 정보..

쿠키가 없음으로...주석..

<%

/*

Cookie[] cookies = request.getCookies();

for(int i = 0; i < cookies.length; i++){

                if ((cookies[i].getName()).equals("userName")){

                                 out.println(cookies[i].getValue());

                }

}

*/

%>

 

${cookie.userName.value}

-->

 

 

<form>

Name : <input type="text" name="name" value="lee"/><br/>

First Food : <input type="text" name="food" value="pizza"/><br/>

Second Food :<input type="text" name="food" value="sushi"/><hr/>

<input type="submit" value="submit"/>

</form>

</body>

</html>

 


'java' 카테고리의 다른 글

Jakarta String Tag Library  (4) 2007.12.13
현재 프로젝트의 자바 라이브러리 정리..  (0) 2007.09.14
jasper report용 servlet  (0) 2007.07.05
oracle8i/jdbc/tomcat  (0) 2004.09.15
mssql/jdbc/tomcat  (0) 2004.09.14