Servlet / JSP #13 Expression Language

underlier12·2020년 1월 25일
0

SERVLET&JSP

목록 보기
13/16

13. Expression Language

View를 위한 데이터 추출 표현식

View 단의 자바 코드를 마저 들어내고 EL을 통해 통일성을 맞출 수 있게 한다.

image.png

image.png

위와 같이 변수, 리스트, 맵 등등 다양한 값들을 편리하게 불러낼 수 있다

EL의 데이터 저장소

저장 객체에서 값을 추출하는 순서

아래와 같이 서버상에 존재하는 저장소들에게서 값을 추출해 올 수 있게 된다. application, session은 기본적인 저장소 역할을 수행하며 request의 경우 forwarding 작업을 할 때 서블릿 간 모델을 전달할 때 사용되며 page는 pageContext 객체로 페이지 전역에서 사용된다.

cnt라는 변수의 값을 찾을 때 변수명들이 각 저장소에 모두 있다고 하더라도 아래와 같이 우선순위대로 검색하기 때문에 우선순위를 고려하거나 Scope를 통해 해당 저장소의 값을 꺼내도록 한정사를 붙인다.

image.png

EL을 통해 상기 저장소의 값들을 쉽게 뽑아낼 수 있다.

클라이언트 값 추출

위의 4대 저장소 뿐만아니라 기타 저장된 값들을 아래와 같은 객체들로부터 가져올 수 있다.

image.png

image.png

image.png

EL 연산자

연산자들

EL 연산자들은 여타 연산자들과 거의 동일하지만 대신 축약어들도 사용할 수 있도록 설계되어 있다. 그 이유는 html 자체가 태그<>를 포함하고 있기에 가독성 등의 이유로 연산자들의 기호보다는 축약어들을 권장한다. (xml 등에서는 허용이 안되는 부분도 있음)

image.png

image.png

empty 연산자는 자주 쓰이며 null 이나 ""(빈문자열)일 경우 true 반환

EL 코드 구현

Spag.java

package com.newlecture.web;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/spag")
public class Spag extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request
			, HttpServletResponse response) 
					throws ServletException, IOException {
		int num = 0;
		String num_ = request.getParameter("n");
		if(num_ != null && !num_.equals("")){
			num = Integer.parseInt(num_);
		}
		
		String result;
		if(num % 2 != 0)
			result = "홀수";
		else
			result = "짝수";
		
		// request 저장소를 통해 전달
		request.setAttribute("result", result);
		
		// 배열 전달
		String[] names = {"newlec", "dragon"};
		request.setAttribute("names", names);
		
		// Map 전달
		Map<String, Object> notice = new HashMap<>();
		notice.put("id", 1);
		notice.put("title", "EL GOOD");
		request.setAttribute("notice", notice);
		
		// Forward - 동일한 디렉토리 내 있기에 경로 지정 안함
		RequestDispatcher dispatcher
			= request.getRequestDispatcher("spag.jsp");
		dispatcher.forward(request, response);
	}
}

spag.jsp

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

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("result", "hello");
%>
	<%=request.getAttribute("result") %>입니다.
	${requestScope.result}<br>
	${names[1]}<br>
	${notice.title}<br>
	${result}<br>
	${empty param.n?'값이 비어있습니다.':param.n}<br>
	${param.n/2}<br>
	${header.accept}<br>
</body>
</html>

EL에서는 정수(문자열)를 정수로 나눠도 실수가 반환 됨 (JSTL에서 컨트롤 가능)

profile
logos and alogos

0개의 댓글