본문 바로가기

기타

[jsp] EL구분(Expression Language)란?

EL(Expression Language)이란?

 

 


JSP 버전 2.0부터 적용된 기술로 JavaBean 요소에 저장된 데이터에 쉽게 접근가능하도록 고안된 언어
기존 스크립팅 요소를 %{  표현식  } 으로 대체


 

 

 

 

servlet단에서 넘겨받은 요청/ 응답을

스크립팅 요소로 출력하기 vs EL 구문 활용하기

[vo]

public class Person {

	private String name;
	private int age;
	private String address;
	
	
	public Person() {
	}


	public Person(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}


	public String getName() {
		return name;
	}


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


	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}


	public String getAddress() {
		return address;
	}


	public void setAddress(String address) {
		this.address = address;
	}


	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
	
	
	
}

 

[servlet controller]

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// requestScope에 담기
		request.setAttribute("classRoom", "c강의장");
		request.setAttribute("student", new Person("로봇", 20, "지구별"));
		// sessionScope에 담기
		
		HttpSession session = request.getSession();
		session.setAttribute("academy", "학원");
		session.setAttribute("lecture", new Person("로보트", 20, "ai"));
		// 항상 키값은 중복 x, key값 중복시 덮어쓰기됨
		// 테스트: requestScope sessionScope에 동일한 키값으로 데이터 담아보기
		
		request.setAttribute("scope", "request");
		session.setAttribute("scope", "session");
		
		//applicationScope에 담기
		ServletContext application = request.getServletContext();
		application.setAttribute("scope", "application");
		
		// 응답 뷰 지정
		// 포워딩 방식(파일 경로제시) 
		RequestDispatcher view = request.getRequestDispatcher("views/1_EL/01_el.jsp");
		view.forward(request, response);
		
		
		// sendRedirect (contextPath 로부터 재요청을 보낼경우 사용)
	}

[jsp view]

1. 스크립팅 요소로 값 뽑기

<%
		// requestScope에 담긴 값 뽑기 
		String classRoom = (String)request.getAttribute("classRoom");
		Person student = (Person)request.getAttribute("student");
		
		// session에 담긴 값 뽑기
		String academy = (String)session.getAttribute("academy");
		Person lecture = (Person)session.getAttribute("lecture");
		// 내장객체라서 request, session은 임포트 없이 쓸 수 잇는 것임!
		
		
	%>

	<p>
		학원명 : <%= academy %><br>
		강의장: <%= classRoom %><br>
		강사정보: <%= lecture.getName() %>, <%= lecture.getAge() %>, <%= lecture.getAddress() %><br>
	</p>
	수강생 정보 <br>
	<ul>
		<li>이름: <%= student.getName() %></li>
		<li>나이: <%= student.getAge() %></li>
		<li>주소: <%= student.getAddress() %></li>
	
	
	</ul>

 * 존재하지 않는(null)인 값을 출력식에서 출력하면 : 500 error (nullPointerExcepiton ) 발생 

 

 

2. EL 표현식 사용하기

 

EL은 getXXXX(getAttribute, getter메소드)을 통해 값을 추출할 필요 없이

key값만 제시하여 값에 접근 가능

scope제시시 해당  scope에 해당하는 밸류값을 가져올 수 있음 
기본적으로 EL은 jsp내장객체를 구분하지 않고 자동적으로 모든 내장객체에서 키값을 검색한 후 존재하는 경우 값을 가져옴 (검색순서: page -> request -> session-> application)

 

 

	학원명: ${ academy } 
	강의장: ${ classRoom }
	강사정보: ${ lecture.name }, ${lecture.age }, ${lecture.address }
    
    
    
    
    수강생 정보
	 	<ul>
	 		<li>${student.name }</li>
	 		<li>${student.age }</li>
	 		<li>${student.address }</li>		 	
	 	</ul>

 

* 여기서 질 문: vo에서 클래스를 정의할 때 접근제한자를 private으로 만들었기 때문에 직접접근이 안되어야 하는데EL에서는 getter메소드 없이 필드에 직접접근 하고있다..! 

 

 EL 표현식 내에서 [데이터타입.필드명]을 통해 private으로 설정된 필드에 직접접근하는 것처럼 보이지만 실제  EL 내부에서는 자바빈의 getter메소드를 찾아서 호출하는 구조임
 즉, vo에 getter가 없으면 EL에서도  [키값.필드명]으로 값 뽑는 것이 불가능 

 

 

* 존재하지 않는(null)인 값을 출력식에서 출력하면 : 아무것도 나오지 않음 

 (nullPointer 이젠 안녕...~)

 


EL로 Data를 가져오는 순서


EL사용시 각 내장객체들에 저장된 키값이 중복되는 경우

 

EL구문은 공유범위가 가장 작은 scope에서부터 해당 키값을 검색함
page- >request->session->application순으로 키값을 찾음

 

따라서

controller단 servlet에서 setAttribute메소드에 
동일한 key 값으로 pageScope/request/session/application 객체를 각각 담은 후, 
view단 jsp에서 ${ key } 출력시 가장 범위가 작은 page의 value 값이 출력됨

 

특정"scope" key에 담긴 value를 뽑고 싶다면

 

-> 직접 Scope영역을 지정해서 접근하기

	
	pageScope에 담긴 값: ${ scope } 또는 ${ pageScope.scope }<br>
	requestScope에 담긴 값: ${ requestScope.scope }<br>
	sessionScope에 담긴 값: ${ sessionScope.scope }<br>
	applicationScope에 담긴 값: ${ applicationScope.scope }<br>
	
	Quiz: ${ sessionScope.classRoom }<br>
	아무것도 안나온다. session의 classRoom 키 -밸류로 담은 값이 없어서

 

 

Reference

 

https://docs.oracle.com/javaee/6/tutorial/doc/bnahq.html

 

Overview of the EL - The Java EE 6 Tutorial

Overview of the EL The EL allows page authors to use simple expressions to dynamically access data from JavaBeans components. For example, the test attribute of the following conditional tag is supplied with an EL expression that compares 0 with the number

docs.oracle.com