본문 바로가기

학원/복기

[MVC] EL(expression Language)

el 폴더 생성

 

EL(expression Language)

 
EL은 스코프(Scope) 객체의 속성값으로 저장된 객체를 제공받아 출력하기 위한 언어이다.
EL 표현식으로 스코프 객체의 속성명을 사용하면 속성값을 제공받아 출력 처리 할 수 있다.
 
EL 표현식)

${속성명}

 
 
예시1) 
 
[basic_string.jsp]
 
pageContext.setAttribute(String attributeName, Object attributeValue)
: pageContext 내장객체에 속성명(문자열)과 속성값(객체)를  전달받아 저장하는 메소드 - page Scope
 
pageContext.getAttribute(String attributeName)
: pageContext 내장 객체에 저장된 스코프 속성값을 속성명을 이용하여 객체로 반환하는 메소드이다. Object 타입의 객체로 반환하므로 반드시 명시적 객체 형변환하여 사용해야 한다. 
 
page Scope 

  • JSP에서 Page Scope는 JSP 페이지 내에서만 유효한 범위를 가지는 스코프이다. 즉, JSP 페이지 내에서 선언된 변수는 해당 페이지 내에서만 접근 가능하며, 다른 페이지에서는 접근할 수 없다.
  • Page Scope에 속하는 변수는 JSP 페이지의 전체 수명 주기 동안 유지되며, 해당 페이지의 실행이 완료되면 소멸된다. 따라서, 같은 페이지 내의 여러 부분에서 동일한 변수를 사용할 수 있다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	pageContext.setAttribute("name", "홍길동"); 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL(expression Language)</h1>
	<hr>
	<p>EL : 스코프(Scope) 객체의 속성값으로 저장된 객체를 제공받아 출력하기 위한 언어</p>
	<hr>
	<h2>EL 미사용</h2>
	<% 
		String name=(String)pageContext.getAttribute("name");
		
		//매개변수로 전달받은 속성명에 대한 속성값이 없는 경우 null 반환
		String pageName=(String)pageContext.getAttribute("pageName");
	%>
	<%-- 반환받은 객체는 JSP 표현식(Expression)를 이용하여 출력 처리 --%>
	<p>이름(name) = <%=name %></p>
	<%-- 반환받은 객체가 [null]인 경우 JSP 표현식은 "null" 문자열로 변환되어 출력 처리 --%>
	<p>이름(pageName) = <%=pageName %></p>
	<%-- if 구문을 사용하여 반환받은 객체가 [null]이 아닌 경우에만 JSP 표현식으로 출력 처리 --%>
	<p>이름(pageName) = <% if(pageName!=null) { %><%=pageName %><% } %></p>
	<hr>
	<h2>EL 사용</h2>
	<p>이름(name) = ${name} </p>
	<%-- EL 표현식에서 사용한 스코프 객체의 속성명에 대한 속성값이 없는 경우 El 미실행 - 속성값 미출력 --%>
	<p>이름(pageName) = ${pageName}</p>
</body>
</html>

 
EL 표현식을 사용하면 getAttribute() 메소드를 호출하지 않아도 스코프 속성값을 객체로 제공받아 출력 처리가 가능하다.
EL 표현식에서 사용한 스코프 객체의 속성명에 대한 속성값이 없는 경우에는 EL이 실행되지 않는다. 즉, 속성값이 출력되지 않는다. 
 
 
 


예시2)

 
Car 클래스 선언 (VO 클래스)

package xyz.itwill.el;

//VO 클래스
public class Car {
	private String modelName;
	private String carColor;
	
	public Car() {
		// TODO Auto-generated constructor stub
	}

	public Car(String modelName, String carColor) {
		super();
		this.modelName = modelName;
		this.carColor = carColor;
	}

	public String getModelName() {
		return modelName;
	}

	public void setModelName(String modelName) {
		this.modelName = modelName;
	}

	public String getCarColor() {
		return carColor;
	}

	public void setCarColor(String carColor) {
		this.carColor = carColor;
	}
	
	
}

 
 
[basic_car.jsp]

<%@page import="xyz.itwill.el.Car"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//pageContext 내장객체에 car 속성명을 사용하여 Car 객체를 속성값으로 저장
	pageContext.setAttribute("car", new Car("싼타페","하얀색"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL(expression Language)</h1>
	<hr>
	<h2>EL 미사용</h2>
	<%
		//pageContext 내장객체에 저장된 속성값을 속성명(car)을 사용하여 Car 객체로 반환받아 저장
		Car car=(Car)pageContext.getAttribute("car");
		
		//속성명에 대한 속성값이 없는 경우 [null]을 반환받아 저장
		//Car car=(Car)pageContext.getAttribute("pageCar");
	%>
	<p>자동차 = <%=car %></p>
	<%-- 객체의 필드값을 반환받아 JSP 표현식으로 출력 처리 --%>
	<%-- => [null]이 저장된 참조변수 메소드를 호출할 경우 NullPointerException 발생 --%>
	<p>자동차 모델명 = <%=car.getModelName() %></p>
	<p>자동차 색상 = <%=car.getCarColor() %></p>
	<hr>
	<h2>EL 사용</h2>
	<p>자동차 = ${car}</p>
	<%-- EL 표현식을 사용하여 스코프 속성명으로 객체를 반환받아 메소드 호출 가능 --%>
	<%-- <p>자동차 모델명 = ${car.getModelName()}</p> --%>
	<%-- ${속성명.필드명} 형식의 EL 표현식을 사용하여 스코프 속성명으로 객체를 제공받은 경우 --%>
	<%-- => 객체의 Getter() 메소드를 호출하지 않아도 객체 필드값을 제공받아 출력 처리 가능 --%>
	<%-- => Getter 메소드를 작성 규칙에 맞지 않게 선언한 경우 또는 Getter 메소드가 없는 경우 에러 발생 --%>
	<p>자동차 모델명 = ${car.modelName}</p>
	<p>자동차 색상 = ${car.carColor}</p>
	<%-- EL 표현식의 속성명으로 제공되는 속성값이 없는 경우 EL 미실행 - NullPointerException 미발생 --%>
	<p>자동차 모델명 = ${pageCar.modelName}</p>
</body>
</html>

 
${속성명.필드명} 형식의 EL 표현식을 사용하여 스코프 속성명으로 객체를 제공받은 경우, 객체의 Getter() 메소드를 호출하지 않아도 객체 필드값을 제공받아 출력 처리가 가능하다.
Getter 메소드를 작성 규칙에 맞지 않게 선언한 경우 또는 Getter 메소드가 없는 경우에는 에러가 발생한다. 
EL 표현식의 속성명으로 제공되는 속성값이 없는 경우에는 EL이 실행되지 않기 때문에  NullPointerException가 발생하지 않는다.
 
 


예시3) 
 
[basic_map.jsp]

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//HashMap 객체(Map 객체)를 생성하여 저장
	Map<String, String> carMap=new HashMap<String, String>();

	//HashMap 객체(Map 객체)에 엔트리(Entry : 이름과 값을 하나로 묶어 표현한 요소)를 추가하여 저장
	carMap.put("modelName", "싼타페");
	carMap.put("carColor", "하얀색");
	
	//pageContext 내장객체에 속성값으로 HashMap 객체(Map 객체) 저장
	pageContext.setAttribute("carMap", carMap);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL(Expression Language)</h1>
	<hr>
	<h2>EL 미사용</h2>
	<%
		//pageContext 내장객체에 저장된 속성값을 속성명(carMap)을 사용하여 Map 객체로 반환받아 저장
		//@SuppressWarnings : 프로그램에서 발생되는 경고를 제거하는 어노테이션
		// => value 속성값으로 제거할 경고의 종류를 설정 - 다른 속성이 없는 경우 속성값만 설정 가능
		@SuppressWarnings("unchecked")
		Map<String, String> car=(Map<String, String>)pageContext.getAttribute("carMap");
	%>
	<p>자동차 = <%=car %></p>
	<%-- Map 객체에 저장된 엔트리에서 맵키(Key)를 이용하여 맵값(Value)을 반환받아 JSP 표현식으로 출력 처리 --%>
	<p>자동차 모델명 = <%=car.get("modelName") %></p>
	<p>자동차 색상 = <%=car.get("carColor") %></p>	
	<h2>EL 사용</h2>
	<p>자동차 = ${carMap }</p>
	<%-- ${속성명.맵키} 형식의 EL 표현식을 사용하여 스코프 속성명으로 Map 객체를 제공받아 맵값 출력 처리 --%>
	<%-- => Map 객체의 get() 메소드를 호출하지 않아도 Map 객체의 맵값을 제공받아 출력 처리 가능 --%>
	<p>자동차 모델명 = ${carMap.modelName }</p>
	<p>자동차 색상 = ${carMap.carColor }</p>
</body>
</html>

예시4)
 
Member 클래스 선언

package xyz.itwill.el;

public class Member {
	private String name;//회원이름
	private Car car;//회원자동차
	
	public Member() {
		// TODO Auto-generated constructor stub
	}

	public Member(String name, Car car) {
		super();
		this.name = name;
		this.car = car;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Car getCar() {
		return car;
	}

	public void setCar(Car car) {
		this.car = car;
	}
}

 
 
[member.jsp]
: Member 객체를 생성하여 Request Scope 속성값으로 저장하고 다른 웹프로그램(JSP)으로 포워드 이동하는 JSP 문서 - 요청을 처리하는 웹프로그램 (Model 역할 담당)
 
Request Scope : 스코프 속성을 저장한 웹프로그램과 스레드가 이동된 웹프로그램에서만 속성값을 객체로 반환받아 사용 가능

<%
 	Member member=new Member("홍길동",new Car("싼타페", "하얀색"));
	
	//request 내장객체에 Member 객체를 속성값으로 저장 - Request Scope
	request.setAttribute("member", member);
%>

 
포워드 이동 : 현재 웹프로그램의 명령을 실행하는 스레드를 다른 웹프로그램으로 이동시켜 명령을 실행하여 응답 처리하기 위한 기능을 제공한다.
→ 스레드가 이동되는 웹프로그램은 현재 웹프로그램의 request 객체와 response 객체를 전달한다.

//el 사용하지 않는 경우
request.getRequestDispatcher("member_non_el.jsp").forward(request, response);

//el 사용하는 경우
request.getRequestDispatcher("member_el.jsp").forward(request, response);

 


EL을 사용하지 않은 경우 
 
[member_non_el.jsp]
: [member.jsp] 문서의 Request Scope 속성값을 객체로 반환받아 클라이언트에게 전달하여 응답하는 JSP 문서
→ 요청 웹페이지에 대한 Scope 속성값으로 제공받아 응답 처리하는 웹프로그램(View) 
→ 응답 페이지를 요청한 경우 Request Scope 속성값이 없으므로 NullPointerException 발생 
 

<%@page import="xyz.itwill.el.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Member member=(Member)request.getAttribute("member");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 미사용</h1>
	<hr>
	<%-- <p>회원정보 = <%=member %></p> --%>
	<p>회원의 이름 = <%=member.getName() %></p>
	<%-- <p>회원의 자동차 =<%=member.getCar() %></p> --%>
	<p>회원의 자동차의 모델명 = <%=member.getCar().getModelName() %>
	<p>회원의 자동차의 색상 = <%=member.getCar().getCarColor() %>
</body>
</html>

 


EL 사용
 
[member_el.jsp]
:  [member.jsp] 문서의 Request Scope 속성값을 객체로 반환받아 클라이언트에게 전달하여 응답하는 JSP 문서 
→ 요청 페이지의 대한 실행 결과를 Scope 속성값으로 제공받아 응답 처리하는 웹프로그램(View) 
→ 응답 페이지를 요청한 경우 Request Scope 속성값이 없으면 EL 미실행 - NullPointerException 미발생 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 사용</h1>
	<hr>
	<%-- <p>회원정보= ${member }</p> --%>
	<p>회원의 이름= ${member.name }</p>
	<%-- <p>회원의 자동차= ${member.car }</p> --%>
	<p>회원 자동차의 모델명 = ${member.car.modelName }</p>
	<p>회원 자동차의 색상 = ${member.car.carColor }</p>
	<hr>
	<%-- EL 표현식에서 . 연산자 대신 [] 연산자를 이용하여 필드명(맵키)으로 필드값(맵값)을 
	제공받아 출력 처리 가능 --%>
	<%-- => [] 연산자에 필드명(맵키)를 사용할 경우 반드시 " " 안에 표현 --%>
	<p>회원의 이름= ${member["name"] }</p>
	<p>회원 자동차의 모델명 = ${member["car"]["modelName"] }</p>
	<p>회원 자동차의 색상 = ${member["car"]["carColor"] }</p>
</body>
</html>

 
EL을 사용하면 응답하는 jsp에서 자바코드를 사용하지 않아도 된다.