본문 바로가기
백엔드/웹 개발

9 (EL 표현식)

by study_yeon 2023. 6. 23.

2023.06.20 수업

교재 : 자바 웹 개발 워크북


1. 표현언어( EL : Expression Language )
 - 값(데이터)을 웹페이지에 표현(=뷰를 만드는 것)하는데 사용하는 (서버쪽)태그들
 - JSP 출력을 쉽게 하기 위해 개발되었고 프론트쪽 태그와 쉽게 어울릴 수 있게 기획되었다

   예) JSP 표현식 : <%= "표현식" %>  =>  ${"표현식"}
    % 서블릿 %       {자바영역}

2. 로직은 뷰에 나타나면 안되고 서블릿(자바클래스)로 보내야한다
     화면 출력(View)은 서블릿에 있으면 안되고 JSP에 보내야한다

3. 앞으로는 서블릿/jsp가 아닌 서블릿의 확장 스프링(프레임워크)/jsp를 사용하더라도 jsp에서는 EL/JSTL을 사용
* 프레임워크(Framework) : 프로그램 개발 방법을 큰 틀로 나누어 그 틀을 따라서 만들도록 유도하는 라이브러리 모음

4. EL에 사용가능한 데이터
-  정수형    int
-  실수형    double / float
-  문자열형 String
-  논리형    boolean
-   null        객체참조형

5. EL 식의 연산자
-  산술 : +, -, *, /(or div)
-  관계 : ==(or eq), !=(or ne), <(or lt), >(or gt), <=(or le), >=(or ge)
-  조건 : a ? b : c ( a식이 참이면 b리턴 거짓이면 c리턴 )
-  논리(명제) : &&(or and) 논리곱, ||(or or), |(or not)
-  null 검사 : empty

5-1. 연산자와 EL식 사용법
  ${연산식} 형식으로 사용
  ex) 산술연산 : ${ 5 + 5 }
        관계연산 : ${ 3 > 2 }, ${ 3 eq  3 } 
        조건연산 : ${ (3 > 5) ? "3이 5보다 큽니다." : "3이 5보다 작습니다." } => 앞의 것 리턴
        논리연산자 : ${ (3 > 5) && ( 10 > 9 ) } 
        = ${ (3 > 5) AND ( 10 > 9 ) } => 거짓
        null 여부 : ${ empty input } : input변수의 내용이 비었는가? => 내용이 있으면 false, 없으면 true
<%
   String input = null;
%>
${ empty input } => true


5-2 연산자 우선순위
* 기본순서는 위 -> 아래,  왼쪽 -> 오른쪽
-  []: 배열, .: 객체, (): 괄호묶음
-  unary(양수), -(음수), not, !(논리부정), empty
- *, /, div, %, mod
- <, >, <=, >=, lt, gt, le, ge
- ==, !=, eq, ne
- && and, || or
- ?
 
5-3 HTML태그에 EL표현식을 사용하므로 몇가지 주의사항 필요
- EL표현식은 HTML태그가 아니다.
- EL표현식을 화면에 그대로 출력을 하려면 '\'에 EL표현식을 쓰면 된다
- 그러면 EL표현식을 escape했다고 생각하고 일반 텍스트문자열로 취급된다
ex) \{ 5 + 2 }는 EL표현식이 아니고 그냥 문자열 "{ 5 + 2 }"로 처리함

6. EL로 요청 파라미터 처리해보기
- 보통 request객체의 getParameter()류를 사용하지만 EL을 사용한다면 params 내장객체를 사용
-  EL 요청 내장객체 param : JSP의 request의 getParameter()과 동등 특정 파라미터 키의 값을 알려줌
-  paramValues : 동일한 키 이름을 가지고 전달되는 파라미터의 값들은 배열로 리턴된다.
-  request의 getParameterValues()와 동등



▶ 실습


▷ EL 사용해보기

* jsp명 : /EL/el_01.jsp
-> EL 폴더가 생성되고 아래 el_01.jsp생성 

 

* 화면에 출력하는 3가지 방법
- EL, 표현식, 스크립트릿

webapp아래 jsp파일 만들기

폴더도 생성이 됨




<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL 사용해보기</title>
</head>
<body>

<!-- 표현언어(EL, Expression Language) 
	 이렇게 값을 가져오면 편하다
-->
<!-- EL(Expression Language) -->
${"안녕 나는 EL이야"} <br />

<!-- 표현식 -->
<%= "안녕 나는 표현식이야" %> <br /> 
 
<!-- 스크립트릿 -->
<%
	out.println("안녕 나는 스크립트릿이야");
%>

</body>
</html>



▷  EL 데이터형 사용해보기

* el_02.jsp 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL에서 사용하는 데이터형</title>
</head>
<body>
정수형 : ${ 1000 } <br />
실수형 : ${ 1000.0001 } <br />
문자열형 : ${ "안녕하세요" } <br />
논리형 : ${ true } <br />
<!-- null은 참조하는 주소 없음 -->
null : ${ null } <br />
<!-- 일반적으로 자바에서는 null(=가르키는 주소가 없음)이므로 
	 일반 콘솔에서는 Null Point Exception(NPE)이 나타나나
	 웹에서는 출력할 데이터가 없으면 빈 공백으로 처리됨 -->

</body>
</html>



▷ 연산자 사용해보기

* el_03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>연산자 연습</title>
</head>
<body>
문자열 출력: 연산자 출력
\{ 5 + 2 } : ${ 5 + 2 }<br /> 
\{ 5 - 2 } : ${ 5 - 2 }<br /> 
\{ 5 * 2 } : ${ 5 * 2 }<br /> 
\{ 5 / 2 } : ${ 5 div 2 }<br /> 
\{ 5 mod 2 } : ${ 5 mod 2 }<br />
\${ 5 > 2 } : ${ 5 > 2 }<br /> 
\${ 5 gt 2 } : ${ 5 gt 2 }<br /> 
\${ (5 > 2) ? 5 : 2  } : ${ (5 > 2 ) ? 5 : 2 }<br /> 
\${ (5 gt 2) } || (5 lt 2) } : ${ (5 > 2) || (5 < 2) }<br />
<%
	// 처리결과 input객체의 사용종료
	String input = null;
%> 
<%--2교시 \${ empty input } : ${ empty input }<br /> --%>
<% 
	// 서버쪽 로직
	if (input == null) {
%>
	<!-- HTML 출력 -->
	스크립트릿 사용<br />
	input객체가 현재 비어있습니다.(null)상태
<%	
	}
%>
<!-- JSTL을 사용하여 로직을 태그로 변환 -->
<c:if test=${ empty input }>
	<!-- test=${empty input}의 결과가 null이면 여기 출력 -->
	EL + JSTL 사용<br />
	input객체가 현재 비어있습니다. (null)상태
</c:if>

</body>
</html>

결과값



▷ 요청파라미터처리

* el_04.jsp

- 요청 양식

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>요청파라미터 처리</title>
</head>
<body>
	<form action="el_04.do.jsp" method="">
		좋아하는 계절 :
		<input type="checkbox" name="season" value="Spring" />봄
		<input type="checkbox" name="season" value="Summer" />여름
		<input type="checkbox" name="season" value="Fall" />가을
		<input type="checkbox" name="season" value="Winter" />겨울
		<input type="submit" value="전송" />
	</form>
</body>
</html>

 

* el_04.do.jsp

- 처리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%-- 
디렉티브(지시자) 태그 : 페이지 설정
스크립트 태그<%! %> : 실제 객체의 멤버변수와 멤버 메소드를 만듦
스크립트릿 태그 <% %> : 로컬메소드의 내용 _jsp_service()라는 메소드의 내용으로 들어감
표현식 태그 <%= %> 
--%>    
<%
	// 로컬처리영역
	String seasonArr[] = request.getParameterValues("season");
	out.println("당신이 좋아하는 계절 : ");
	for (String season : seasonArr ) {
		out.println(season + " | ");
	}
%>

▷ EL과 JSTL을 이용한 로그인 예제
* el_05.logon.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>
	<form action="el_05.logon_do.jsp">
		<label for="userid"> 아이디 : </label>
		<input type="text" name="id" id="userid" /> <br />
		<label for="userpwd"> 암 &nbsp; 호 : </label>
		<input type="text" name="pwd" id="userpwd" /> <br />
		<input type="submit" value="login" />
	</form>
</body>
</html>

- label : 양식에서 화면에 출력할때 설명문 

 

* el_05.logon_do.jsp

- 처리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL과 JSTL을 이용한 로그인 예제</title>
</head>
<body>
	<!-- 표현식 내용 출력 -->
	당신이 입력한 정보입니다. (고전적 방식)
	아이디 : <%= request.getParameter("id") %><br />
	비밀번호 : <%= request.getParameter("pwd") %><br />
	
	당신이 입력한 정보입니다. (EL 방식)
	아이디 : ${ param.id }<br />
	비밀번호 : ${ param["pwd"] }<br />
	
</body>
</html>

 


▷null 비교하기
* el_06.null.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.getParameter("id") %> <br />
EL 표현식 : ${ param.id }
</body>
</html>

 

- 주소창에 id값이 있고 없고의 차이 

없을 때       /     있을 때



* el_06.값비교_자바.jsp

- 자바에서는 값을 비교할때 숫자자료는 == 연산자 사용가능함
- 객체를 비교할때는 두가지로 비교해야함
- 같은 객체(주소 참조)인가 비교할때는 == 연산자를 사용함
- 객체의 값이 같은가를 비교하고 싶으면 equals()메소드를 사용함

- EL식을 사용한 비교
EL식은 주소비교를 하지 않고 값 비교를 기본으로 한다

<%@ 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>
<p>
자바에서는 값을 비교할때 숫자자료는 == 연산자 사용가능함
객체를 비교할때는 두가지로 비교해야함
같은 객체(주소 참조)인가 비교할때는 == 연산자를 사용함
객체의 값이 같은가를 비교하고 싶으면 equals()메소드를 사용함
</p>
자바코드를 사용한 비교<br />
== 연산자 사용 결과 : <%= request.getParameter("id") == "seoul" %> <br />
equals() 사용 결과 : <%= request.getParameter("id").equals("seoul") %><br />
<hr />
<br>
<br>
EL식을 사용한 비교<br />
EL식은 주소비교를 하지 않고 값 비교를 기본으로 합니다.
== 연산자 사용 결과 : ${ param.id == "seoul" }<br>

</body>
</html>


- 실행시 ?id=seoul 작성하기
작성하지 않으면 null(상태)이기 때문에 값과 비교가 안되서 500에러 발생 
-> null은 값이 아니고 가르키지 않음의 상태, 빈 것이 아님

없을 때       /     있을 때

 

* el_06.null_에러처리.jsp

- 자바코드를 사용한 NPE(Null Pointer Exception) 처리

<%@ 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>
자바코드를 사용한 NPE(Null Pointer Exception) 처리 <br />
<%
	// 요청 파라미터 id가 null이 아니면 처리를 하고
	if(request.getParameter("id") != null ) {
%>
	== 연산자 사용 결과 : <%= request.getParameter("id") == "seoul" %> <br />
	equals() 사용결과 : <%= request.getParameter("id").equals("seoul") %> <br />
<%
	}else {
		// out.println("id를 전달해 주세요")
%>
	id를 전달해 주세요 <br />
<%		
	}
%>	
EL표현식으로 처리하면 param은 값을 무조건 리턴하므로 NPE예외(500)가 발생하지 않는다

<% %>
</body>
</html>

 

-> param은 빈문자열 또는 값으로 나옴 , null이 없다

▷ EL 표현식으로 간단하게 계산기 만들기

* el_07.간단계산기.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>
	<form action="el_07.간단계산기_결과.jsp">
		숫자 1 : <input type="number" name="num1"	 /><br />
		숫자 2 : <input type="number" name="num2"	 /><br />
		연산자 : <input type="text" name="op" value="+" size="1" /><br />
		<input type="submit" value="보내기" />
	</form>
</body>
</html>

* el_07.간단계산기_결과.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>
	1. 고전적인 방식 : <%-- 스크립트에서의 자바코드 이용 --%>
	<% 
	   // 요청값으로 넘어오는 값은 기본이 모두 문자열이므로 String
	   String str1 = request.getParameter("num1");
	   String str2 = request.getParameter("num2");
	   String op = request.getParameter("op");
	   
	   // 위의 문자열을 활용하려면 숫자로 바꿔야 함
	   int num1 = Integer.parseInt(str1);
	   int num2 = Integer.parseInt(str2);
	   
	   // 2. 스크립트로 출력하는 방식
	   out.println(
			   num1 + " + " + num2 + " = " 
	           + (num1 + num2) + "<hr />");
	%>
	<%-- 표현식을 이용한 방법 --%>
	<%= num1 %> + <%= num2 %> = <%= (num1 + num2) %><hr />
	3. EL표현언어 방식 <%-- 보다 깔끔하고 간단한 코드 --%>
	${ param.num1 } + ${ param.num2 } = ${ param.num1 + param.num2 }	
</body>
</html>



※ EL표현언어를 사용하면 보다 깔끔하고 간단한 코드작성이 가능

EL은 간단한 표현식을 이용해서 데이터를 출력하는 역할이기 때문에 '문'을 처리하기 위해 JSTL라이브러리가 필요함

2023.06.22 - [백엔드/JSP & Servlet] - JSP & Servlet - 8(JSTL + 게시판 만들기)

 

JSP & Servlet - 8(JSTL + 게시판 만들기)

2023.06.19 수업 복습 * 스프링은 서블릿 기반 * 프로토콜주소:// 주소:포트(기본은 생략 가능)/폴더(=웹앱)/쿼리스트링 * ? 데이터 : 쿼리스트링(query String) 키=값(변수=저장데이터) * 요청한 서버주소

dustj0824.tistory.com

 

'백엔드 > 웹 개발' 카테고리의 다른 글

11 게시판 만들기( JDBC 구현 )  (0) 2023.06.23
10 (JDBC 프로그래밍 준비)  (0) 2023.06.23
8(JSTL + 게시판 만들기)  (0) 2023.06.22
7 (게시판 만들기)  (0) 2023.06.22
6(MVC 방식 + 게시판 만들기)  (0) 2023.06.21