Transcript lecture-09

익스프레션 언어
JSP & Servlet
Contents
 학습목표
 익스프레션 언어(표현식 언어)는 JSP 규격서가 처음 만들어질 때부터 있
던 문법이 아니라 새롭게 추가된 문법이다. 이 문법을 이용하면 데이터를
출력하는 코드를 함축적이고 간결하게 구사할 수 있어 코드의 가독성과
유지보수 용이성에 큰 도움이 된다.
 내용
 익스프레션 언어란?
 익스프레션 언어의 기초 문법
 익스프레션 언어의 연산자
 익스프레션 언어로 자바의 정적 메서드 호출하기
2/57
1. 익스프레션 언어란?
 익스프레션 언어(expression language) / 표현식 언어
 식(expression)을 중심으로 코드를 기술하는 언어
 JSP Spec. 2.0에서 정의
• 자바빈의 프로퍼티의 프로퍼티를 접근을 지원
 연산자와 피연산자의 조합을 ${와 }로 둘러싸서 표현한다.
${cnt+1}
표현식 언어의 식(EL식)
<%= cnt+1 %>
표현식
• cnt 데이터 이름의 의미는 서로 다르다.
• 표현식에서 사용된 cnt는 자바 프로그래밍 언어의 변수 이름이며, EL 식에서 사용된 cnt는 내장
객체에 저장되어 있는 속성의 이름이다.
3/57
1. 익스프레션 언어란?
<%
덧셈의 결과를 속성로 저장합니
int sum = 0;
다
for (int cnt = 1; cnt <= 100; cnt++)
sum += cnt;
request.setAttribute( “RESULT ”, new Integer(sum));
RequestDispatcher dispatcher = request.getRequestDispatcher( “HundredResult.jsp ”);
dispatcher.forward(request, response);
%>
호
출
<%@page contentType= “text/html; charset=euc-kr ”%>
<HTML>
<HEAD><TITLE>1부터 100까지의 합</TITLE></HEAD>
<BODY>
1부터 100까지 더한 결과는? <%= request.getAttribute( “RESULT ”) %>
</BODY>
</HTML>
[그림 7-1] 속성 형태로 전달되는 데이터
속성 값을 가져다가 출력합니다.
4/57
1. 익스프레션 언어란?
<%
덧셈의 결과를 속성으로 저장합
int sum = 0;
니다
for (int cnt = 1; cnt <= 100; cnt++)
sum += cnt;
request.setAttribute( “RESULT ”, new Integer(sum));
RequestDispatcher dispatcher = request.getRequestDispatcher( “HundredResult.jsp ”);
dispatcher.forward(request, response);
%>
호
출
<%@page contentType= “text/html; charset=euc-kr ”%>
<HTML>
<HEAD><TITLE>1부터 100까지의 합</TITLE></HEAD>
<BODY>
1부터 100까지 더한 결과는? ${RESULT}
</BODY>
</HTML>
[그림 7-2] 속성값을 출력하는 EL 식
속성값을 가져다가 출력합니다.
5/57
2. 익스프레션 언어의 기초 문법
 익스프레션 언어에서의 식 표현
 익스프레션 언어의 유일한 목적은 식을 계산해서 그 결과를 출력하는 것
 EL 식의 표현
EL 식의
문법
${ 식 }
• 식’위치에는 데이터 이름 하나로만 구성된 식이 들어갈 수도 있고, 연산자를 포함하는 식이 들어
갈 수도 있으며, 자바의 정적 메서드를 호출하는 식이 들어갈 수도 있다.
${RESULT}
데이터 이름 하나로만
구성된
EL 식
${RESULT + 101}
연산자를 포함하
는
EL 식
${m:sqrt(100)}
자바의 정적 메서드를 호출
하는
EL 식
6/57
2. 익스프레션 언어의 기초 문법
 데이터 이름 하나로만 구성된 EL 식
 데이터 이름 하나로만 구성된 EL 식은 가장 간단한 형태의 EL 식이다.
 EL 식 안에 기술되는 데이터 이름은 속성 이름으로 해석
${RESULT}
애트리뷰트 이
름
내장 객체에
저장된 속성
[표 7-1] JSP/서블릿 기술에서 사용되는 네 종류의 속성
속성의 종류
호출할 때 사용하는 내장 객체
메서드의 소속
page 속성
pageContext 내장 객체
javax.servlet.jsp.JspContext 클래스
request 속성
request 내장 객체
javax.servlet.ServletRequest 인터페이스
session 속성
session 내장 객체
javax.servlet.http.HttpSession 인터페이스
application 속성
application 내장 객체
javax.servlet.ServletContext 인터페이스
7/57
2. 익스프레션 언어의 기초 문법
 데이터 이름 하나로만 구성된 EL 식
[예제 7-1] 1부터 100까지의 합을 구하는 JSP 페이지
1부터 100까지의 합을 구하는 JSP 페이지
request 내장 객체에
속성으로 저장합니다
<%
int sum = 0;
for (int cnt = 1; cnt <= 100; cnt++)
sum += cnt;
request.setAttribute( “RESULT ”, new Integer(sum));
RequestDispatcher dispatcher = request.getRequestDispatcher( “HundredResult.jsp ”);
dispatcher.forward(request, response);
%>
1부터 100까지의 합을 출력하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%>
<HTML>
<HEAD><TITLE>1부터 100까지의 합</TITLE></HEAD>
<BODY>
request 내장 객체에 있는
1부터 100까지 더한 결과는? ${RESULT}
속성값을 가져다가 출력합니
</BODY>
다
</HTML>
8/57
2. 익스프레션 언어의 기초 문법
 데이터 이름 하나로만 구성된 EL 식
[예제 7-2] 1부터 1000까지의 합을 구하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%>
<%
pageContext 내장 객체에
int sum = 0;
속성으로 저장합니다
for (int cnt = 1; cnt <= 1000; cnt++)
sum += cnt;
pageContext.setAttribute( “RESULT ”, new Integer(sum));
%>
<HTML>
<HEAD><TITLE>1부터 1000까지의 합</TITLE></HEAD>
<BODY>
1부터 1000까지 더한 결과는? ${RESULT}
pageContext 내장 객체에
</BODY>
있는 속성값을 가져다가 출력합
</HTML>
니다.
[그림 7-4] 예제 7-2의 실행 결과
9/57
2. 익스프레션 언어의 기초 문법
 데이터 이름 하나로만 구성된 EL 식
 EL 식에 있는 데이터 이름을 해석하는 순서는 생존 범위가 좁은 속성부터 점점 더 생존
범위가 넓은 속성 순으로 진행 된다.
page
속성
request
속성
session
속성
application
속성
 순서에 상관없이 특정한 종류의 속성을 지정하여 출력하고 할 때는 생존 범위 EL 내장
객체를 사용하여 표시하면 된다.
${pageScope.SUM}
page 속성임을 표시
${sessionScope.CART}
session 속성임을 표시
${requestScope.RESULT}
request 속성임을 표시
${applicationScope.DB_NAME}
application 속성임을 표시
10/57
2. 익스프레션 언어의 기초 문법
 데이터 접근 EL 식
11/57
2. 익스프레션 언어의 기초 문법
 EL 접근 연산자
 Dot(.) 연산자
12/57
2. 익스프레션 언어의 기초 문법
 EL 접근 연산자
 [] 연산자
13/57
2. 익스프레션 언어의 기초 문법
 EL 접근 연산자
 [] 연산자 – 배열 사용
14/57
2. 익스프레션 언어의 기초 문법
 EL 접근 연산자
 [] 연산자 – 배열 및 리스트에서 문자열 인덱스는 숫자로 변환
15/57
2. 익스프레션 언어의 기초 문법
 EL 접근 연산자
 자바빈과 맵 객체에 대해서는 Dot(.) 연산자 및 [] 연산자 모두 사용 가능
16/57
2. 익스프레션 언어의 기초 문법
 EL 접근 연산자
 [] 연산자에서 [] 안의 문자열 처리 방법
• “”(따옴표) 문자열 – [] 왼쪽에서 정의된 항목에 따라 다르게 처리
– 맵 객체  키(key) 값으로 처리
– 빈 객체  프로퍼티 이름으로 처리
– 배열 또는 리스트  인덱스 값으로 전환하여 처리
• “”(따옴표)를 사용하지 않은 문자열 – 실행하여 값을 산출하거나 대응하는 속성을 검색
– 단순 문자열  EL 내장 객체 또는 생존 범위 내장 객체에 저장된 속성을 검색하여 대치
– 수식  실행하여 값으로 대치
java.util.Map musicMap = new java.util.HashMap();
musicMap.put(“Ambient”, “Zero 7”);
musicMap.put(“Surf”, “Tahiti 80”);
musicMap.put(“DJ”, “BT”);
musicMap.put(“Indie”, “Frou Frou”);
request.setAttribute(“musicMap”, musicMap);
request.setAttribute(“Genre”, “Ambient”);
Music is ${musicMap[“Ambient”]
 Music is Zero 7
Music is ${musicMap[Genre]}
Music is ${musicMap[“Genre”]}
“Genre” 키가 없어 NULL 값 반환
 Music is
17/57
2. 익스프레션 언어의 기초 문법
 EL 접근 연산자
 [] 연산자에서 [] 안의 표현식
• [] 안에 표현식 작성이 가능(Nested Expression)
• 포함되는 표현식의 깊이에는 제한이 없다
• 표현식을 실행할 때에는 안쪽에서 바깥쪽 순서로 진행
java.util.Map musicMap = new java.util.HashMap();
musicMap.put(“Ambient”, “Zero 7”);
musicMap.put(“Surf”, “Tahiti 80”);
musicMap.put(“DJ”, “BT”);
musicMap.put(“Indie”, “Frou Frou”);
request.setAttribute(“musicMap”, musicMap);
String[] musicType = {“Ambient”, “Surf”, “DJ”, “Indie”};
request.setAttribute(“MusicType”, musicType);
Music is ${musicMap[MusidcType[0]]}
Music is ${musicMap[“Ambient”]}
Music Zero 7
18/57
2. 익스프레션 언어의 기초 문법
 익스프레션 언어의 내장 객체
[표 7-2] 익스프레션 언어의 내장 객체
자바빈
19/57
2. 익스프레션 언어의 기초 문법
 생존 범위 EL 내장 객체
 JSP 내장 객체들에 저장(바인딩)되어 있는 속성들의 맵 객체
• pageScope 내장 객체 : pageContext 내장 객체에 바인딩된 속성의 맵
• requestScope 내장 객체 : request 내장 객체에 바인딩된 속성의 맵
• sessionScope 내장 객체 : session 내장 객체에 바인딩된 속성의 맵
• applicationScope 내장 객체 : application 내장 객체에 바인딩된 속성의 맵
 주로 특정 생존 범위에 바인딩된 속성을 접근할 때에 사용
${CART}
모든 생존 범위
에 해당하는 내
장객체를 검색
${sessionScope.CART}
session 내장
객체만 검색
20/57
2. 익스프레션 언어의 기초 문법
 param 내장 객체
 웹 브라우저에서 <FORM> 엘리먼트를 통해 입력된 데이터를 가져올 때 사용
 사용 방법
• param 뒤에 마침표를 찍고 해당 데이터 이름을 쓰는 방법
• param 뒤에 대괄호를 치고, 그 안에 작은따옴표나 큰 따옴표로 묶은 데이터 이름을 쓰는 방법
${param[ “COLOR ”]}
${param.NUM}
입력 데이터의
이름
입력 데이터의
이름
 paramValues 내장 객체
 동일한 이름으로 여러 개의 데이터가 입력되는 파라미터을 접근할 때에 사용
 param 내장 객체의 데이터를 접근 하는 방법과 동일
 인덱스를 사용하여 특정 데이터를 접급
${paramValues.ANIMAL[0]}
입력 데이터 이
름
인덱스
${paramValues[ “ANIMAL ”][1]}
입력 데이터 이
름
인덱스
• EL 식의 인덱스가 0부터 시작하므로, 첫 번째 데이터 값을 가져오기 위해서는 인덱스를 0이라고
써야 하고, 두 번째 데이터 값을 가져오기 위해서는 1이라고 써야 한다.
21/57
2. 익스프레션 언어의 기초 문법
 param & paramValues 내장 객체
22/57
2. 익스프레션 언어의 기초 문법
 param & paramValues 내장 객체
 param과 paramValues 내장 객체를 사용하는 웹 애플리케이션을 작성해보자.
① 데이터를 선택하고 ‘확인’
버튼을 누르면
② 선택한 데이터가 나타납니
다.
[그림 7-5] 애완동물 웹 애플리케이션의 화면 설계
23/57
2. 익스프레션 언어의 기초 문법
 param & paramValues 내장 객체
 앞 두 화면을 HTML문서와 JSP 페이지로 구현하고, URL을 각각 다음과 같이 정한다.
http://localhost:8080/brain07/PetsInput.html
위쪽 화면의
URL
http://localhost:8080/brain07/PetsResult.jsp
아래쪽 화면의
URL
[예제 7-3] 데이터를 입력받는 HTML 문서
<HTML>
<HEAD>
<META http-equiv= “Content-Type ” content= “text/html;charset=euc-kr ”>
<TITLE>아이 러브 펫</TITLE>
</HEAD>
<BODY>
<FORM ACTION=PetsResult.jsp>
아이디: <INPUT TYPE=TEXT NAME=ID><BR><BR>
다음 중 회원님이 키우고 있는 애완동물을 선택하십시오.<BR><BR>
개<INPUT TYPE=CHECKBOX NAME=ANIMAL VALUE= “개 ”>
고양이<INPUT TYPE=CHECKBOX NAME=ANIMAL VALUE= “고양이 ”>
금붕어<INPUT TYPE=CHECKBOX NAME=ANIMAL VALUE= “금붕어 ”><BR><BR>
<INPUT TYPE=RESET VALUE= “취소 ”>
<INPUT TYPE=SUBMIT VALUE= “확인 ”>
</FORM>
</BODY>
</HTML>
24/57
2. 익스프레션 언어의 기초 문법
 param & paramValues 내장 객체
[예제 7-4] 입력된 데이터를 출력하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%>
<HTML>
<HEAD><TITLE>아이 러브 펫</TITLE></HEAD>
<BODY>
아이디: ${param.ID} <BR>
선택한 동물: ${paramValues.ANIMAL[0]}
${paramValues.ANIMAL[1]}
${paramValues.ANIMAL[2]}
</BODY>
</HTML>
① [예제 7-3]의 URL을 입력하
세요.
② 데이터를 선택하고 ‘확인’
버튼을 누르면
③ 결과 화면이 나타날 것입
니다.
25/57
2. 익스프레션 언어의 기초 문법
 header 내장 객체
 HTTP 요청 메시지에 포함된 HTTP 헤더 값을 접근할 때에 사용
 접근 표현식 작성 :
• header 객체의 이름 뒤에 마침표를 찍고 그 다음에 해당 헤더 이름을 쓰는 것
• header 객체의 이름 뒤에 대괄호를 치고 그 안에 따옴표로 묶은 헤더 이름을 표기
${header.Host}
HTTP 헤더 이
름
${header[ “User-Agent ”]}
HTTP 헤더 이
름
• 첫 번째 사용 방법의 제약 사항 - HTTP 헤더 이름이 자바의 식별자 명명 규칙을 따르지 않을 때
는 사용할 수 없다.
${header.User-Agent}
잘못된 EL 식
${header[ “User-Agent ”]}
올바른 EL 식
26/57
2. 익스프레션 언어의 기초 문법
 headerValues 내장 객체
 HTTP 요청 메시지 안에 똑같은 이름의 HTTP 헤더가 둘 이상 있을 때는 header 내장 객
체 대신 headerValues 내장 객체를 사용
 headerValues 내장 객체의 이름 뒤에 마침표나 대괄호를 이용해서 헤더 이름을 표시하고
, 그 다음에 대괄호로 묶은 인덱스를 표시해야 한다.
${headerValues.Accept[0]}
HTTP 헤더 이
름
인덱스
${headerValues[“User-data ”][1]}
HTTP 헤더 이
름
인덱스
27/57
2. 익스프레션 언어의 기초 문법
 cookie 내장 객체 (1)
 웹 브라우저가 웹 서버로 보낸 쿠키를 가져올 때 사용
 Dot(.) 연산자와 [] 연산자 모두 사용 가능
${cookie.CART}
쿠키의 이름
${cookie[ “USER_NAME ”]}
쿠키의 이
름
• 위 EL 식이 가져오는 것은 쿠키의 값이 아니라 쿠키 객체이므로, JSP 페이지 안에 이런 EL 식을
써 놓으면 사용자에게 아무 의미 없는 쿠키 객체의 참조 값만 출력될 것이다.
 쿠키를 가져오는 식 뒤에 마침표를 찍고 value라고 쓰거나, 대괄호를 치고 그 안에
‘value’또는 “value”라고 쓰면 쿠키 값이 출력된다.
${cookie.CART.value}
쿠키의 값을 가져오라는
표시
${cookie.CART[ “value ”]}
쿠키의 값을 가져오라는
표시
${cookie[ “CART ”][ “value ”]}
쿠키의 값을 가져오라는
표시
${cookie[ “CART ”].value}
쿠키의 값을 가져오라는
표시
28/57
2. 익스프레션 언어의 기초 문법
 cookie 내장 객체 (2)
 쿠키 객체 안에는 쿠키 값 외에도 쿠키가 속하는 도메인 이름, URL 경로명, 쿠키의 수명
같은 중요한 정보들이 들어 있다.
 그런 정보를 출력하기 위해서는 앞 페이지와 같은 형식의 EL 식에서 value라는 이름을
빼고 대신 domain, path, maxAge라는 이름을 써 넣으면 된다.
${cookie.CART.domain}
쿠키의 도메인 이름을 가져오라
는 표시
${cookie.CART[ “path ”]}
쿠키의 URL 경로명을 가져오라
는 표시
${cookie[ “CART ”][ “maxAge ”]}
쿠키의 수명을 가져오라는 표시
29/57
2. 익스프레션 언어의 기초 문법
 cookie 내장 객체 (3)
[예제 7-5] 쿠키 데이터를 가져다가 출력하는 EL 식의 예
쿠키 데이터를 저장하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ” %>
<%
Cookie cookie = new Cookie( “NAME ”, “John ”);
response.addCookie(cookie);
%>
<HTML>
<HEAD><TITLE>쿠키 데이터 저장 프로그램</TITLE></HEAD>
<BODY>
쿠키 값이 설정되었습니다.
</BODY>
</HTML>
쿠키 데이터를 웹 브
라우저
쪽에 저장합니다
쿠키 데이터 값을 출력하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ” %>
<HTML>
<HEAD><TITLE>쿠키 데이터 출력 프로그램</TITLE></HEAD>
<BODY>
NAME 쿠키 데이터의 값은? ${cookie.NAME.value}
</BODY>
</HTML>
쿠키 데이터의 값을 가져
와서 출력합니다
30/57
2. 익스프레션 언어의 기초 문법
 cookie 내장 객체 (4)
쿠키 데이터를 저장하는 JSP 페
이지의
URL을 입력하세요
쿠키 데이터를 출력하는 JSP 페
이지의 URL을 입력하세요
[그림 7-7] 예제 7-5의 실행 결과
31/57
2. 익스프레션 언어의 기초 문법
 initParam 내장 객체
 웹 애플리케이션의 초기화 파라미터 값을 접근할 때에 사용
 initParam 내장 객체의 이름 뒤에 마침표나 대괄호를 이용해서 해당 초기화 파라미터의
이름을 표시한다.
${initParam.DB_NAME}
웹 애플리케이션의 초기화 파라미터
이름
${initParam.[ “DB_NAME ”]}
웹 애플리케이션의 초기화 파라미터
이름
[예제 7-6] 웹 애플리케이션의 초기화 파라미터 값을 출력하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ” %>
<HTML>
<HEAD><TITLE>애플리케이션 초기화 파라미터 예제</TITLE></HEAD>
<BODY>
DB_NAME 초기화 파라미터의 값은? ${initParam.DB_NAME}
</BODY>
</HTML>
32/57
2. 익스프레션 언어의 기초 문법
 pageContext 내장 객체 (1)
 JSP 페이지의 주변 환경에 대한 정보를 제공
• JSP 내장 객체 papeContext와 동일
• 다른 EL 내장 객체는 맵 객체인 반면에 pageContext는 자바빈 객체임
 pageContext 내장 객체의 타입은 java.servlet.jsp.PageContext
• get으로 시작하는 이름의 메서드를 호출 가능
• 빈의 프로퍼티 이름을 이용하여 접근 가능
${pageContext.request}
getRequest 메서드를 가리키는 단
어
${pageContext[ “request ”]}
getRequest 메서드를 가리키는 단
어
– getRequest 메서드의 리턴값을 출력하는데, 그 값은 JSP 페이지의 request 내장 변수의 값과 동
일한 객체이므로 사용자에게 아무 의미도 없는 참조값만 출력된다.
33/57
2. 익스프레션 언어의 기초 문법
 pageContext 내장 객체 (2)
 다음과 같은 EL 식을 이용하면 JSP 페이지의 URL 경로명을 출력할 수 있다.
${pageContext.request.requestURI}
getRequestURI 메서드의 리턴값을 가져오는
단어
${pageContext[ “request ”][ “requestURI ”]}
getRequestURI 메서드의 리턴값을 가져오는
단어
${pageContext.request[ “requestURI ”]}
getRequestURI 메서드의 리턴값을 가져오는
단어
${pageContext[ “request ”].requestURI}
getRequestURI 메서드의 리턴값을 가져오는
단어
34/57
2. 익스프레션 언어의 기초 문법
 pageContext 내장 객체 (3)
[예제 7-7] pageContext 내장 객체의 사용 예
<%@page contentType= “text/html; charset=euc-kr ” %>
<HTML>
<HEAD><TITLE>PageContext 내장 개체의 사용 예</TITLE></HEAD>
<BODY>
요청 URL: ${pageContext.request.requestURI} <BR>
</BODY>
</HTML>
[그림 7-11] 예제 7-7의 실행 결과
35/57
3. 익스프레션 언어의 연산자
 EL 연산자
36/57
3. 익스프레션 언어의 연산자
 산술 연산자, 비교 연산자, 논리 연산자, 조건 연산자
 자바 연산자와 동일한 기능을 하는 연산자들에 대해 알아보자.
[예제 7-8] 익스프레션 언어의 연산자 사용 예 (1 )
<%@page contentType= “text/html; charset=euc-kr ” %>
<HTML>
<HEAD><TITLE>익스프레션 언어 연산자 연습</TITLE></HEAD>
<BODY>
X = ${param.NUM1}, Y = ${param.NUM2} <BR><BR>
X + Y = ${param.NUM1 + param.NUM2} <BR>
X - Y = ${param.NUM1 - param.NUM2} <BR>
X * Y = ${param.NUM1 * param.NUM2} <BR>
X / Y = ${param.NUM1 / param.NUM2} <BR>
X % Y = ${param.NUM1 % param.NUM2} <BR><BR>
X가 더 큽니까? ${param.NUM1 - param.NUM2 > 0} <BR>
Y가 더 큽니까? ${param.NUM1 - param.NUM2 < 0} <BR><BR>
X와 Y가 모두 양수입니까? ${(param.NUM1 > 0) && (param.NUM2 > 0)} <BR><BR>
X와 Y가 같습니까? ${param.NUM1 == param.NUM2? “예 ” : “아니오 ”} <BR><BR>
</BODY>
</HTML>
37/57
3. 익스프레션 언어의 연산자
 산술 연산자, 비교 연산자, 논리 연산자, 조건 연산자
 톰캣의 brain07 웹 애플리케이션 디렉터리에 Operators.jsp라는 이름으로 저장 후 실행
해 본다.
URL 뒤에 이런 식으
로
두 개의 수를 쓰세요.
[그림 7-12] 예제 7-8의 실행 결과
38/57
3. 익스프레션 언어의 연산자
 산술 연산자, 비교 연산자, 논리 연산자, 조건 연산자
 익스프레션 언어의 연산자 중에는 HTML 문법이나 JSP 문법에서도 특별한 의미를 갖는
기호를 사용하는 것이 있다.
 이런 기호들이 잘못 해석되는 것을 방지하기 위해 익스프레션 언어에서는 기호로 된 연
사자들과 똑같은 기능을 하는 영문 단어 연산자들을 추가로 만들어 놓고 있다.
[예제 7-9] 익스프레션 언어의 연산자 사용 예 (2)
<%@page contentType= “text/html; charset=euc-kr ” %>
<HTML>
<HEAD><TITLE>익스프레션 언어 연산자 연습</TITLE></HEAD>
<BODY>
${param.NUM1}을 ${param.NUM2}로 나눈 몫은? ${param.NUM1 div param.NUM2} <BR>
나머지는? ${param.NUM1 mod param.NUM2} <BR><BR>
둘 다 양수입니까? ${(param.NUM1 gt 0) and (param.NUM2 gt 0)} <BR>
둘 다 음수입니까? ${(param.NUM1 lt 0) and (param.NUM2 lt 0)} <BR>
</BODY>
</HTML>
39/57
3. 익스프레션 언어의 연산자
 산술 연산자, 비교 연산자, 논리 연산자, 조건 연산자
 앞 예제를 톰캣의 brain07 웹 애플리케이션 디렉터리에 CharOperators.jsp라는 이름으로
저장한 후 실행해 본다.
URL 뒤에 이런 식으
로
두 개의 수를 쓰세요.
[그림 7-13] 예제 7-9의 실행 결과
40/57
3. 익스프레션 언어의 연산자
 산술 연산자, 비교 연산자, 논리 연산자, 조건 연산자
 익스프레션 언어의 연산자 중에는 같은 모습으로 다른 기능을 하는 것도 있다.
${gender == “female”}
두 값이 같으면 true 다르면
false
${ “CAR” < “CAT”}
유니코드에 따른 사전식 비교.
CAR가 먼저이므로 true
${ “CAT” > “DOG”}
유니코드에 따른 사전식 비교.
CAT이 먼저이므로 false
[예제 7-10] 익스프레션 언어의 연산자 사용 예 (3)
<%@page contentType= “text/html; charset=euc-kr ” %>
<HTML>
<HEAD><TITLE>문자열 비교</TITLE></HEAD>
<BODY>
입력 문자열 : ${param.STR1}, ${param.STR2} <BR><BR>
두 문자열이 같습니까? ${param.STR1 == param.STR2} <BR>
어느 문자열이 먼저입니까? ${param.STR1 < param.STR2 ? param.STR1 : param.STR2}
</BODY>
</HTML>
41/57
3. 익스프레션 언어의 연산자
 산술 연산자, 비교 연산자, 논리 연산자, 조건 연산자
 앞 예제를 톰캣의 brain07 웹 애플리케이션 디렉터리에 StringOperators.jsp라는 이름으
로 저장한 후에 실행해 본다.
URL 뒤에 이런 식으
로
두 개의 수를 쓰세요.
[그림 7-13] 예제 7-9의 실행 결과
42/57
3. 익스프레션 언어의 연산자
 empty 연산자
 데이터의 존재 여부를 확인하는 단항 연산자
 피연산자인 데이터 이름은 empty라는 연산자 이름 뒤에 써야 한다.
${empty NAME}
데이터 이
름
[예제 7-11] 엠프티 연산자의 사용 예
<%@page contentType= “text/html; charset=euc-kr ” %>
<HTML>
<HEAD><TITLE>엠프티 연산자</TITLE></HEAD>
<BODY>
안녕하세요, ${empty param.ID ? “guest ” : param.ID}님
</BODY>
</HTML>
43/57
3. 익스프레션 언어의 연산자
 괄호 연산자
 여러 개의 연산자가 포함된 수학식에는 왼쪽에서부터 오른쪽으로 계산
 가감승제 연산자가 뒤섞여 있을 때는 곱셈, 나눗셈이 덧셈, 뺄셈보다 먼저 계산
 익스프레션 언어의 연산자에도 마찬가지로 우선순위가 있다.
• EL 식 안에 여러 개의 연산자가 있으면 왼쪽부터 오른쪽으로 순서대로 처리되지만, 우선순위가 다
른 연산자가 섞여 있으면 높은 우선순위의 연산자가 먼저 처리된다.
${2 + 3 * 4}
곱셈이 먼저 수행됩니
다
 우선순위를 바꾸기 위해서는 수학식과 마찬가지로 괄호를 사용하면 된다.
${(2 + 3) * 4}
덧셈이 먼저 수행됩니
다.
44/57
3. 익스프레션 언어의 연산자
 괄호 연산자
 익스프레션 언어의 연산자 우선 순위
우선순위
↑높음
연산자
[]
()
-(부호) ! not empty
* / % div mod
+< > <= >= it ht le ge
== != eq ne
&& or
|| or
↓낮음
?:
45/57
3. 익스프레션 언어의 연산자
 NULL 값 처리
 예외 처리를 하기 보다는 상황에 맞게 해석하여 처리
46/57
4. EL 함수 등록과 호출
 EL 함수
 자바 클래스의 정적 메서드를 EL 함수로 등록하여 호출 가능
 EL 함수를 사용하기 위해서는.tld 확장자를 갖는 TLD 파일에 등록해야 한다.
 TLD(Tag Library Descriptor) 파일
• 태그 라이브러리 기술자’를 의미
• web.xml 파일과 달리 하나의 웹 애플리케이션 디렉터리 내에 여러 개 존재 할 수 있다
• 루트 엘리먼트는 <tablib>가 되어야 하며 그 엘리먼트 안에 <tlib-version>과 <short-name>이라는
두 개의 서브엘리먼트를 반드시 정의하여야 한다.
<taglib>
<tlib-version>1.0</tlib-version>
<short-name>math</short-name>
</taglib>
태그 라이브러리의
버전
태그 라이브러리의
버전
47/57
4. EL 함수 등록과 호출
 자바의 정적 메서드를 EL 함수로 등록하는 방법
 TDL 파일에서 <taglib> 엘리먼트 아래에 <function>이라는 서브엘리먼트를 추가
 <function> 엘리먼트 안에 <name>, <function-class>, <function-signature>라는 3개의 서
브 엘리먼트를 추가
 <name> 엘리먼트 안에는 개발자가 정한 EL 함수의 이름을, <function-class> 안에는 EL
함수로 등록할 정적 메서드가 속하는 자바 클래스의 풀네임, <function-signature> 안에
는 그 메서드의 시그니처(메서드 이름, 리턴 타입, 파라미터 타입)을 작성
<taglib>
<tlib-version>1.0</tlib-version>
<short-name>math</short-name>
<function>
<name>squareroot</name>
<function-class>java.lang.Math</function-class>
<function-signature>double sqrt(double)</function-signature>
</function>
</taglib>
EL 함수의 이름
자바 클래스의 이름
정적 메서드의 시그
니처
• 위의 <function> 엘리먼트는 자바 표준 라이브러리에 있는 java.lang.Math 클래스의 sqrt 메서드를
squareroot라는 이름의 EL 함수로 등록한다.
48/57
4. EL 함수 등록과 호출
 TLD 파일 작성
 TLD 파일을 완성하려면 루트 엘리먼트는 <tablib> 안에 TLD 파일의 작성에 사용된 문
법의 식별자와 그 문법의 버전을 다음과 같이 기재해야 한다.
TLD 문법의 식
별자
TLD 문법의 버
전
<taglib xmlns= “http://java.sun.com/xml/ns/javaee ” version= “2.1 ” >
<tlib-version>1.0</tlib-version>
<short-name>math</short-name>
<function>
<name>squareroot</name>
<function-class>java.lang.Math</function-class>
<function-signature>double sqrt(double)</function-signature>
</function>
</taglib>
 TLD 파일을 완성한 다음에는 web.xml 파일에 등록하여 웹 컨테이너는 TLD 파일의 존재
를 인식하도록 한다.
49/57
4. EL 함수 등록과 호출
 TLD 파일 등록
 TLD 파일을 web.xml 파일에 등록하는 방법
• web.xml 파일의 루트 엘리먼트인 <web-app>안에 <taglib>라는 서브엘리먼트를 만들고, 그 안에
<taglib-uri>와 <taglib-location>이라는 2개의 서브엘리먼트를 만든다. 그 두 엘리먼트 안에 각각
TLD 파일의 식별자로 사용할 URI와 TLD 파일의 경로명을 쓴다.
TLD 파일의 식별
<web-app ... >
자
<taglib>
<taglib-uri>http://hanb.co.kr/brain07/math-functions.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/math-functions.tld</taglib-location>
</taglib>
TLD 파일의 경
</web-app>
로명
 <taglib-url> 엘리먼트에는 다음과 같이 상대 URI을 쓸 수도 있다.
TLD 파일의 식별
<web-app ... >
자
<taglib>
<taglib-uri>/math-functions.tld</taglib-uri>
<taglib-location>tlds/math-functions.tld</taglib-location>
</taglib>
TLD 파일의 경
</web-app>
로명
50/57
4. EL 함수 등록과 호출
 EL 함수 호출
 JSP 페이지 안에서 EL 함수를 호출하기 위해서는 우선 taglib 지시자를 써야 한다.
<%@taglib uri= “http://hanb.co.kr/brain07/math-functions.tld ” prefix= “m ” %>
TLD 파일의
URI
접두
어
• JSP 페이지 안에 taglib 지시자를 쓰고 나면 prefix 애트리뷰트에 지정된 접두어를 이용해서 해당
TLD 파일에 등록되어 있는 EL 함수를 호출할 수 있다.
 EL 함수를 호출하는 EL 식
• 제일 먼저 접두어를 쓰고, 그 다음에 콜론(:)를 쓰고, 그 다음 EL 함수 이름과 파라미터를 다음과
같이 쓴다.
${m:squareroot(4)}
접두
어
함수 이
름
파라미터
51/57
4. EL 함수 등록과 호출
 EL 함수 호출
[예제 7-17] 자바의 정적 메서드를 호출하는 EL 식의 예 (1 )
<%@page contentType= “text/html; charset=euc-kr ”%>
<%@taglib prefix= “m” uri= “http://hanb.co.kr/brain07/math-functions.tld ”%>
<HTML>
<HEAD><TITLE>제곱근 구하기</TITLE></HEAD>
<BODY>
${param.NUM}의 제곱근은? ${m:squareroot(param.NUM)} <BR>
</BODY>
</HTML>
URL 뒤에 이런 식으로 직
접 NUM 데이터의 값을 쓰
세요.
[그림 7-23] 예제 7-17의 실행 결과
52/57
4. EL 함수 등록과 호출
 사용자 정의 정적 메서드 호출
 익스프레션 언어를 이용하면 사용자 정의 자바 클래스의 정적 메서드도 호출할 수 있다.
[예제 7-18] 정적 메서드를 포함하는 자바 클래스
package util;
public class MyMath {
public static int sum(int start, int end) {
int sum = 0;
for (int cnt = start; cnt <= end; cnt++)
sum += cnt;
return sum;
}
}
53/57
4. EL 함수 등록과 호출
 사용자 정의 정적 메서드 호출
 예제 7-18의 메서드를 EL 식을 통해 호출하기 위해서는 이 클래스를 컴파일해서 다음
과 같은 방법으로 설치해야 한다.
③ 컴파일 결과를 util 디렉터
리에
저장하세요
① brain07/WEB-INF/classes 디렉터리 안
에
[예제 7-18]의 패키지 이름에 해당하는
util 서브디렉터리를 만드세요
② [예제 7-18]을 컴파일하
세요..
54/57
사용자 정의 정적 메서드 호출
 사용자 정의 정적 메서드 호출
② TLD 파일을 열어서 다음과
같은 <function> 엘리먼트를
추가하세요
① brain07/WEB-INF/tlds
디렉터리로 가세요.
[예제 7-18]의 sum 메서드
를
EL 함수로 등록하는 엘리먼
트
55/57
사용자 정의 정적 메서드 호출
 사용자 정의 정적 메서드 호출
[예제 7-18] 자바의 정적 메서드를 호출하는 EL 식의 예 (2)
<%@page contentType= “text/html; charset=euc-kr ”%>
<%@taglib prefix= “m” uri= “http://hanb.co.kr/brain07/math-functions.tld ”%>
<HTML>
<HEAD><TITLE>주어진 범위의 합 구하기</TITLE></HEAD>
<BODY>
${param.NUM1}부터 ${param.NUM2}까지의 합은? <BR><BR>
답: ${m:total(param.NUM1, param.NUM2)}
</BODY>
</HTML>
[그림 7-26] 예제 7-19의 실행 결과
56/57
JSP & Servlet