그럼에도 불구하고

👨‍💻

[Servlet/JSP] EL (Expression Language) 본문

Java, Servlet/Servlet, Jsp

[Servlet/JSP] EL (Expression Language)

zenghyun 2022. 11. 5. 01:25

EL에 대해 알아보자 

 

 

 

[ EL : Expression Language) ]

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

 

 

우선, EL을 사용하기 전에 java file과 jsp file로 값을 출력해보자 

 

spag.java

package com.zenghyun.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;
// controller
@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.setAttribute("result", result); // 여기에 result를 담음
		
		

		RequestDispatcher dispatcher =	request.getRequestDispatcher("spag.jsp");
		
		dispatcher.forward(request, response); 
		//	request에 result가 저장됨 

	}
	}

 

 

spag.jsp

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

</head>
<body>
  <%=request.getAttribute("result") %>

</body>
</html>

 

출력

 

실행하면 짝수가 출력된다. 

 

spag.java에서 num이 0으로 선언되었고, num이 짝수면 짝수를 출력하기 때문

 

여기서

 

 ? n=3을 입력하면

 

 

 

num이 홀수이기 때문에 홀수가 출력된다.

 

 

여기서 EL을 사용하게 되면 

 

 view에 코드 블록을 쓸 필요가 없고, java 코드도 안써도 되니까 view를 완전히 분리할 수 있다.

 

즉, request에서 데이터를 쉽게 꺼낼 수 있다.

 

ex) requestgetAttrubute(“cnt”) -> ${cnt}

 

${}를 사용하면 된다.

 

 

그렇다면 EL은 어떤 방식으로 사용하는 걸까?

 

 

[ EL의 데이터 저장소 ]

 

내장 객체 기능
pageScope Page 영역의 생명주기에서 사용되는 저장소
requestScope Request 영역의 생명주기에서 사용되는 저장소
sessionScope Session 영역의 생명주기에서 사용되는 저장소
applicationScope Application 영역의 생명주기에서 사용되는 저장소
param 파라미터 값을 저장하고 있는 저장소
paramValues 파라미터 값을 배열로 저장하고 있는 저장소
header Header 정보를 저장하고 있는 저장소
headerValues Header 정보를 배열로 저장하고 있는 저장소
cookie 쿠키 정보를 저장하고 있는 저장소
initParam 컨텍스트의 초기화 파라미터를 저장하고 있는 저장소
pageContext 페이지 범위의 컨텍스트 저장소

 

ex) <%=pageContext.getRequest(). getMethod() %> //객체를 얻고 싶을 때

 

el에서는 함수를 호출하는 방식으로 무언갈 사용할 수 없다. 속성을 쓰는 것처럼 써야 함

단 el에서는 함수를 호출할 수 없는데 getter는 사용할 수 있다.

단, get이라는 method명은 빼야 한다.

함수 호출이 아닌 것처럼 소괄호를 빼야 함

-> ${pageContext.request.method}

 

 

 

저장소 종류 4가지:  page객체, request객체, session객체, application객체

 

4개의 저장소에 우연히 같은 키워드를 심으면 어떻게 될까?

 

오류가 나지 않는다는 건, 충돌이 나지 않는다는거고, 충돌이 나지 않는다는건, 우선순위가 있다는 뜻

page -> request -> session -> application 순서로 진행된다.

 

 

Q) page, request, session에 cnt가 있을 때,  session 객체에만 있는 cnt를 뽑아오고 싶다면?

 

-> ${sessionScope.cnt}!

 

 

 

 

 

[ EL의 연산자 ]

[].

()

not!, Empty

*,  /,  div,  %,  mod

+,  -

<lt(less then),     > gt(greater then),    <=(less equal) ,    >=(greater equal)

==(equal),    !=(not equal)

&&,    and

||,    or

? : (삼항 연산자) 

 

 

여러 가지 값들을 ${}로 받아보자.

 

 

spag.java

package com.zenghyun.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;
// controller
@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.setAttribute("result", result); // 여기에 result를 담음
		
		
		String [] names = {"zenghyun", "hi"};
		request.setAttribute("names", names);
		Map<String, Object> notice = new HashMap<String,Object>();
		notice.put("id", 1);
		notice.put("title", "zenghyun");
		request.setAttribute("notice", notice);
	
		
		RequestDispatcher dispatcher =	request.getRequestDispatcher("spag.jsp");
		
		dispatcher.forward(request, response); 
		//	request에 result가 저장됨 

	}
	}

 

spag.jsp

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%
pageContext.setAttribute("aa","hello");
pageContext.setAttribute("result","hello");
%>
</head>
<body>
 <!--  <%=request.getAttribute("result") %>입니다. -->
 
 <!-- view -->
 ${result}<br>

 ${names[0]}<br>
 ${names[1]}<br> 
 ${notice.id}<br>
 ${notice.title}<br>
 ${aa}<br> 
 <!-- 페이지 객체 뽑아냄 -->
 ${requestScope.result}
 <!-- 얘는 짝수 홀수를 가져오고 -->
 ${result}<br> 
 <!-- 얘는 hello를 출력함 -->
 ${param.n}<br>
 ${header.host}<br>
 ${header.accept}<br>
 <!-- accept란? 브라우저에 요청을 할 때 내가 읽을수 있는 문서의 종류,타입을 서버에 알려줌 
 때에 따라서는 클라이언트의 환경을 확인해서 그 클라이언트에게 전문화된 내용을 보내주고 싶을 때는 서버 프로그래머가 확인해야한다.  -->
 ${param.n > 3}<br>
 <!-- 꺽음쇠를 쓰는건 바람직하지 않다. -->
 ${param.n gt 3}<br>
 ${empty param.n }<br>
 <!-- null이거나 빈 문자열이면 true 값 있으면 false -->
  ${empty param.n? '값이 비어있습니다':param.n }<br>
  ${param.n/2}<br>
  <!-- 정수를 정수로 나눠도 소수점이 나온다. -->
</body>
</html>

 

 

출력

Comments