자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 30. 표현 언어(EL: Expression Language) - 표현 언어의 정의, EL의 내장 객체

개발학생 2025. 4. 17. 15:35
반응형

1. 표현 언어(EL, Expression Language)의 정의

  • 변수의 값을 출력할 때 사용하는 스크립트 언어
    → 4가지 영역에 저장된 값을 출력할 때 사용
  • 사용법이 매우 간결함
  • 예외와 형변환에 관대함
    • 자바에서 값이 null인 변수를 사용하면 예외가 발생하지만, 표현 언어를 사용하면 예외가 발생하지 않음
  • JSP 내장 객체의 영역에 담긴 속성 사용 가능
  • 산술 연산, 비교 연산, 논리 연산이 가능
  • 자바 클래스에 정의된 메소드 호출 가능
  • 표현 언어만의 객체를 통해 JSP와 동일한 기능 수행 가능

1) 기본 사용법

  • 영역에 저장된 속성
${ 속성 }
  • JSP에서 생성한 변수나 값은 바로 쓸 수 없음⇒ 예시: request 영역에 저장했을 경우
    → JSP에서 생성한 변수에 접근하려면, 반드시 영역에 저장 후 사용
<h2>${ requestScope.saveVar }</h2>
  • HTML 태그나 자바스크립트, CSS 어디에서든 사용 가능
    → 액션 태그나 JSTL(추후 학습함)의 속성값으로도 사용 가능
<c:set var="elVar" value="${ elVar }" />    //액션 태그와 함께 사용
<jsp:include page="${ pathVar }" />    //JSTL과 함께 사용
  • JSP 스크립트 요소(선언부, 표현식, 스크립틀릿)에서는 사용 불가
<%!
void myMethod(${ errorVar }) {
	//코드..
}
%>    //선언부에서 사용했으므로 에러 발생

<%@ include file="${ errorVar }" %>    //스크립틀릿에서 사용했으므로 에러 발생

<%= ${ errorVar } %>    //표현식에서 사용했으므로 에러 발생

2) 객체 표현 방식

  • EL에서 객체를 표현할 때는 .(점)이나 사용
${ param.name }
${ param["name"] }
${ param['name'] }
  • 속성명에 특수 기호나 한글이 포함되었을 때는 대괄호만 사용 가능
${ header["user-agent"] }    //가능
${ header.user-agent }    //에러 발생
${ King['한글'] }    //가능
${ King.한글 }    //에러 발생

2. EL의 내장 객체

  • EL에서는 4가지 영역에 접근하거나 사용자의 요청을 처리하기 위한 내장 객체를 제공함

1) 4가지 영역에 속성값 저장하고 읽어오기

(1) 4가지 영역에 접근하기 위한 내장 객체

  • pageScope
    • pageContext 내장 객체처럼 page 영역에 저장된 속성값을 읽어옴
  • requestScope
    • request 내장 객체처럼 request 영역에 저장된 속성값을 읽어옴
  • sessionScope
    • session 내장 객체처럼 session 영역에 저장된 속성값을 읽어옴
  • applicationScope
    • application 내장 객체처럼 application 영역에 저장된 속성값을 읽어옴

(2) 내장 객체 사용 예

  • WebContent/EL에서 ImplicitObjMain.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
<%
//1.
pageContext.setAttribute("scopeValue", "페이지 영역");
request.setAttribute("scopeValue", "리퀘스트 영역");
session.setAttribute("scopeValue", "세션 영역");
application.setAttribute("scopeValue", "애플리케이션 영역");
%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 내장 객체</title></head>
<body>
  <h2>ImplicitObjMain 페이지</h2>
  <h3>각 영역에 저장된 속성 읽기</h3>
  <ul>
    <!-- 2. -->
    <li>페이지 영역: ${ pageScope.scopeValue }</li>
    <li>리퀘스트 영역: ${ requestScope.scopeValue }</li>
    <li>세션 영역: ${ sessionScope.scopeValue }</li>
    <li>애플리케이션 영역: ${ applicationScope.scopeValue }</li>
    </ul>

    <h3>영역 지정 없이 속성 읽기</h3>
    <ul>
      <li>${ scopeValue }</li>    <!-- 3. -->
    </ul>

<%--    <jsp:forward page="ImplicitForwardResult.jsp" /> --%>    <!-- 4. -->
</body>
</html>
  1. 4가지 영역 모두에 “scopeValue”라는 같은 이름으로 속성 저장
  2. EL의 내장 객체를 통해 각 영역에 저장된 속성값 출력
  3. 영역을 따로 지정하지 않아, 가장 좁은 영역에서부터 속성을 찾음 (page 영역에 저장된 값을 가져옴)
  4. 다른 페이지로 포워드하는 액션 태그 (주석 처리함)
  • WebContent/EL에서 ImplicitForwardResult.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 내장 객체</title></head>
<body>
  <h2>ImplicitForwardResult 페이지</h2>
  <h3>각 영역에 저장된 속성 읽기</h3>
  <ul>
    <!-- 1. -->
    <li>페이지 영역 : ${ pageScope.scopeValue }</li>
    <li>리퀘스트 영역 : ${ requestScope.scopeValue }</li>
    <li>세션 영역 : ${ sessionScope.scopeValue }</li>
    <li>애플리케이션 영역 : ${ applicationScope.scopeValue }</li>
  </ul>
  <h3>영역 지정 없이 속성 읽기</h3>
  <ul>
    <li>${ scopeValue }</li>    <!-- 2. -->
  </ul>
</body>
</html>
  1. 4가지 영역에 저장된 값을 내장 객체를 통해 읽어 옴
  2. 영역을 지정하지 않은 상태로, 저장된 값을 내장 객체를 통해 읽어 옴

*[Run As] → [Run On Server]로 ImplicitObjMain.jsp 파일 실행(4.번 주석 유지-포워드되지 않음)

→ 4가지 영역에 저장된 값이 출력되었고, 영역명을 지정하지 않았을 때는 가장 좁은 영역인 page 영역의 속성이 출력됨

*[Run As] → [Run On Server]로 ImplicitObjMain.jsp 파일 실행(4.번 주석 해제-ImplicitForwardResult.jsp로 포워드됨)

→ 포워드 된 이후에는 새로운 page 영역이 만들어지므로 기존의 page 영역에 저장해둔 값은 읽을 수 없고, 영역을 지정하지 않고 출력하면 request 영역의 속성값이 출력됨

⇒ 즉 현재 page 영역에는 scopeValue라는 속성이 없으므로, page 영역 다음으로 범위가 좁은 request 영역에서 속성을 읽어온 것

2) 폼값 처리하기

  • JSP에서는 전송 방식(get/post)에 상관없이 request.getParameter()로 폼값을 받을 수 있음(EL에서도 마찬가지)
  • EL에서 폼값을 처리하기 위한 내장 객체

param request.getParameter(”매개변수명”)과 동일하게 요청 매개변수의 값을 받아옴

param request.getParameter(”매개변수명”)과 동일하게 요청 매개변수의 값을 받아옴
paramValues request.getParameterValues(”매개변수명”)과 동일하게 요청 매개변수의 값을 문자열 배열로 받아옴
다중 선택이 가능한 checkbox를 통해 전달된 폼값을 받을 때 주로 사용
  • 폼값 전송용 개인정보 입력폼: WebContent/EL에서 FormSubmit.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 폼값 처리</title></head>
<body>
  <h2>폼값 전송하기</h2>
  <form name="frm" method="post" action="FormResult.jsp">
    이름 : <input type="text" name="name" /><br />
    성별 : <input type="radio" name="gender" value="Man" />남자
           <input type="radio" name="gender" value="Woman" />여자<br />
    학력 : <select name="grade">
             <option value="ele">초딩</option>
             <option value="mid">중딩</option>
             <option value="high">고딩</option>
             <option value="uni">대딩</option>
           </select><br />
    관심 사항 : 
           <input type="checkbox" name="inter" value="pol" />정치
           <input type="checkbox" name="inter" value="eco" />경제
           <input type="checkbox" name="inter" value="ent" />연예
           <input type="checkbox" name="inter" value="spo" />운동<br />
           <input type="submit" value="전송하기" />
  </form>
</body>
</html>

 

  • 전송된 폼값 확인용 페이지 WebContent/EL에서 FormResult.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 폼값 처리</title></head>
<body>
  <h3>EL로 폼값 받기</h3>
  <ul>
    <!-- 1. -->
    <li>이름 : ${ param.name }</li>
    <li>성별 : ${ param.gender }</li>
    <li>학력 : ${ param.grade }</li>
    <!-- 2. -->
    <li>관심사항 : 
      ${ paramValues.inter[0] }
      ${ paramValues.inter[1] }
      ${ paramValues.inter[2] }
      ${ paramValues.inter[3] }</li>
  </ul>
</body>
</html>
  1. text, radio 타입의 <input> 태그나 <select> 태그는 값이 하나만 전송되므로, EL의 내장 객체인 param으로 값을 받을 수 있음
  2. checkbox 타입은 다수의 값이 전송될 수 있으므로, EL의 내장 객체 paramValues를 통해 배열로 값을 받을 수 있음

*[Run As] → [Run On Server]로 FormSubmit.jsp 파일 실행

→ 정보 입력 후 [전송하기] 버튼을 누르면, 폼값이 post 방식으로 FormResult.jsp로 전송됨

3) 객체 전달하기

  • 문자열과 다르게 객체는 폼으로 전송이 불가능하므로, 영역을 사용
    → 객체를 영역에 저장한 후, (내장 객체의 영역이 공유된다는 특징을 이용해서) 전송하고자 하는 페이지로 전달하면 됨

(1) WebContent/EL에서 ObjectParams.jsp 파일 생성

<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 객체 매개변수</title></head>
<body>
  <%
  <!-- 1. -->
  request.setAttribute("personObj", new Person("홍길동", 33));
  request.setAttribute("stringObj", "나는 문자열");
  requtes.setAttribute("integerObj", new Integer(99));
  %>
  <jsp:forward page="ObjectResult.jsp">    <!-- 2. -->
    <!-- 3. -->
    <jsp:param value"10" name="firstNum" />
    <jsp:param value="20" name="secondNum" />
  </jsp:forward>
</body>
</html>
  1. Person 객체, 문자열(String 객체), Integer 객체를 생성 후 request 영역에 저장
  2. 액션 태그를 이용해 ObjectResult.jsp로 포워드
  3. ObjectResult.jsp로 10과 20도 함께 포워드됨

(2) WebContent/EL에서 ObjectResult.jsp 파일 생성

<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 객체 매개변수</title></head>
<body>
  <h2>영역을 통해 전달된 객체 읽기</h2>
  <ul>
    <!-- 1. -->
    <li>Person 객체 => 이름 : ${ personObj.name }, 나이 : ${ personObj.age }</li>
    <li>String 객체 => ${ requestScope.stringObj }</li>
    <li>Integer 객체 => ${ integerObj }</li>
  </ul>
  <h2>매개변수로 전달된 값 읽기</h2>
  <ul>
    <!-- 2. -->
    <li>${ param.firstNum + param['secondNum'] }</li>
    <li>${ param.firstNum } + ${ param["secondNum"] }</li>
  </ul>
</body>
</html>
  1. request 영역을 통해 전달된 객체를출력
  2. 매개변수를 통해 전달된 값을 출력 (속성명 지정 시 점과 대괄호 모두 사용 가능)

(3) [Run As] → [Run On Server]로 ObjectParams.jsp 실행

  • 모든 값이 무사히 전송됨
    → 형변환이 필요 없고, 게터 호출 대신 멤버 변수 이름만 쓰면 바로 원하는 값 출력 가능

4) 쿠키, HTTP 헤더, 컨텍스트 초기화 매개변수 출력

(1) 쿠키나 헤더값을 읽을 수 있도록 EL에서 제공하는 내장 객체

cookie  쿠키를 읽을 때 사용
header request.getHeader(헤더명)와 동일하게, 헤더값을 읽을 때 사용
headerValues request.getHeaders(헤더명)와 동일하게, 헤더값을 배열 형태로 읽을 때 사용
initParam web.xml에 설정한 컨텍스트 초기화 매개변수를 읽을 때 사용
pageContext JSP의 pageContext 내장 객체와 동일한 역할을 함

(2) 사용 예제

  • WebContent/EL에 OtherImplicitObj.jsp 파일 생성
<%@ page import="utils.CookieManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
CookieManager.makeCookie(response, "ELCookie", "EL좋아요", 10);    <!-- 1. -->
%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 그 외 내장 객체</title></head>
<body>
  <h3>쿠키값 읽기</h3>
  <li>ELCookie값 : ${ cookie.ELCookie.value }</li>    <!-- 2. -->

  <h3>HTTP 헤더 읽기</h3>
  <ul>
    <!-- 3. -->
    <li>host : ${ header.host }</li>
    <li>user-agent : ${ header['user-agent'] }</li>
    <li>cookie : ${ header.cookie }</li>
  </ul>

  <h3>컨텍스트 초기화 매개변수 읽기</h3>
  <li>OracleDriver : ${ initParam.OracleDriver }</li>

  <h3>컨텍스트 루트 경로 읽기</h3>
  <li>${ pageContext.request.contextPath }</li>
</body>
</html>
  1. 이전에 생성했던 CookieManager 클래스의 makeCookie( ) 메소드로 쿠키 생성 (유효 시간 10초)
  2. 1.에서 생성한 쿠키 출력 (생성 직후에는 바로 사용 불가 - 클라이언트에만 저장되어 있어, 첫 실행이라면 새로고침을 해야 출력됨)
  3. HTTP 요청 헤더에 포함된 값들을 출력
    → ‘user-agent’의 경우 이름에 특수 기호가 들어가므로, ${header.user-agent }처럼 작성하면 제대로 출력되지 않고 0으로 출력됨

*[Run As] → [Run On Server]로 OtherImplicitObj.jsp 파일 실행

→ 모든 정보가 제대로 보임

반응형