EL표현식

2 minute read



EL표현식이란?

  • jsp파일에 다양한 언어가(html, javascript, java 등) 섞이면서 코드해석이 불편해졌다.

$ { expr }

  • 형식으로 사용하고, expr은 자바의 변수가 아니다!





EL에서 사용하는 연산자

  • 키워드 연산자(div, mod, ne, eq …) 를 지원한다.
  • 개발자도구에서는 EL코드를 확인 할 수 없다. (값만 보임)
  • 서버에서 해석하기 때문에 해석 못하면 500에러가 나타남
연산자 종류
산술연산자 +, -, *, div, %, mod
비교연산자 ==, eq, !=, ne, <, lt, <=, le, >, gt, >=, ge
논리연산자 &&, and, ||, or, !, not
empty 연산자 empty
값이 null이면 true
비어있는 문자열이면 true(‘‘도 empty)
배열이나 콜렉션일 경우 길이가 0이면 true
삼항연산자 (조건식)? 값1 : 값2
조건식이 참이면 값1, 거짓으면 값2선택





EL에서 객체 찾기 1

  • ${ id(객체이름) } 일때 EL의 내장객체 이름과 같은지 확인 후, 있으면 실행하도록 한다.

    param

  • request.getParameter(“id”)를 대체한다.
  • url이 ?id=aaa&name=bbb 일때 객체에 접근하는 방법

<h2>jsp 표현식</h2>
id : <%= request.getParameter("id") %><br>
name : <%= request.getParameter("name") %><br>
  
<h2>jsp EL표현식</h2>
el-id : ${ param.id }<br>
el-name : ${ param.name }<br>

  • param객체 뒤에 찾고자하는 name을 붙인다.


paramValues

  • request.getParameterValues(“id”)를 대체한다.
  • url이 ?id=aaa&name=bbb&hobby=music&hobby=movie 일때 객체에 접근하기

<h2>jsp 표현식</h2>
<% String[] hb = request.getParameterValues("hobby"); %>
hobby : <%= hb[0] %>, <%= hb[1] %><br>
  
<h2>jsp EL표현식</h2>
el-hobby : ${ paramValues.hobby[0] }, ${ paramValues.hobby[1] }

  • 여러개의 값을 받을 경우 paramValues로 받아서 인덱스를 입력한다.
  • jsp 기존 표현식과 차이점은 값이 안들어왔을 때 에러가 발생하지 않고 비워둔다는 점(empty). (장점)





EL에서 객체 찾기 2

  • EL에서 객체 찾는 순서
    1. EL이 가진 객체 이름 조회 (동일한 것)
    2. 없으면 공유영역 4가지를 조회
    3. 객체가 등록되어 있지 않다면 empty상태
      • 객체 등록 : JSP문법으로 등록한다. (공유영역명.getAttribute, removeAttribute, setAttribute(“이름”))


공유 영역

  • jsp와 변수를 공유하기 위한 4가지 영역
  • 같은 공유영역이지만 EL에서 부르는 명칭과 jsp에서 부르는 명칭이 다르다.
EL JSP 영역설명
pageScope pageContext 하나의 파일에서 등록시킨 객체를 동일 파일 내에서만 접근할 수 있는 영역
requestScope request 하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 한 번 응답 후 사라짐.)
sessionScope session 하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 여러 번 응답해도 계속 기억.)
applicationScope application 여러 사용자가 요청하고 응답해도 기억하는 영역 (호스트 이름을 기억하는 용도로 주로 쓰임)
  • jsp변수를 공유영역에 올려야 EL에서 객체를 찾을 수 있다.
  • 우선순위 : pageContext -> request -> session -> application





EL에서 공유영역의 객체에 접근하기


${ 객체.이름 }

  • 객체 자리에 올 수 있는 타입 : 자바빈즈클래스, 맵객체
    • 자바빈즈클래스?
    • 패키지로 선언
    • 클래스는 public 선언
    • 매개변수 없는 생성자 선언
    • 멤버변수는 private 선언
    • 멤버변수에 대한 setter, getter 메소드 존재
    • 디폴트 생성자 선언

package kr.ac.kopo.board;

public class BoardVO {

  private int no;
  private String title;
  private String writer;
  private String regDate;

  public BoardVO(int no, String title, String writer, String regDate) {
    super();
    this.no = no;
    this.title = title;
    this.writer = writer;
    this.regDate = regDate;
  }

  public BoardVO() {
    super();
    // TODO Auto-generated constructor stub
  }
  public int getNo() {
    return no;
  }
  public void setNo(int no) {
    this.no = no;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getWriter() {
    return writer;
  }
  public void setWriter(String writer) {
    this.writer = writer;
  }
  public String getRegDate() {
    return regDate;
  }
  public void setRegDate(String regDate) {
    this.regDate = regDate;
  }

  @Override
  public String toString() {
    return "BoardVO [no=" + no + ", title=" + title + ", writer=" + writer + ", regDate=" + regDate + "]";
  }
}


  • 객체 타입이 자바빈즈인 경우

<%
BoardVO b = new BoardVO();
pageContext.setAttribute("board", b);
%>
  
${ board.no }
  
  • BoardVO객체의 멤버변수 no에 접근할 수 있음.
  • ${board.aaa}는 없으므로 500에러가 나게됨!