이전글
표현 언어(EL)의 객체접근
글의 제목은 일반객체라고 표현하긴 했지만 표현언어(Expression Language)에서는 내장객체나 scope 객체, Bean규약에 맞게된 빈 객체등의 특정 객체에 속성에 접근할때 "." 연산자를 통해 쉽게 접근할 수 있습니다. 추가적으로 접근 객체의 타입이
Map
인 경우에도 동일한 표기법으로 접근이 가능합니다.${cookie.name} ${member.email} | cs |
또한 "."연산자와 더불어
javascript
의 []
연산자를 사용하여 접근하는것도 가능합니다.${cookie['name']} ${member['email']} | cs |
만약 접근하는 속성이 객체이고 해당 객체의 속성에 접근하는 경우 다음과 같이 "." 연산자를 여러번 사용하면 됩니다.
${member.addr.zipcode} | cs |
접근하는 속성이
배열
이나 List
인 경우 [index]
형태로 접근이 가능합니다.멤버의 첫번째 취미 : ${member.hobbies[0]} | cs |
표현 언어(EL)의 객체접근 구문 해석 절차
JSP 엔진이 EL을 통해 객체의 속성에 접근하는 구문을 해석할때는 다음과 같은 절차를 거치게 됩니다.
<표현1>.<표현2> 또는 <표현1>['표현2'] -> <값1>.<값2> | cs |
표현1
을값1
로 변환한다. ex) member를 실제 참조되는 Member객체의 참조값으로 변경값1
이null
이면null
을 리턴한다. ex) member가 null이면 해석을 멈추고 null을 리턴값1
이null
이 아니면<표현2>
를<값2>
로 변환한다.값1
이Map
,List
,배열
인 경우값1
이Map
인 경우값1.containsKey(값2)
가false
이면null
을 리턴한다.true
이면값1.get(값2)
를 실행학 결과를 리턴한다.값1
이List
나배열
인 경우값2
가index
를 표현하는 정수인지 검사하고 정수가 아니면 예외 발생.값1.get(값2)
또는Array.get(값1, 값2)
를 실행하고 결과를 리턴한다.값1
이 그 밖의 일반 객체이면값2
를 문자열로 변환한다.값1
객체가값2
에 해당하는 멤버변수를 가지고 있다면 해당 멤버변수의getter 메서드
를 호출하여 반환값을 리턴한다.bean규약
에 맞는 getter가 없는 경우 컴파일시 오류 발생.- 그렇지 않은 경우 예외 발생
5-2 과정에서 말한 자바 bean 규약에 대해 궁금하신분은 아래 링크를 참고해 주시기 바랍니다.
실습 예제
앞서 배운 내용을 바탕으로 여러가지 타입의 객체에 대해서 EL이 어떤식으로 접근하는지 실습을 통해 알아보겠습니다. 예제 GIT 주소
먼저 Bean 규약에 맞게 작성된
MemberBean.java
를 하나 작성해줍니다.package vo; public class MemberBean { public String name; public String[] hobbies; public String getName() { return name; } public void setName(String name) { this.name = name; } public String[] getHobbies() { return hobbies; } public void setHobbies(String[] hobbies) { this.hobbies = hobbies; } } | cs |
다음은
elObjCollection.jsp
입니다.<%@page import="java.util.HashMap"%> <%@page import="java.util.Map"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@page import="vo.MemberBean"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% //Bean 객체 MemberBean mem = new MemberBean(); mem.setName("dololak"); mem.setHobbies(new String[] {"블로그", "운동", "공부", "영화"}); //List List<Integer> numberList = new ArrayList(); numberList.add(1000); numberList.add(2000); numberList.add(3000); //Map Map<String, Long> score = new HashMap(); score.put("kim", 80L); score.put("lee", 90L); score.put("park", 100L); //pageScope에 저장 pageContext.setAttribute("mem", mem); pageContext.setAttribute("numberList", numberList); pageContext.setAttribute("score", score); %> <html> <head> <title>EL에서의 객체 및 컬렉션 사용</title> </head> <body> 이름은 : ${mem.name} <br/> 이름은2 : ${mem['name']} <br/> 이름은3 : ${mem.getName()} <br/> 취미는 : ${mem.hobbies[0]} <br/> 숫자1 : ${numberList[0]} <br/> 숫자2 : ${numberList[2]} <br/> kim 점수 : ${score['kim']}<br/> park 점수 : ${score.park} </body> </html> | cs |
테스트 결과
테스트 결과는 다음과 같습니다. 참 쉽죠?
EL에서 메서드 호출
JSP 2.2
/ EL 2.2
버전부터는 EL에서 객체의 메서드를 호출하는것이 가능해졌습니다.(그 이전 버전에서는 컴파일시 오류가 발생합니다)멤버빈의
name
을 얻을때 mem.name
으로 참조할수도 있지만 다음과 같이 mem.getName()
으로 직접 메서드 호출을 통해 값을 얻을수도 있습니다.이름은3 : ${mem.getName()} | cs |
위 예제에서는 메서드의 반환값이 있어 해당 값을 출력했지만 반환 타입이
void
인 메서드도 호출이 가능하며 출력되는 내용이 없다는 점이 다릅니다.다음글
참고서적
최범균저 - JSP 2.3 웹 프로그래밍 기초부터 중급까지
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] JSP 2.0 커스텀 태그 관련 API (0) | 2019.08.09 |
---|---|
[서블릿/JSP] TLD(Tag Library Descriptor)란? tld 파일 작성 방법 (0) | 2019.08.09 |
[서블릿/JSP] 표현 언어(EL)의 내장객체 사용법 (0) | 2019.08.07 |
[서블릿/JSP] 표현 언어(EL)의 연산자 규칙 및 사용법. (0) | 2019.08.06 |
[서블릿/JSP] 표현 언어(EL) 기본 사용법 및 자료형 설명 (0) | 2019.08.06 |