JSP

표현언어로 표현 단수화하기

표현 언어 EL:Expression Language는 값(데이터) 을 웹 페이지에 표시(표현) 하는 데 사용 되는 태그 입니다.

 

EL(Expression Language) ?

JSP 출력에 대한 부분을 쉽게 하기 위해 개발한 tag(태그) 이다.

 

JSP에서 출력을 위해서 표현식을 사용합니다. 기억이 날지 모르겠지만, 표현식은 3장에서 이미 학습한 내용입니다. 하지만 다시 한 번 정리해 봅시다.

 JSP에서는 스크립트 요소를 제공해주는데, 그 중에 표현식 스크립트 요소는 계산식, 함수 호출 결과를 문자열 형태로 출력해주는 역할을 합니다. 표현식이 기억이 나지 않으면 3장을 복습하고 다시 이번 장을 학습하면 도움이 될 수 있습니다. 표현 언어는 표현식보다 사용 방법이 간단하고 문법 체계가 직관적이어서 아주 쉽습니다. 표현 언어는 ${} 를 사용하여 값을 표현합니다.

- 예 : 표현식 <%= expr %>

- 예 : 표현 언어 ${ expr }

 

 예를 들어 표현식에서는 <%= "Hello" %> 로 기술했던 코드를 표현 언어로 표현할 때 에는 ${"Hello"} 와 같이 기술합니다.

표현식은 자바에 익숙한 초보 JSP 개발자들이 기초적인 웹 애플리케이션을 학습하면서 사용한 것이라면 앞으로 다룰 예제들은 표현식 대신 표현 언어를 사용합니다. 요즘은 순수 JSP 로만 웹사이트를 개발하지 않고 스트럿츠나 스프링과 같은 프레임워크로 웹 개발을 하는데, 이때도 표현 언어를 사용합니다. 프레임워크는 기본적인 것들이 갖추어진 큰 틀이라고 생각하면 됩니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 





Insert title here
 

 

${ "Hello" }

<%= "Hello" %>

<% out.println("Hello"); %>
 



 

 

Hello
Hello
Hello

 

 위 예제에서는 표현을 위한 방법 세 가지(표현 언어, 표현식, 스크립트릿) 를 설명하기 위해서 "Hello" 라는 문자열을 사용하였습니다.

문자열 외에 표현 언어에서 사용 가능한 데이터 타입으로는 정수형, 실수형, 논리형, null 등이 있는데 Model2 방식에서는 표현식이나 스크립트릿 대

신 표현 언어를 사용해야 하기 때문에 다양한 데이터 타입이 표현 언어에서 어떻게 사용되는지 살펴 보아야 합니다. Model2 방식은 11장에서 자세

설명합니다.

 다음 예제는 표현 언어에서 사용 가능한 데이터 타입들을 사용한 예입니다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

 

 

 


Insert title here

 

 

 

 

 

 

정수형 : ${10 }

실수형 : ${ 5.6 }

문자열형 : ${"성윤정"}

논리형 :${true }

null : ${null }

 

 



 

정수형 : 10
실수형 : 5.6
문자열형 : 성윤정
논리형 :true
null :

 

표현 언어가 자바와는 다른 특징 중 하나는 null은 결과 화면에 공백으로 처리되는 점입니다. 표현 언어는 식을 계산해서 그 결과를 출력하는 것을 목적으로 합니다. 다음과 같이 표현할 수 있는 문법을 EL 식이라고 합니다.

${expr}

 

 프로그래밍 언어에는 문장 단위로 프로그램을 기술하는데 한 문장을 식이라고 표현합니다. EL 을 사용한 문장을 EL 식이라고 합니다. 표현 언어는 EL식으로 접근된 데이터를 조작 및 비교할 여러 연산자를 포함하고 있습니다. 다음은 표현 언어 연산자 목록입니다.

종류 연산자
산술 +, -, *, / (or div), %( or mod)
관계형 ==(or eq), !=(or ne), < (or lt), > (or gt), <=(or le), >= (or ge)
조건 a ? b :c
논리 && (or and), || (or or), ! (or not)
null 검사 empty

 

EL 식에는 위의 표에서 언급한 연산자를 포함할 수 있습니다. 표에서 괄호 안의 연산자는 같은 역할을 하는 연산자입니다. 산술 연사자는 더하기, 빼기 나누기를 지원 합니다.

${ 5+ 2}

관계형 연산자는 숫자 또는 텍스트 데이터를 비교할 수 있도록 합니다. 베교한 결과는 부울 값(true or false) 으로 리턴 됩니다. 같은지를 물어보기 위한 연산자는 == 이지만 eq를 사용할 수도 있습니다. 2가지 중에 하나를 사용해서 같은지를 물어볼 수 있습니다.

 

${ 3== 3} ${ 3 eq 3}

 조건 연산자(a ? b :c ) 는 조건(a)을 테스트하여 참이면 : 앞에 기술된 식(b) 을, 거짓이면 : 뒤에 기술 된 식(c)을 수행하고 논리적 연산자는 부울 값이 

결합될 수 있도록 하며 새로운 부울 값(true or false) 을 리턴합니다.

empty 연산자는 검사할 객체가 텅 빈 객체(null) 인지를 검사하기 위해서 사용하며 표현식을 인자로 취합니다.

 

${ empty input }

일반적으로 객체에 저장할  값이 없을 경우 null 을 저장합니다. 다음은 문자열을 저장하기 위해서 String 클래스로 선언한 페러펀스 변수 input 에 null 을 저장한 예입니다.

 

String input =null;

 

null 이 저장된 상태에서 그 객체를 사용하게 되면 예외가 발생하기 때문에 객체를 사용하기 전에 null 이 저장되어 있는지를 물어보고 사용하는 것이 일반적인데 이럴 때 사용되는 연산자가 empty입니다. ${ empty input} 과 같이 표현하면 결과값은 true 로 반환합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

 

 

 


EL과 JSTL

 

 

 

 

 

 

<%
    String input =null;
%>

 

 

\${empty input } : ${empty input }



 

${empty input } : true

 

 위와 같은 표현 언어는 뒤에서 살펴볼 JSTL 에서 제공되는 조건식과 함께 사용됩니다. 예를 들어 input 에 null이 저장되어 있는지를 물어보기 위해서 스크립트릿을 사용한다면 다음과 같이 코딩해야 하기 때문에 가독성이 떨어집니다.

<%

 if(input ==null) { %>

 텅 빈 객체(null)입니다.

<%

 }

%>

JSTL 을 아직 학습하지 않았지만 표현 언어를 사용하면 다음과 같이 코드가 단순해 집니다.

 

 텅 빈 객체(null) 입니다.

 

 

JSTL 을 아직 학습하지 않았지만 표현 언어를 사용하면 다음과 같이 코드가 단순해 집니다.

 

  텅 빈 객체(null) 입니다.

 

JSLT 의 조건식 내에 비교를 위한 관계형 연산자는 반드시 표현 언어로 기술해야 합니다.

 

표현언어로 요청 파라미터 처리하기

사용자가 폼에 입력한 값을 얻어오기 위해서는 JSP 내장 객체인 request 의 getParameter() 메소드를 사용합니다.

표현 언어에서는 request.getParameter() 대신 param 객체를 사용합니다. 표현 언어의 내장 객체인 param 에 대해서 살펴보도록 합시다.

다음은 표현 언어에서 요청 파라미터 관련 내장 객체입니다.

 

내장 객체 설명
param JSP의 내장 객체인 request 의 getParameter() 와 동일한 역할인 파라미터 값을 알려준다.
paramValues 동일한 이름으로 전달되는 파라미터 값들을 배열 형태로 얻어오는 데 사용하는 request 의 getParameterValues()와 동일한 역할을 한다.

 

param 객체는 표현 언어에서 request.getParameter() 대신 사용자가 폼에 입력한 값을 얻어오기 위해서 사용합니다. param 객체는 . 혹은 [] 둘 중에 하나를 이용해서 사용자가 입력한 값을 얻어옵니다. 아이디와 암호는 서로 다른 이름의 입력 양식이기에 param 객체로 전달된 데이터를 얻어옵니다.

 

이번에는 paramValues가 언제 사용되는지를 살펴보기 위해서 간단한 예를 들어 보겠습니다.

4장에서 request 내장 객체를 설명하면서 요청(request) 파라미터 관련 메소드를 위한 예로 설문 조사를 하는 페이지를 만들었고 좋아하는 계절을 조사하기 위해서 다음과 예제 (04_researchForm.jsp) 에서와 같이 체크 박스를 만들었습니다.

 

 

 좋아하는 계절:

여름

가을

겨울

 

 

 

선택된 값을 얻어오려면 04_research.jsp에서 요청(request) 객체의 파라미터 관련 메소드 중에서 getParameterValues() 를 사용해서 배열 형태로 값을 전달받아야 합니다.

<%

   String  seasonArr[] =request.getParameterValues("season");

    out.println("당신이 좋아하는 계절 : ");

    for(String season : seasonArr) {

        out.println(season+ " ");

    }

%>

 그런데 표현 언어에서는 paramValues 를 이용하여 아직 JSTL 을 배우지 않았지만 JSTL 의 forEach를 이용하여 다음과 같이 간편하게 체크 박스에서 

선택한 값을 얻어 올 수 있습니다.

 

 

  ${season}

 

 

 다음은 로그인 화면에서 입력한 값을 표현 언어의 param 내장 객체를 이용해서 얻어오기 위한 예입니다.

 

파일 설명
04_login.jsp 클라이언트가 ID와 암호를 입력할 수 있는 화면을 제공하기 위한 페이지이다.
04_testLogin.jsp 로그인 화면에서 제공한 정보를 가져와 출력하는 페이지이다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

 

 

 


EL 과 JSTL

 

 

 

 

 

 

 

 

 


    아이디  :
    

    
    암   호 :
    

    
    
    

 



 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

 

 

 


EL 과 JSTL

 

 

 

 

 

 

당신이 입력한 정보입니다.(고전적인 방식).

 

 



아이디 : <%= request.getParameter("id") %>

비밀번호 :<%= request.getParameter("pwd") %>

 

 

 

 

 

 



당신이 입력한 정보입니다.(EL 방식).

아이디 : ${ param.id }

비밀번호 : ${param["pwd"] } 

 



 

당신이 입력한 정보입니다.(고전적인 방식).


아이디 : fefs
비밀번호 :1234
 


당신이 입력한 정보입니다.(EL 방식).
아이디 : fefs
비밀번호 : 1234

 

이번에는 자바 코드와  EL 식을 비교해 보도록 합시다. EL 식에서 자바 코드와 다른 특성 중 하나가 null 값 대신 공백을 출력한다는 점이었습니다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

 

 

 


EL과 JSTL

 

 

 

 

 

 

자바 코드 : <%= request.getParameter("id") %>

EL 식 : ${ param.id }

 

 



 

자바 코드 : null
EL 식 :

 

EL 식에서 null값을 이해하는 방식 이외에도 자바와는 또 다른 독특한 특성이 있습니다. 자바에서 == 연산자는 수치형 데이터에 대해서만 값을 비교하고 객체에 대해서는 참조되는 객체의 레퍼런스 값을 비교하지만, EL 식에서는  == 연산자로 객체에 저장된 값(내용)을 비교합니다. 객체 레퍼런스 값을 비교한다는 객체의 값(내용) 을 비교하기 위해서는 equals() 메소드를 사용해야만 합니다. 다음은 지금 설명한 내용을 확인하기 위한 예제입니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

 

 

 


EL 과 JSTL

 

 

 

 

 

 

자바 코드

 

 

==연산자 사용 결과 : <%= request.getParameter("id") =="pinksung" %>

equals() 사용 결과 : <%= request.getParameter("id").equals("pinksung") %>



 

- == 연산자로 파라미터로 넘겨진 값이 pinksung인지 비교하면 참조되는 객체가 다르므로 false 를 리턴합니다.

- equals() 메소드를 사용하여 비교하면 값(내용)을 비교하기 때문에 true 를 리턴합니다. 하지만 EL 식에서의 == 연산자는 수치 데이터뿐만 아니라 문자열 데이터에 대해서도 값을 비교할 수 있습니다.

 

05_old.jsp 페이지를 요청하여 실행 결과를 확인해 봅시다. 위 예제를 실행하여 결과를 얻으려면 주소 입력란에 다음과 같이 파라미터를 쿼리 스트링 형태로 넘겨주어야 합니다.

http://localhost:1111/web-study-07/05_old.jsp?id=pinksung

 

자바 코드
==연산자 사용 결과 : false
equals() 사용 결과 : true

 

 

EL 식


 

== 연산자 사용 결과 :  ${param.id =="pinksung" }

 

 

EL 식


== 연산자 사용 결과 : true

 

EL 식에서의 == 연산자는 자바 코드의 equals 메소드와 동일한 개념을 파악하여 파라미터로 넘겨진 값을 비교하기 때문에 true 를 리턴합니다.

 

자바 코드에서는 request.getParameter() 메소드는 파라미터를 찾지 못할 경우 null 값을 리턴하기 때문에 예외가 발생합니다.

 

자바 코드



<%
    if(request.getParameter("id")!=null){
    
%>
    == 연산자 사용 결과 : <%= request.getParameter("id") =="pinksung" %>

    equals() 사용 결과 : <%= request.getParameter("id").equals("pinksung") %>

 


<%
    }else{
        out.print("id를 전달해 주세요.");
    }
%>

 

 

파라미터를 찾지 못해 request.getParameter() 메소드의 리턴값이 null 일 경우 equals() 메소드를 적용하면 예외가 발생하므로 null 이 아닌 경우에만 equals() 메소드를 적용하면  예외가 발생하므로 null 이 아닌 경우에만 equals() 메소드를 호출하도록 예외를 처리하였기에 파라미터를 넘겨주지 않아도 정상적으로 동작합니다.

 하지만 EL 식에서는 파라미터를 찾지 못하면 공백으로 처리되기 때문에 예외가 발생되지 않아 따로 예외 처리를 하지 않아도 됩니다.

다음은 자바 코드와 EL 식에서 수치 데이터를 어떻게 처리하는지 비교하기 위해 두 수치 데이터를 입력받아 합을 구하는 예제입니다.

 

고전적인 방식 :
<%
   String str1 =request.getParameter("num1");
   String str2 =request.getParameter("num2");
 
   int num1 =Integer.parseInt(str1);
   int num2=Integer.parseInt(str2);
   
%>
<%= num1 %> + <%= num2 %> = <%= num1 + num2 %>


 

EL 방식 :

${ param.num1 } + ${ param.num2 } =${param.num1 + param.num2 }

 

 

- request.getParameter 는 리턴형이 무조건 String 형이기에 산술 연산을 하려면 int 형으로 변환해야 한다는 단점이 있습니다.

 

- 반면 EL 로 표현할 경우에는 형변환을 할 필요가 없기 때문에 코드가 무척 간단해짐을 알 수 있습니다.

 

표현언어로 내장 객체 접근하기

JSP는 웹 애플리케이션을 구현하는 데 필요한 정보를 JSP 내장 객체 (request, session 등) 에 속성 값으로 저장해서 사용했습니다. 속성에 저장된 값을 표현 언어에 서는 다음 표에서와 같은 형태로 접근해서 사용할 수 있습니다.

Category 내장 객체 설명
범위 pageScope page 기본 객체에 저장된 속성의<속성, 값> 매핑을 저장한 Map 객체
  requestScope request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체
  sessionScope session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체
  applicationScope application 기본 객체에 저장된 속성의<속성, 값> 매핑을 저장한 Map 객체

 

참고로 앞에서도 계속 언급하였지만, 자바 코드로 내장 객체에 저장된 속성 값에 접근하면 코드가 길어지고 지저분해집니다. 그래서 나온 것이 표현 언어입니다. 그래서 본격적인 웹 프로그래밍을 위해서는 표현 언어로 간결한 코드를 작성해야 합니다. 또한 지금은 표현 언어에 대한 설명만 하고 있는데, 표현 언어는 JSTL 과 함께 사용됩니다. JSTL 을 학습한 후에 배우는 JSTL 을 표현 언어와 함께 사용하면 자바 코드보다 코드가 훨씬 간단해진다는 것을 알 수 있을 것입니다.  다소 지루한 문법 설명이 이어지더라도 열심히 손에 익혀두시기 바랍니다. 모두 필요하니까 배우겠죠?

 표현 언어 (expression language) 는 표현식(expression)처럼 연산자와 피연산의 조합을 ${ 와 } 로 둘러싸서 표현할 수 있지만 ${}에 기술한  표현은 표현식과는 다른 의미로 해석됩니다.

 

<%= add %> 자바의 변수 이름

${add} - 속성 이름

 

 표현식(expression) 에 add 를 기술하면 이를 자바의 변수 이름으로 인식합니다. 반면 표현 언어에서 사용된 add는 속성 이름으로 인식합니다. 속성이란 04 장 JSP 내장 객체를 학습할 때 언급했던 JSP 내장 객체에서 정보를 주고받기 위한 메소드로 관리되는 정보를 말합니다. 다음은 JSP 내장 객체의 정보를 주고받기 위한 메소드 목록 입니다.

 

메소드 설명
setAttribute(name, value) 주어진 이름(name)에 값(value) 을 설정한다.
getAttribute(name) 주어진 이름(name) 에 설정된 값(value)을 얻어낸다.
getAttributeNames() 현재 객체에 관련된 모든 속성 이름을 얻어낸다.
removeAttribute(name) 주어진 이름(name)에 설정된 값(value)을 제거

 

위 표에 언급된 메소드의 매개 변수로 사용된 name 은 String 객체의 형태이고, value 는 java.lang.Object 객체의 형태입니다. 또한 getAttribute(name) 으로 얻어낸 값 역시 java.lang.Object 객체의 형태입니다.

 다음 예제는 1장에서 언급했듯이 JSP 에서는 표현에만 집중하고 비즈니스 로직은 서블릿에서 구현하는 방식으로 작성한 것입니다. 그래서 서블릿에서 합을 구하고 그 결과를 JSP 에서 받아 출력하는 것을 보여줍니다. 참고로 JSP 로만 웹 프로그래밍을 하는 것을 모델 1방식이라고 합니다. 이번 장 이후에는 모델 1이 아닌 모델 2방식으로 웹 프로그래밍을 하는 방법을 학습할 텐데, 모델2에서는 서블릿에서 비즈니스 로직을 구현하고 JSP 에서는 그 결과를 사용자에게 어떻게 보여줄 것인지 표현만 하게 됩니다.

고전적인 방식 :
<%
    
    int num1 =(Integer)request.getAttribute("num1");
    int num2 =(Integer)request.getAttribute("num2");
    
%>
<%= num1 %> + <%= num2 %> = <%= num1 + num2 %>


 

EL 방식 :

${num1 } + ${num2 } =${ num1 +num2 }

 

 

- request.getAttribute() 는 리턴형이 무조건 Object 형이기에 Integer 로 형변환해야 한다는 단점이 있습니다.

- 서블릿의 request.setAttribute("num1", num1) ; 로 넘겨준 값을 얻어오기 위해서 자바 코드에서는 request.getAttribute("num1"); 와 같이 명확하게 request 객체의 속성 값을 얻어오지만 표현 언어에서는 ${num1} 과 같이 표현했습니다. 표현 언어에서 ${} 안에 기술한 이름을 속성 이름으로 해석하기 때문입니다.

즉, ${num1} 은 서블릿 코드에서 request 객체의 setAttribute() 메소드를 호출하면서 지정한 num1 이란 이름에 저장한 20을 얻어오겠다는 의미입니다.

 

JSP 에서는 웹 애플리케이션에서 사용 가능한 네 개의 내장 객체(page, request, session, application) 에 속성 값을 저장할 수 있습니다. 위 예에서는 표현 언어에서 속성을 어떻게 다루는지 설명하기 위해서 가장 자주 사용되는 request 객체에 대해서 속성을 설정해 본 것입니다.

 

속성 JSP 내장 객체 서블릿 클래스 표현 언어의 내장 객체
page 속성 pageContext javax.servlet.jsp.JspContext 클래스 pageScope
request 속성 request javax.servlet.ServletRequest 인터페이스 requestScope
session 속성 session javax.servlet.http.HttpSession 인터페이스 sessionScope
application 속성 application javax.servlet.ServletContext 인터페이스 applicationScope

 

JSP 내장 객체가 표현 언어에서 어떻게 사용되는지 예를 들어 설명하겠습니다. 저장된 속성은 표현 언어의 내장 객체를 지정해야 합니다.

JSP 내장 객체인 pageContext에 저장된 속성 값은 pageContext.getAttribute("num1");와 같이 기술해서 얻을 수 있습니다. 반면 표현 언어에서는 내장 객체 pageScope 를 사용해서 ${pageScope.num1} 와 같이 얻어옵니다.

 

- 예 : 자바 코드

pageContext.getAttribute("num1"); 

 

- 예 : 표현언어

${pageScope.num1}

 

request 에 저장된 속성 값은 다음과 같이 얻어 와야 합니다.

 

-  예 : 자바 코드

request.getAttribute("num1");

- 예 : 표현 언어

${requestScope.num1}

 

이번에는 session에 저장된 속성 값을 얻어와 봅시다.

-예 : 자바 코드 

session.getAttribute("num1"0;

-예 : 표현 언어

${sessionScope.num1}

이제 마지막으로 application 에 저장된 속성 값을 얻어와 봅시다.

- 예 : 자바 코드

application.getAttribute("num1");

- 예 : 표현 언어

${ applicationScope.num1}

 

pageScope  -> requestScope ->sessionScope ->applicationScope

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    pageContext.setAttribute("name", "page man");
    request.setAttribute("name", "request man");
    session.setAttribute("name", "session man");
    application.setAttribute("name", "application man");

%>


name : ${name}



page 속성 :${ pageScope.name }

request 속성 :${ requestScope.name }

session 속성 :${ sessionScope.name }

application 속성 :${ applicationScope.name }

 

 

 

 

 

 

 

 

name : page man


page 속성 :page man
request 속성 :request man
session 속성 :session man
application 속성 :application man

 

 

내장 객체를 명시하지 않으면 가장 협소한 범위 내에서 사용 가능한 pageScope 객체에서 부터 속성을 찾아옵니다. 결과는 page man 이 출력됩니다.

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

돈에 너무 집착하면 돈을 벌기도, 번 돈을 갖고 있기도 힘들다. 돈을 벌거나 모으려면 우선 돈을 편하게 생각해야 한다. 돈을 거북하게 느낀다면 의식적으로든 무의식적으로든 결국 돈을 안 가지는 쪽으로 해결을 보려 든다. -앤드류 매튜스

댓글 ( 4)

댓글 남기기

작성

JSP 목록    more