코딩 화이팅 2023. 3. 10. 15:11

EL(Expression Language)

  • 표현 언어라고 하며 값(data)를 웹 페이지에 표시하는데 사용되는 태그이다.
  • JSP 스크립트의 표현식(<%=%>)을 대신하여 속성값을 쉽게 출력할 수 있도록 고안된 언어이다.
    스크립트 표현식 : <%= expr %>  EL : ${expr  }
  • EL 표현식에서 Map 객체 또는 Java Bean 객체의 경우 도트(.) 연산자를 사용하여 속성을 출력할 수 있다. 이 때 오른쪽의 값은 Map 객체의 경우 key, Java Bean의 경우 Bean property이다.
  • JSP 영역 기본 객체(page, request, session, application) 속성 사용가능
  • 수치, 관계, 논리연산 제공
  • 자바 클래스 메서드 호출 기능 제공
  • 표현언어 기본 객체 제공(param, paramValues)
<%@ 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>
	문자열: ${"hello" }<br>
	정수형: ${10 }<br>
	실수형: ${10.25 }<br>
	논리형: ${true }<br>
	null: ${null }<br>
	EL표현식에서 null은 아무것도 출력되지 않는다.
</body>
</html>

-+

 

scope

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>연산자</title>
</head>
<body>
	<%
	pageContext.setAttribute("name", "page yang");
	request.setAttribute("name", "request yang");
	session.setAttribute("name", "session yang");
	application.setAttribute("name", "application yang");
	 %>
	 
	 ${name }<br>
	 EL의 name 속성은 가장 가까운 순서대로 찾는다 page->request->session->application
	 
	 <%=pageContext.getAttribute("name") %><br>
	 page 속성 : ${pageScope.name }<br>
	 request 속성 : ${requestScope.name }<br>
	 session 속성 : ${sessionScope.name }<br>
	 application 속성 : ${applicationScope.name }<br>
</body>
</html>

만약 pageContext.setAttribute를 지운다면?

${name}은 가장 가까운 순서대로 찾기 때문에 page다음 session값을 반환하고 getattribute는 null을 출력 EL값도 null이지만 아무것도 뜨지 않는다.

package com.ssafy.servlet;

import java.io.IOException;

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("/add")
public class AddServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		int num1 = 10;
		int num2 = 20;
		int add = num1+num2;
		
		req.setAttribute("num1", num1);
		req.setAttribute("num2", num2);
		
		req.getRequestDispatcher("06_addResult.jsp").forward(req, resp);
		
	}
}
===============================================================================
<%@ 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>
	<%
		int num1 = (Integer)request.getAttribute("num1");
// 	request의 반환값이 object이기 때문에 interger로 형변환을 시켜줘야한다.
		int num2 = (Integer)request.getAttribute("num2");
	%>
	<%=num1 %> + <%=num2 %> = <%=num1+num2 %> <hr>
	
	<!-- EL -->
	${num1 }+${num2 }=${num1+num2 }
<!-- 	제일 처음으로 page영역을 뒤져보고 없으니 request영역으로 찾아가 찾을 수 있었다. -->
</body>
</html>

param

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EQ</title>
</head>
<body>
	${param.id }<br>
</body>
</html>

아무것도 뜨지 않는다. 이상태에서 주소값에 queryString 값을 넣어 get방식으로 값을 주게 되면 값이 생길 수 있다.

위 사진과 주소창을 비교하면 된다.?를 치고 id값을 넣어주었다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EQ</title>
</head>
<body>
	${param.id }<br>
	== : <%= request.getParameter("id") == "ssafy" %> <br>
	equals() : <%= request.getParameter("id").equals("ssafy") %> <br>
<!-- 	String 값은 ==으로 하면 flase -->
	
	== (EL) : ${param.id == "ssafy" } <br>
<!-- 	EL표현식 안에서 ==은 equal랑 같다  -->
	eq (EL) : ${param.id eq "ssafy" } <br>
</body>
</html>

<%@ 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>
<!-- 	EL표기법 앞에 \는 EL로 보지 말고 그냥 문자열로 봐줘라는 의미 -->
	\${5 div 2} : ${5 div 2 }<br>
<!-- 	나누기 -->
	\${5 gt 2} : ${5 gt 2 }<br>
<!-- 	 gt : > -->
</body>
</html>

  • EL 식은 연산자를 포함할 수 있으며, 산술 연산, 조건 연산, 논리 연산, 관계 연산을 수행할 수 있다.
  • 또한 일반적인 연산 이외에 null 연산을 수행할 수 있다. empty 연산자는 검사할 객체가 null인지 아닌지 검사하기 위해서 사용된다.(null, "", 요소가 없는 list, map, collection은 True)
    ${ empty name}

JSTL(JSP Standard Tag Library)

  • JavaEE  기반의 웹 어플리케이션 개발을 위한 컴포턴트 모음
  • JSP 스크립트와 html 코드가 섞여서 복잡한 구조를 만듬. 이를 간결하게 작성하기 위해서 자바코드를 태그 형태로 작성해 놓은 것
  • 유용한 커스텀 태그들을 모아서 표준화한 것

JSTL 기능

  • 간단한 프로그램 로직 구현 기능-변수선언, if 문장, for문 등
  • 데이터 출력 포맷 설정
  • DB 입력, 수정, 삭제, 조회 기능
  • 문자열 처리 함수
  • XML문서 처리
  • 위 기능들을 가지고 있는 라이브러리 : core, format, sql, functions, xml

c:out

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- core를 등록 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL</title>
</head>
<body>
	<c:out value="Hello SSAFY!"></c:out> <br>
	<c:out value="Hello SSAFY!"/> <br>
<!-- 	둘은 같다 -->

</body>
</html>

c.set

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- core를 등록 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL</title>
</head>
<body>
<!-- c:set 을 써보자
		scope	: 어떤 영역에다가 내가 해당 값을 집어 넣을지!!!!! 생략하면 page 
		var 	: 변수이름
		value	: 값
	
	 -->
	<c:set var="msg" value="Hello1"/> 
	${msg }<br>
	
<!-- 	이렇게도 쓸 수 있다. -->
	<c:set var="msg2">Hello2</c:set> 
	${msg2 }<br>
</body>
</html>

c:if

<%@ 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="09_fruitResult.jsp">
		<select name="fruit">
			<option value="1">귤</option>
			<option value="2">망고</option>
			<option value="3">딸기</option>
			<option value="4">수박</option>
			<option value="5">멜론</option>
		</select>
		<input type="submit">
	</form>
</body>
</html>
=============================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>과일선택</title>
</head>
<body>
	<c:if test="${param.fruit==1}">
		<div style="color: orange">귤</div>
	</c:if>
	<c:if test="${param.fruit==2}">
		<div style="color: yellow">망고</div>
	</c:if>
	<c:if test="${param.fruit==3}">
		<div style="color: red">딸기</div>
	</c:if>
	<c:if test="${param.fruit==4}">
		<div style="color: green">수박</div>
	</c:if>
	<c:if test="${param.fruit==5}">
		<div style="color: green">멜론</div>
	</c:if>	
</body>
</html>

c:when

<%@ 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="09_fruitResult.jsp">
		<select name="fruit">
			<option value="1">귤</option>
			<option value="2">망고</option>
			<option value="3">딸기</option>
			<option value="4">수박</option>
			<option value="5">멜론</option>
		</select>
		<input type="submit">
	</form>
</body>
</html>

귤과 딸기를 선택하면 위와 같이 나오지만 그 외에 과일들을 선택하면 그 외 과일들로 출력된다.

c:foreach

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>영화선택</title>
</head>
<body>
	<%
		String[] movieList = {"인셉션", "타짜", "아이언맨", "해리포터", "클레멘타인"};
		pageContext.setAttribute("movieList", movieList);
	%>
	
	<table border="1">
		<tr>
			<th>index</th>
			<th>count</th>
			<th>title</th>
		</tr>
		<c:forEach var="movie"  items="${movieList}" 
				varStatus="status" begin="0" end="3" step="2">
<!-- 			varStatus : status.index와 status.count를 쓰기 위한 변수 -->
<!-- 			begin(입력한 인덱스)부터 end(입력한 인덱스)까지 -->
<!-- 			step만큼 건너뛴다.				 -->
			<tr>
				<td>${status.index }</td>
<!-- 				index는 0부터 -->
				<td>${status.count }</td>
<!-- 				count는 1부터 -->
				<td>${movie }</td>
			</tr>	
		</c:forEach>
	
	</table>
</body>
</html>

checkbox

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>반찬</title>
</head>
<body>
	<h2>반찬을 골라보자</h2>
	<form action="13_checkBoxResult.jsp">
		<input type="checkbox" name="dish" value="맥주">맥주
		<input type="checkbox" name="dish" value="교수님의사랑">교수님의사랑
		<input type="checkbox" name="dish" value="미나리">미나리<br>
		<input type="checkbox" name="dish" value="장조림">장조림
		<input type="checkbox" name="dish" value="삼겹살">삼겹살
		<input type="checkbox" name="dish" value="시랙기국">시랙기국<br>
		
		<button>구매</button>
	
	</form>
	
</body>
</html>
=============================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>반찬</title>
</head>
<body>
	<h2>오늘 나의 반찬은?</h2>	
	<c:forEach var="item" items="${paramValues.dish}" varStatus="status">
<!-- 	param은 맨앞의 한개의 값만 가져오고 paramValues는 모든 값들을 가져온다. -->
		${item }<c:if test="${not status.last }">,</c:if>
<!-- 		status.last : 값들의 마지막 값을 리턴 -->
<!-- 			마지막 값이 아니라면 ,를 출력해라 -->
	</c:forEach>
</body>
</html>

c:forTokens

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>토큰나누기</title>
</head>
<body>
	<c:forTokens var="city" items="서울.대전,구미.광주,부울경" delims=",">
<!-- 	delim : 구분자 -->
		${city }<br>
	</c:forTokens>
	<hr>
	<c:forTokens var="city" items="서울.대전,구미.광주,부울경" delims=",.">
		${city }<br>
	</c:forTokens>	
</body>
</html>

c:catch

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>예외처리</title>
</head>
<body>
	<c:catch var="errmsg">
		예외 발생 전<br>
		<%= 1/0 %>
<!-- 		예외가 발생하면 errmsg에 저장되고 밑은 실행되지 않는다. -->
<!-- 		만약 1/1이면 예외가 발생되지 않기 때문에 정상 출력되고 밑까지 실행되어진다. -->
		예외 발생 후<br>
	</c:catch>
	${errmsg }
</body>
</html>