본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 66일차 (2023-08-25) 자바 프로그래밍_EL 사용법

by prometedor 2023. 8. 26.
- 서블릿 프로그래밍
  - EL 사용법

 

EL 사용법

EL 표기법

el/ex01.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body> 
<h1>EL 표기법</h1>
<%-- 
- EL(Expression Language)은 콤마(.)와 대괄호([]) 등을 사용하여 객체의 프로퍼티나,
  리스트, 셋, 맵 객체의 값을 쉽게 꺼내고 설정하게 도와주는 문법이다.
  특히 값을 꺼낼 때는 OGNL 표기법을 사용한다.
  
- OGNL(Object Graph Navigation Language)?
  객체의 프로퍼티 값을 가리킬 때 사용하는 문법이다.
  파일의 경로처럼 객체에 포함된 객체를 탐색하여 값을 쉽게 조회할 수 있다.
  
- 문법
    ${ 객체명.프로퍼티명.프로퍼티명.프로퍼티명 }
    ${ 객체명["프로퍼티명"]["프로퍼티명"]["프로퍼티명"] }
    
- EL에서 사용할 수 있는 객체?
    pageContext 
      - JSP의 PageContext 객체
    servletContext 
      - ${ pageContext.servletContext.프로퍼티명 }
        자바코드 => pageContext.getServletContext().get프로퍼티()
    session 
      - ${ pageContext.session.프로퍼티명 }
        예) $ { pageContext.session.name }
        => pageContext.getSession().getName();
                    
    request 
      - ${ pageContext.request.프로퍼티명 }
    response
    
    param 
      - ${ param.파라미터명 }
        => request.getParameter("파라미터명");
    paramValues 
      - ${ paramValues.파라미터명 }
        => request.getParameterValues("파라미터명");
    header 
      - ${ header.헤더명 }
        => request.getHeader("헤더명");
    headerValues 
      - ${ headerValues.헤더명 }
        => request.getHeaders("헤더명");
    cookie 
      - ${ cookie.쿠키명 }
      - ${ cookie.쿠키명.name }
      - ${ cookie.쿠키명.value }
    initParam 
      - ${ initParam.파라미터명 }
    
    => 보관소에서 값을 꺼내는 문법
    pageScope 
      - ${ pageScope.객체이름 }
        => pageContext.getAttribute("객체이름");
    requestScope 
      - ${ requestScope.객체이름 }
        => request.getAttribute("객체이름");
    sessionScope 
      - ${ sessionScope.객체이름 }
        => session.getAttribute("객체이름");
        예) ${ sessionScope.name }
        => session.getAttribute("name");
    applicationScope 
      - ${ applicationScope.객체이름 }
        => application.getAttribute("객체이름");
--%>

</body>
</html>

 

EL - 보관소에 값 꺼내기

el/ex02.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - 보관소에 값 꺼내기</h1>
<%
pageContext.setAttribute("name", "홍길동");
request.setAttribute("name", "임꺽정");
session.setAttribute("name", "유관순");
application.setAttribute("name", "안중근");
%>

PageContext 보관소 : ${pageScope.name}<br>
PageContext 보관소 : <%=pageContext.getAttribute("name")%><br>

ServletRequest 보관소 : ${requestScope.name}<br>
ServletRequest 보관소 : <%=request.getAttribute("name")%><br>

HttpSession  보관소 : ${sessionScope.name}<br>
HttpSession 보관소 : <%=session.getAttribute("name")%><br>

ServletContext 보관소 : ${applicationScope.name}<br>
ServletContext 보관소 : <%=application.getAttribute("name")%><br>

</body>
</html>

=>

ㄴ 보관소에서 값 꺼내는 방법

 

=>

 

EL - 보관소에 값 꺼내기 II

ex03.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - 보관소에 값 꺼내기 II</h1>
<pre>
- 보관소의 이름을 지정하지 않으면 다음 순서로 값을 찾는다.
    pageScope ==> requestScope ==> sessionScope ==> applicationScope
    
- 보관소에 저장된 값을 찾지 못하면 빈 문자열을 리턴한다.
</pre> 
<%
// 세션이나 서블릿 컨텍스트 보관소에 저장된 데이터를 초기화시킨다.
session.removeAttribute("name");
application.removeAttribute("name");

pageContext.setAttribute("name", "홍길동");
request.setAttribute("name", "임꺽정");
session.setAttribute("name", "유관순");
application.setAttribute("name", "안중근");
%>

<h2>보관소에서 값 꺼내기 : ${name}</h2> 
PageContext 보관소 : ${pageScope.name}<br>
ServletRequest 보관소 : ${requestScope.name}<br>
HttpSession  보관소 : ${sessionScope.name}<br>
ServletContext 보관소 : ${applicationScope.name}<br>
</body>
</html>

=>

=>

=>

=>

ㄴ 해당 코드 주석 제거

=>

=>

ㄴ해당 코드 주석 풀어주기

=>

=>

ㄴ 해당 코드 주석 제거

=>

 

 

EL - 리터럴(literal)

ex04.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - 리터럴(literal)</h1>
<pre>
- EL에서 문자열이나 숫자를 표현하는 방법
</pre> 

문자열: ${"홍길동"}<br>
문자열: ${'홍길동'}<br>
정수: ${100}<br>
부동소수점: ${3.14}<br>
논리값: ${true}<br>
null: ${null}<br>

</body>
</html>

=>

=>

 

EL - 배열에서 값 꺼내기

ex05.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - 배열에서 값 꺼내기</h1>
<%
pageContext.setAttribute("names", new String[]{"홍길동","임꺽정","유관순"});
%>

${names[0]}<br>
${names[1]}<br>
${names[2]}<br>
${names[3]}<br>

</body>
</html>

=>

=>

=>

ㄴ names[3] 에 값이 없어도 에러가 발생하지 않고 존재하는 값만 출려됨

 

 

EL - List 객체에서 값 꺼내기

ex06.jsp

<%@page import="java.util.ArrayList"%>
<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - List 객체에서 값 꺼내기</h1>
<%
ArrayList<String> nameList = new ArrayList<>();
nameList.add("김구");
nameList.add("안중근");
nameList.add("윤봉길");

pageContext.setAttribute("names", nameList);
%>
${names[0]}<br>
${names[1]}<br>
${names[2]}<br>
${names[3]}<br>

<%-- 보관소가 아닌 로컬 변수는 EL에서 사용할 수 없다. --%>
${nameList[0]}<br>

</body>
</html>

 

=>

=>

=>

ㄴ 보관소 이름은 names 이므로 names 로만 값을 꺼낼 수 있음

ㄴ 일반 리스트 이름인 nameList 로는 값을 꺼낼 수 없음

 

 

EL - Map 객체에서 값 꺼내기

ex07.jsp

<%@page import="java.util.HashMap"%>
<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - Map 객체에서 값 꺼내기</h1>
<%
HashMap<String,Object> map = new HashMap<>();
map.put("s01", "김구");
map.put("s02", "안중근");
map.put("s03", "윤봉길");
map.put("s04 ^^", "오호라");

pageContext.setAttribute("map", map);
%>

${map["s01"]}<br>
${map['s01']}<br>
${map.s01}<br>

<%-- 프로퍼티 이름이 변수 이름 짓는 규칙에 맞지 않다면
     다음과 같이 OGNL 표기법을 쓸 수 없다. --%>
<%-- 
${map.s04 ^^}<br> 
--%>

${map["s04 ^^"]}<br>
${map['s04 ^^']}<br>

</body>
</html>

=>

ㄴ Map 객체에서 값을 꺼내는 방법

=>

=>

ㄴ 프로퍼티 이름이 변수 이름 짓는 규칙에 맞지 않다면 OGNL 표기법 사용 불가
=>

ㄴ 오류 발생

 

 

EL - 일반 객체에서 값 꺼내기

ex08.jsp

<%@page import="eomcs.vo.Member"%>
<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - 일반 객체에서 값 꺼내기</h1>
<%
Member member = new Member();
member.setNo(100);
member.setName("홍길동");
member.setEmail("hong@test.com");
member.setTel("1111-2222");

pageContext.setAttribute("member", member);
%>

${member.getNo()}<br>
${member.no}<br>
${member["no"]}<br>
${member['no']}<br>

</body>
</html>

=>

ㄴ ${member.getNo()} 대신 ${member.no} 를 이용할 수 있음

    => no 는 프로퍼티 값

=>

 

 

 

EL - 연산자

ex09.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL</title>
</head>
<body>
<h1>EL - 연산자</h1>

<h2>산술연산자</h2>
100 + 200 = ${100 + 200}<br>
100 - 200 = ${100 - 200}<br>
100 * 200 = ${100 * 200}<br>
100 / 200 = ${100 / 200}<br>
100 div 200 = ${100 div 200}<br>
100 % 200 = ${100 % 200}<br>
100 mod 200 = ${100 mod 200}<br>

<h2>논리연산자</h2>
true && false = ${true && false}<br>
true and false = ${true and false}<br>
true || false = ${true || false}<br>
true or false = ${true or false}<br>
!true = ${!true}<br> 
not true = ${not true}<br>

<h2>관계 연산자</h2>
100 == 200 = ${100 == 200}<br>
100 eq 200 = ${100 eq 200}<br>
100 != 200 = ${100 != 200}<br>
100 ne 200 = ${100 ne 200}<br>
100 > 200 = ${100 > 200}<br>
100 gt 200 = ${100 gt 200}<br>
100 >= 200 = ${100 >= 200}<br>
100 ge 200 = ${100 ge 200}<br>
100 &lt; 200 = ${100 < 200}<br>
100 lt 200 = ${100 lt 200}<br>
100 &lt;= 200 = ${100 <= 200}<br>
100 le 200 = ${100 le 200}<br>

<h2>empty</h2>
<p>보관소에 해당 객체가 없는지 검사한다. 없으면 true, 있으면 false.</p>
<%
pageContext.setAttribute("name", new String("홍길동"));
%>
name 값이 없는가? ${empty name}<br>
name2 값이 없는가? ${empty name2}<br>

<h2>조건 연산자 - 조건 ? 식1 : 식2 </h2>
name == "홍길동" : ${name == "홍길동" ? "맞다!" : "아니다!"}<br>

<%
String a = "홍길동";
String b = new String("홍길동");
if (a == b) { // 인스턴스의 주소를 비교!
    out.println("== : 같다!<br>");
} else {
    out.println("== : 다르다!<br>");
}

if (a.equals(b)) { // 인스턴스의 값을 비교!
    out.println("equals() : 같다!<br>");
} else {
    out.println("equals() : 다르다!<br>");
}
%>
</body>
</html>

=>