ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • EL(Expression Language)과 객체 사용
    백엔드/서블릿&JSP 2021. 1. 14. 19:16

    2021/01/14 - [백엔드/서블릿&JSP] - EL(Expression Language)란?

     

    EL(Expression Language)란?

    EL이란? EL이란 Expression Language의 약자로서 JSP에서 자바코드를 더욱 간결하게 하기 위해 만들었다. 어떻게보면 완벽하게 자바 코드를 JSP에서 걷어내고 EL을 통해 가독성을 높이고자 한 것이다. 다

    sgcomputer.tistory.com

     

    이전에 EL에 대해서 다룬 글에서는 EL의 기본적인 표현식과 연산자들에 대해서 알아봤다.

     

    다양한 연산을 간략하게 표현할 수 있어 가독성이 높아지는 장점이 있다.

     

    그렇다면 이번에는 EL을 통해서 객체를 다루는 방법을 알아보자.

     

    EL은 이전 글에서 다뤘듯 서블릿이나 다른 리소스에서 전달되는 값들을 받아서 표현할 수 있다.

     

    예시에서는 request를 통한 코드만 보여줬는데 실제로는 굉장히 다양한 객체의 값을 받을 수 있다.

     

    EL에서 자주 쓰는 데이터 전송을 위한 표현은 아래와 같다.

     

    객체명

    사용법

    설명

    pageScope

    ${pageScope.지정된 속성명}

    page 영역에 있는 같은 이름을 가진 속성 값

    requestScope

    ${requestScope.지정된 속성명}

    request 영역에 있는 같은 이름을 가진 속성 값

    sessionScope

    ${sessionScope.지정된 속성명}

    session 영역에 있는 같은 이름을 가진 속성 값

    applicationScope

    ${applicationScope.지정된 속성명}

    application 영역에 있는 같은 이름을 가진 속성 값

    param

    ${param.지정된 속성명}

    request로 전달된 파라미터 값

    paramValues

    ${paramValues.속성명[index]}

    request로 전달된 파라미터 값 배열 조회

    header

    ${header.헤더이름}

    헤더 값 조회

    headerValues

    ${header.지정된 속성명}

    헤더 값 배열 조회

    cookie

    ${cookie.쿠키이름}

    쿠키 조회

    initParam

    ${initparam.파라미터명}

    어플리케이션 초기화 할 때 입력한 매개변수 값

    pageContext

    ${pagecontext}

    페이지 컨텍스트 객체를 통해 다른 객체 값 얻음

    일반적인 데이터 저장과 로드

    두개의 jsp파일이 있다. 첫번째 jsp 파일 코드는 데이터 전송을 위해 객체에 문자열을 저장한다.

     

    두번째 jsp 파일 코드은 첫번째 jsp 파일로부터 흐름을 전달받아서 출력한다.

     

    첫번째 jsp 파일

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1> 첫번째 jsp 파일 </h1>
    	<%
    	request.setAttribute("re", "리퀘스트에 저장");
    	session.setAttribute("se", "세션에 저장");
    	application.setAttribute("ap", "어플리케이션에 저장");
    	%>
    	
    	<%
    	pageContext.forward("NewFile4.jsp");
    	%>
    </body>
    </html>

     

    두번째 jsp 파일

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1> 두번째 jsp 파일 </h1>
    	
    	<p>리퀘스트: ${re}</p>
    	<p>세션: ${se} </p>
    	<p>어플리케이션: ${ap}</p>
    	
    </body>
    </html>

     

    위 두 개의 코드를 실행하면 아래와 같이 나온다.

     

    두번째 코드와 실행 내역을 보면 알겠지만 아래와 같이 EL 태그를 사용하면

     

    속성명만 써도 데이터 출력이 가능하다.

     

    	<p>리퀘스트: ${re}</p>
    	<p>세션: ${se} </p>
    	<p>어플리케이션: ${ap}</p>

     

    즉 application, session, request든 setAttribute로 저장된 데이터는 속성명만 가지고도 사용이 가능하다.

     

    일반적으로는 이렇게 사용하면 되지만, 가끔 문제가 발생할 수 있다.

     

    다름 아니라 각각의 객체(request, session, application)에 저장된 속성명이 같을 때 문제가 생긴다.

    Scope의 존재

    각각 객체에서 저장된 속성명이 같을 때를 가정하고 코드를 수정해보자.

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1> 두번째 jsp 파일 </h1>
    	<%
    	request.setAttribute("test", "리퀘스트에 저장");
    	session.setAttribute("test", "세션에 저장");
    	application.setAttribute("test", "어플리케이션에 저장");
    	%>
    	
    	<%
    	pageContext.forward("NewFile4.jsp");
    	%>
    </body>
    </html>

     

    각 객체에 같은 속성명으로 다른 문자열을 저장했다. 이제 결과가 어떻게 나올까?

     

    결과물은 우리가 이전에 확인했던 결과와는 전혀 다르게 나왔다.

     

    request 객체에 저장된 문자열만 원하던대로 나오고 나머진 그렇지 못하다.

     

    이는 EL이 데이터를 로드할 때 Scope라는 것을 참고하기 때문이다.

     

    Scope는 범위라는 말로서 EL은 작은 범위에서 데이터를 확인하고 점차 큰 범위의 데이터로 나아간다.

     

    아래 그림을 보면서 설명을 보면 이해하기가 나을 것이다.

     

     

    EL은 위 그림과 같은 순서로 각 객체의 데이터를 확인한다.

     

    즉 4개의 객체가 같은 속성명을 가지고 있다면 EL은 가장 작은 단위의 Scope인 Page 객체에

     

    저장된 속성명을 우선적으로 출력한다.

     

    위 예시에서는 request 객체가 가장 단위였기 때문에 request 객체에 저장된 문자열을 출력한 것이다.

     

    그렇다면 객체별로 같은 속성명을 가지고 있어도 EL이 객체별로 다른 결과를 가져오게 할 수 있을까?

     

    그럴 때는 객체+Scope명으로 앞에 명령어를 붙여주면 된다.

     

    예시로 보자. 아래 코드는 위에서 보여줬던 기존의 코드다.

     

    세 객체 모두 속성명이 같으니까 결과물은 가장 작은 스코프인 request의 결과물이 출력됐다.

     

    	<p>리퀘스트: ${test}</p>
    	<p>세션: ${test} </p>
    	<p>어플리케이션: ${test}</p>

     

    이것을 아래와 같이 바꿔보자.

     

    	<p>리퀘스트: ${requestScope.test}</p>
    	<p>세션: ${sessionScope.test} </p>
    	<p>어플리케이션: ${applicationScope.test}</p>

     

    각자의 속성명 앞에 EL이 참조할 scope를 명시해주는 것이다.

     

    이때 주의할 점은 Scope의 S는 대문자로 써야한다.

     

    그럼 데이터 전체 코드는 다음과 같다.

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1> 두번째 jsp 파일 </h1>
    	
    	<p>리퀘스트: ${requestScope.test}</p>
    	<p>세션: ${sessionScope.test} </p>
    	<p>어플리케이션: ${applicationScope.test}</p>
    	
    </body>
    </html>

     

    그리고 결과물은 아래와 같이 원하는 대로 출력된다.

     

    '백엔드 > 서블릿&JSP' 카테고리의 다른 글

    JSTL Core에 대해서  (0) 2021.01.15
    JSTL(JSP Standard Tag Library)  (0) 2021.01.15
    EL(Expression Language)란?  (0) 2021.01.14
    MVC 패턴의 등장  (0) 2021.01.14
    JSP 데이터 저장소  (0) 2021.01.14
Designed by Tistory.