자바(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>
- 4가지 영역 모두에 “scopeValue”라는 같은 이름으로 속성 저장
- EL의 내장 객체를 통해 각 영역에 저장된 속성값 출력
- 영역을 따로 지정하지 않아, 가장 좁은 영역에서부터 속성을 찾음 (page 영역에 저장된 값을 가져옴)
- 다른 페이지로 포워드하는 액션 태그 (주석 처리함)
- 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>
- 4가지 영역에 저장된 값을 내장 객체를 통해 읽어 옴
- 영역을 지정하지 않은 상태로, 저장된 값을 내장 객체를 통해 읽어 옴
*[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>
- text, radio 타입의 <input> 태그나 <select> 태그는 값이 하나만 전송되므로, EL의 내장 객체인 param으로 값을 받을 수 있음
- 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>
- Person 객체, 문자열(String 객체), Integer 객체를 생성 후 request 영역에 저장
- 액션 태그를 이용해 ObjectResult.jsp로 포워드
- 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>
- request 영역을 통해 전달된 객체를출력
- 매개변수를 통해 전달된 값을 출력 (속성명 지정 시 점과 대괄호 모두 사용 가능)
(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>
- 이전에 생성했던 CookieManager 클래스의 makeCookie( ) 메소드로 쿠키 생성 (유효 시간 10초)
- 1.에서 생성한 쿠키 출력 (생성 직후에는 바로 사용 불가 - 클라이언트에만 저장되어 있어, 첫 실행이라면 새로고침을 해야 출력됨)
- HTTP 요청 헤더에 포함된 값들을 출력
→ ‘user-agent’의 경우 이름에 특수 기호가 들어가므로, ${header.user-agent }처럼 작성하면 제대로 출력되지 않고 0으로 출력됨
*[Run As] → [Run On Server]로 OtherImplicitObj.jsp 파일 실행
→ 모든 정보가 제대로 보임
반응형