EL이란?

김병철·2022년 11월 22일
0

EL

목록 보기
1/2

# Expression Language

기존에 사용했던 JSP 표현식(출력식)

<%=name %>

위와 같은 표현식을 EL을 사용하여 더 쉽게 표현하여 작성한다.

1. EL 기본 구문

# JSP 구성인자

  1. JSP 스크립팅 원소 : JSP 페이지에서 자바코드를 직접 기술할 수 있게 하는 기술
    ex) 선언문, 스크립틀릿, 표현식
  1. 지시어 : JSP 페이지 정보에 대한 내용을 표현하거나 또다른 페이지를 포함할 때 사용
    ex) page 지시어, include 지시어, taglib 지시어(라이브러리 추가)
  1. JSP Action Tag : XML 기술을 이용하여 기존의 JSP 문법을 확장하는 기술을 제공하는 태그
    • 표준 액션 태그 : JSP 페이지 내에서 지원하는 기능 표준 액션태그는 모든 태그명 앞에 jsp: 라는 접두어가 붙는다
    • 커스텀 액션 태그 : JSP 페이지 내에서 바로 사용 불가능(연동 필요)
      모든 커스텀 태그는 태그명 앞에 jsp: 외의 다른 접두어가 붙는다(여러가지 접두어가 있음)
      제공되고 있는 대표적인 유용한 라이브러리(JSTL)

# 기존방식과 EL의 차이

  • 데이터 준비

    서블렛에서 데이터 준비한 코드

// request scope에 값 담기
request.setAttribute("classRoom", "E강의장");
request.setAttribute("student", new Person("학생이름", 22, "남자") );

// session scope에 담기
HttpSession session = request.getSession();
session.setAttribute("academy", "KH정보교육원");
session.setAttribute("teacher", new Person("선생이름", 24, "남자") );

Person클래스의 필드를 확인하고 student와 teacher에 사용된다.

private String name;
private int age;
private String gender;

jsp 파일에서 데이터를 꺼내는 방식의 차이를 확인한다.

  • 기존 방식
// request scope에 담긴 값 꺼내기
String classRoom = (String)request.getAttribute("classRoom");
Person student = (Person)request.getAttribute("student");
		
// session scope에 담긴 값 꺼내기
String academy = (String)session.getAttribute("academy");
Person teacher = (Person)session.getAttribute("teacher");
학원명 : <%=academy %>
강의장 : <%=classRoom %>
강사 정보 : <%=teacher.getName() %>, <%=teacher.getAge() %>, <%=teacher.getGender() %>
수강생 정보 : <%=student.getName() %>, <%=student.getAge() %>, <%=student.getGender() %>
  • 출력 :

기존 방식에 비해 EL방식은 어떤 차이가 있는지 알아본다.

EL은 getXXX를 통해 값을 꺼내지 않고 key값만 제시하면 바로 접근한다.

내부적으로 해당 scope영역에 있는 key값의 value를 꺼내올 수 있다.

기본적으로 EL은 jsp 내장 객체를 구분하지 않고

자동적으로 모든 내장객체의 key값을 검색하여 존재할 경우 값을 꺼낸다.

학원명 : ${academy}
강의장 : ${classRoom}
강사 정보 : ${teacher.name}, ${teacher.age}, ${teacher.gender}
수강생 정보 : ${student.name}, ${student.age}, ${student.gender}

값을 얻고자 하는 객체의 필드명(teacher.name)으로 접근하면

내부적으로 getter메소드가 실행되어 해당하는 값을 꺼낼 수 있다.

getter메소드 필수이다.


# EL로 값을 꺼낼 때 '없는 값'을 꺼낸다면?

Person클래스에 height 필드는 없다.

${teacher.height}

위와 같이 없는 값을 출력하려하면 다음과 같은 에러가 뜬다.

[height] 특성이 [com.kh.model.vo.Person] 유형에 없습니다.

getter메소드가 없을 때 값을 꺼내려고 하면?

속성을 읽을 수 없다는 에러가 뜬다.


# scope확인

scope확인을 위해 서블렛에서 데이터를 준비한 것을 확인한다.

  • 데이터 준비 :
// request영역과 session 영역에 동일한 키값으로 값을 넣어보자
request.setAttribute("scope", "request영역");
session.setAttribute("scope", "session영역");

// application scope에 값 담기
ServletContext app = request.getServletContext();
app.setAttribute("scope", "application영역");

scope 값을 꺼냈을 때 어떤 영역의 scope가 출력되는지 확인한다.

스코프 : ${scope}
  • 출력 :
스코프 : request영역

가장 가까운 영역인 request영역의 값이 출력되는 것을 확인한다.

만약 모든 영역에서 값을 못찾는다면

${nothing}일 때는 오류가 나지 않고 출력도 되지 않는다.

key값이 동일할 때 원하는 영역의 값을 꺼내려면

pageScope에 담긴 값 : ${scope} 또는 ${pageScope.scope}
requestScope에 담긴 값 : ${requestScope.scope}
sessionScope에 담긴 값 : ${sessionScope.scope}
applicationScope에 담긴 값 : ${applicationScope.scope}
다른 영역의 데이터 꺼내기  :: $ {applicationScope.classRoom} : ${applicationScope.classRoom}
다른 영역의 데이터 꺼내기  :: $ {requestScope.classRoom} : ${requestScope.classRoom}
  • 출력 결과 :
pageScope에 담긴 값 : page scope 영역 또는 page scope 영역
requestScope에 담긴 값 : request영역
sessionScope에 담긴 값 : session영역
applicationScope에 담긴 값 : application영역

다른 영역의 데이터 꺼내기  :: $ {applicationScope.classRoom} : 
다른 영역의 데이터 꺼내기  :: $ {requestScope.classRoom} : E강의장

각 영역에 담긴 값에 출력되는 것을 확인할 수 있다.

또한 다른 영역의 데이터를 꺼낼 때 해당 값이 없다면 출력이 되지 않는다.


profile
keep going on~

0개의 댓글