이전글


표현 언어(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값1로 변환한다.  ex) member를 실제 참조되는 Member객체의 참조값으로 변경
  2. 값1null이면 null을 리턴한다.  ex) member가 null이면 해석을 멈추고 null을 리턴
  3. 값1null이 아니면 <표현2><값2>로 변환한다.
  4. 값1Map, List, 배열인 경우
    1. 값1Map인 경우
      1. 값1.containsKey(값2)false이면 null을 리턴한다.
      2. true이면 값1.get(값2)를 실행학 결과를 리턴한다.
    2. 값1List배열인 경우
      1. 값2index를 표현하는 정수인지 검사하고 정수가 아니면 예외 발생.
      2. 값1.get(값2) 또는 Array.get(값1, 값2)를 실행하고 결과를 리턴한다.
  5. 값1이 그 밖의 일반 객체이면
    1. 값2를 문자열로 변환한다.
    2. 값1 객체가 값2에 해당하는 멤버변수를 가지고 있다면 해당 멤버변수의 getter 메서드를 호출하여 반환값을 리턴한다. bean규약에 맞는 getter가 없는 경우 컴파일시 오류 발생.
    3. 그렇지 않은 경우 예외 발생

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 웹 프로그래밍 기초부터 중급까지


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,