춘식이왔엉 2022. 7. 28. 21:36

 EL은 데이터를 출력하기 위한 언어로서 문법이 직관적으로 사용하기 쉽게 구성이 되어있다.

일반적으로 JSP에서는 변수를 출력할 때 변수선언과 초기화가 반드시 필요하지만 EL은 그러한 과정 없이 바로 사용이 가능하고 null값 처리가 쉽다.

따라서 다양한 형태로 저장된 데이터를 효율적으로 처리할 수 있는 장점이 있다. 다양한 형태란 것은 Map형식, List 형식, 배열 형식, 자바빈(JavaBeans)등과 같은 형태를 의미한다.

 

* EL언어의 문법: ${ EL변수 }

* EL변수란 무엇인가? 또한, 무엇이 EL변수로 지정가능한가?


  (1) 4개의 공유영역에 바인딩 되어있는 공유속성명 (***)
      (이거야말로, 진짜 EL스펙상 나오는 EL변수임)

    <%-- 사용법: ${ 공유속성명 } : EL은 지정된 공유속성을 가장 짧은 공유영역을 시작으로
         가장 긴 공유영역 순으로 찾아들어감 : page > request > session > application --%>
    pageScope : ${ __PAGE__ }</li>
    requestScope: ${ __REQUEST__ }</li>
    sessionScope: ${ __SESSION__ }</li>
    applicationScope: ${ __APPLICATION__ }</li>
    
    <!-- 없는 공유속성을 EL변수로 지정하면, 빈문자열(Empty String) 출력 -->
    Unknown Shared Attribute: ${ __TTT__ }</li>

 

 (2) EL의 내장객체

    <!-- EL변수로 내장객체 사용: 각공유영역Scope.공유속성명 -->
    <li>pageScope : ${ pageScope.__PAGE__ }</li>
    <li>requestScope: ${ requestScope.__REQUEST__ }</li>
    <li>sessionScope: ${ sessionScope.__SESSION__ }</li>
    <li>applicationScope: ${ applicationScope.__APPLICATION__ }</li>

    <!-- EL변수로 내장객체 사용: param.전송파라미터명 -->
    <li>param.name  : ${ param.name  }</li>
    <li>param.age   : ${ param.age   }</li>
    <li>param.hobby#1 : ${ param.hobby }</li>
    <li>param.hobby#2 : ${ Arrays.toString( paramValues.hobby ) }</li>

    <!-- EL변수로 내장객체 사용: header.요청메시지헤더명 -->
    <li>header.Connection : ${ header.Connection }</li>
    <li>header.Accept : ${ header.Accept }</li>

    <!-- EL변수로 내장객체 사용: cookie.요청메시지쿠키명 -->
    <li>cookie.JSESSIONID.getValue() : ${ cookie.JSESSIONID.getValue() }</li>

    <!-- web.xml 파일에 등록된 context 초기화 파라미터 획득 및 출력 : -->
    <!-- initParam.Context초기화파라미터명 -->
    <li>initParam.driver: ${ initParam.driver }</li>
    <li>initParam.jdbcUrl: ${ initParam.jdbcUrl }</li>
    <li>initParam.user: ${ initParam.user }</li>
    <li>initParam.pass: ${ initParam.pass }</li>

    <!-- EL변수로 내장객체 사용법: pageContext.getter메소드명.getter메소드명 -->
    <!-- 1. 아래는 다음과 같음: pageContext.getRequest().getRequestURI() 리턴값 출력 -->
    <li>pageContext #1 : ${ pageContext.request.requestURI }</li>
    <!-- 2. 아래는 다음과 같음: pageContext.getRequest().getSession().getId() 리턴값 출력 -->
    <li>pageContext #2 : ${ pageContext.request.session.id }</li>


  (3) JSTL의 문법상, 만들어지는 EL변수





* 특정 공유영역에 바인딩 되어있는 공유속성이
  아래와 같은 다양한 타입의 객체라면, 어떻게 ${ } 문법으로, 위 객체들을 출력할 수 있는가!?

   (1) "자바빈즈" 객체
        ${ 공유속성.프로퍼티명 } / ${ 공유속성명.getter메소드호출 }

1. LoginBean.userid: ${ loginBean.userid } == ${ loginBean.getUserid() } <br>
2. LoginBean.passwd: ${ loginBean.passwd } == ${ loginBean.getPasswd() }



   (2) Map 객체
        ${ 공유속성.KEY } / ${ 공유속성명.get(key) 메소드호출 }

<%
    Map<String, Object> map = new Hashtable<>();
    map.put("KEY_1", "VALUE_1");
    map.put("KEY_2", "VALUE_2");
    map.put("KEY_3", "VALUE_3");

    session.setAttribute("__MAP__", map);
%>

1. map : ${ __MAP__ } <br>
2. KEY_1 : ${ __MAP__.KEY_1 }, ${ __MAP__.get("KEY_1") } <br>
3. KEY_2 : ${ __MAP__.KEY_2 } <br>
4. KEY_3 : ${ __MAP__.KEY_3 } <br>



   (3) 배열 객체
          ${ 공유속성[인덱스번호] }

<%
    int[] arr = { 1, 2, 3 };

    pageContext.setAttribute("__ARRAY__", arr);
%>

1. arr: ${ __ARRAY__ } <br>
2. arr[0] : ${ __ARRAY__[0] } <br>
3. arr[1] : ${ __ARRAY__[1] } <br>
4. arr[2] : ${ __ARRAY__[2] } <br>



   (4) List 컬렉션
          ${ 공유속성[인덱스번호] } / ${ 공유속성명.get(인덱스번호) 메소드호출 }

<%
    List<Double> list = Arrays.<Double>asList(.1, .2, .3);

    application.setAttribute("__LIST__", list);
%>

1. list: ${ __LIST__ } <br>
2. list[0] : ${ __LIST__[0] }, ${ __LIST__.get(0) } <br>
3. list[1] : ${ __LIST__[1] } <br>
4. list[2] : ${ __LIST__[2] } <br>


   (5) 사용자 정의 객체
       ${ 공유속성.값을반환하는메소드호출 }

<%
    class Person {  // Local Class 
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        } // constructor

    } // end class

    Person person = new Person("Choonsik", 28);
    request.setAttribute("__PERSON__", person);
%>