티스토리 뷰

WEB/DynamicWeb

[JSP] JSTL - core

춘햄 2021. 4. 23. 17:45

1. JSTL?

JSTL의 정식 명칭은 자바서버 페이지 표준 태그 라이브러리(JavaServer Pages Standard Tag Library)이고 줄여서 JSTL이라 부른다.

 

JSTL은 JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공한다. 표준화된 태그 셋을 사용하여 자바 코드가 들락거리는 것보다 더 코드의 유지보수와 응용 소프트웨어 코드와 사용자 인터페이스 간의 관심사의 분리로 이어지게 한다.

 

직전에 포스팅한 EL 표현식 또한 JSTL의 한 종류이다.


JSTL.core의 사용법

JSTL은 라이브러리이기 때문에 사용하기전에 core를 지시자에 추가해주어야 한다.

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

지시자로 선언한 후에 prefix 속성에 지정해둔 값을 사용하여 JSTL의 태그들을 불러와 사용하면 된다.

일반적으로 core에서 사용하는 태그 종류는 다음과 같다.

 

<c:set> 변수명에 값을 할당
<c:out> 값을 출력
<c:if> 조건식에 해당하는 블럭과 사용될 scope설정
<c:choose> 다른 언어의 switch와 비슷
<c:when> switch문의 case에 해당
<c:otherwise> switch문의 default에 해당
<c:forEach> 다른언어의 loop문 items 속성에 배열을 할당할 수 있음
<c:import> 다른 jsp 파일 import
<c:url> url 변수를 지정하기 위한 태그
<c:redirect> response.sendRedirect() 와 동일한 기능을 한다. 

 


- <c:if>

if 태그는 <c:if test ="조건"> 으로 사용할 수 있다.

 

◎colorSelectForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action = "colorSelect.jsp">
		<select name = "color">
			<option value = "1"> 빨간색 </option>
			<option value = "2"> 초록색 </option>
			<option value = "3"> 파랑색 </option>
		</select>
		<input type =  "submit" value = "전송"/> 
	</form>
</body>
</html>

◎colorSelect.jsp

<%@ 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>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
</head>
<body>
	<c:if test="${param.color == 1}">
		<span style="color: red"> 빨강 </span>
	</c:if>
	<c:if test="${param.color == 2}">
		<span style="color: green"> 초록 </span>
	</c:if>
	<c:if test="${param.color == 3}">
		<span style="color: blue"> 파랑 </span>
	</c:if>
</body>
</html>

- <c:choose>

 

<c:when> 과 같이 쓰이는 switch/case이다.

 

◎fruitSelectForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action = "fruitSelect.jsp">
		<select name = "fruit" size = "3">
			<option value = "1">참외</option>
			<option value = "2">수박 </option>
			<option value = "3">오렌지 </option>
		</select>
		<input type = "submit" value = "제출" />
	</form>
</body>
</html>

◎fruitSelect.jsp

<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:choose>
		<c:when test = "${param.fruit == 1}">
			<span style = "color:yellow">참외</span>
		</c:when>	
		<c:when test = "${param.fruit == 2}">
			<span style = "color:green">수박</span>
		</c:when>	
		<c:when test = "${param.fruit == 1}">
			<span style = "color:orange">오렌지</span>
		</c:when>	
	</c:choose>
</body>
</html>

 


<c:forEach>

 

자바의 for(int i : int[] array)를 생각하면 된다.

<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String[] movieList = {"서약", "미드나잇인파리", "이터널 선샤인", "태극기 휘날리며"};
		pageContext.setAttribute("movieList", movieList);
	%>
	<c:forEach var = "movie" items="${movieList }">
		${movie } <br />
	</c:forEach>
</body>
</html>

위와 같이 사용해도 되고,

varStatus 속성을 사용하여 index번호를 꺼낼 수도 있다.

<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String[] movieList = {"서약", "미드나잇인파리", "이터널 선샤인", "태극기 휘날리며"};
		pageContext.setAttribute("movieList", movieList);
	%>
	<c:forEach var = "movie" items="${movieList }" varStatus = "Array">
		${Array.index }      ${movie } <br />
	</c:forEach>
</body>
</html>

혹은, 일반 for문 처럼 사용할 수도 있다.

<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<c:forEach var="i" begin="1" end="10" step="1">
   			<c:out value="${i}"/>
  			<br/>
  </c:forEach>
  
</body>
</html>


값을 여러 개 꺼내서 반복 출력하는 예제도 있다. varStatus 를 이용하여 마치 이터레이터를 사용하는 것처럼 작성이 가능하다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="paramValues.jsp">
		<input type = "checkbox" name = "item" value = "신발"/> 신발 <br />
		<input type = "checkbox" name = "item" value = "가방"/> 가방 <br />
		<input type = "checkbox" name = "item" value = "벨트"/> 벨트 <br />
		<input type = "checkbox" name = "item" value = "모자"/> 모자 <br />
		<input type = "checkbox" name = "item" value = "시계"/> 시계 <br />
		<input type = "submit" value = "전송"/>
	</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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	선택한 항목은 
	<br/>
	<c:forEach var = "item" items = "${paramValues.item }" varStatus = "status">
    <!-- 파라미터를 여러 개 가져올 때는 paramValues를 사용한다. -->
		${item } <c:if test = "${not status.last }">, </c:if>
	</c:forEach>
</body>
</html>

<c:forTokens>

위 태그표에는 적어 놓질 않았지만, for 태그 중, 특정 문자를 기준으로 분리하는 작업을 수행하는 forTokens 라는 태그도 있다.

delims 속성 값으로 기준 문자를 적으면, 해당 문자를 기준으로 분리되어 차례로 var 속성에 정해놓은 이름을 가진 메모리에 할당된다.

<%@ 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>
<head>
	<meta charset="UTF-8">
	<title>forTokens : 특정 문자를 기준으로 분리</title>
</head>
<body>
	<c:forTokens var = "city" items = "서울.인천, 대구.부산" delims = ",">
		${city } <br/>
	</c:forTokens>
</body>
</html>


 

<c:import> 

다른 jsp파일을 가져와 그대로 import할 수 있다.

 

◎02_el.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta charset="UTF-8">
<title>el_2</title>
</head>
<body>
	
	정수형: ${10} 
	실수형: ${10.55 }
	문자열형:${"1010" }
	논리형: ${ true }
	null:	${null }
	
</body>
</html>

◎jstl_url.jsp

<%@ 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>
<head>
	<meta charset="UTF-8">
	<title>jstlUrl : 다른 jsp Import</title>
</head>
<body>
	<c:import url = "http://localhost:9000/token_test/02_el.jsp"></c:import>	
</body>
</html>

import를 수행하면 import된 jsp파일 내부의 연산들이 전부 수행되기 때문에, 위와 같이 임포트만 해도

 

마치 액션태그의 include 처럼 작동한다.

하지만, 

<%@ 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>
<head>
	<meta charset="UTF-8">
	<title>jstlUrl : 다른 jsp Import</title>
</head>
<body>
	<c:import url = "http://localhost:9000/token_test/02_el.jsp" var = "data"></c:import>	
	
</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>
<head>
	<meta charset="UTF-8">
	<title>jstlUrl : 다른 jsp Import</title>
</head>
<body>
	<c:import url = "http://localhost:9000/token_test/02_el.jsp" var = "data"></c:import>	
	${data }
</body>
</html>

담아놓은 변수를 출력하면, 정상적으로 출력이 된다.


<c:url> 

단순 url 변수를 지정하기 위한 태그이다. 

<%@ 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>
<head>
	<meta charset="UTF-8">
	<title>이미지 경로 및 이미지 출력</title>
</head>
<body>
	WebContent/images/pic.jpg
	<hr/>
	<img src = "./images/pic.jpg" width = "150" height = "150"/>
	<hr/>
	
	<c:url value = "./images/pic.jpg" var = "data"></c:url>
	<img src = "${data }" width = "150" heigth = "150"/>
	
	<h2>${data }</h2>
</body>
</html>

 

 


<c:redirect> 

response.sendRedirect() 와 동일한 기능을 한다. 

<%@ 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>
<head>
	<meta charset="UTF-8">
	<title>response.sendRedirect() 와 동일한 기능 : redirect</title>
</head>
<body>
	<c:redirect url = "jstlUrl2.jsp"></c:redirect>
</body>
</html>

로드 되자마자 Url2 페이지로 넘어가는 걸 확인할 수 있다.


변수의 생성(<c:set>) / 출력(<c:out>) / 삭제(<c:remove>) / 예외처리(<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>
<head>
	<meta charset="UTF-8">
	<title>변수설정/제거/예외처리</title>
</head>
<body>
	<h4>변수 선언 및 값 설정</h4>
	<c:set var = "age" value = "30" scope = "page"> </c:set>
	
	<h4>변수 값 출력</h4>
	나이: <c:out value = "${age }">10</c:out>
	
	<h4>불필요한 변수 제거</h4>
	<c:remove var = "age" scope = "page"></c:remove>
	나이 =  <c:out value = "${age }"></c:out>
	
	<h4>예외 처리</h4>
	<c:catch var = "errMsg">
		<!--  try 내에 들어갈 코드 작성 -->
		예외 발생 전 <br/>
		<%= 1/0 %><br/>
		예외 발생 후
	</c:catch>
	
	<c:out value = "${errMsg }"/>
</body>
</html>


 

여기까지가 기본적인 태그들이긴 한데... 적다보니 너무 많아져서...차라리 태그별로 따로 포스팅하는 게 나을 거 같다...

 

 

 

끝!

 

반응형

'WEB > DynamicWeb' 카테고리의 다른 글

[Servlet] Servlet 기초  (0) 2021.04.26
[JSP] JSTL - fmt  (0) 2021.04.26
[JSP] EL 표현식 문법과 사용 방법  (0) 2021.04.23
[JSP] Beans - property 쉽게 사용하기  (0) 2021.04.23
[JSP] JAVA Beans  (0) 2021.04.23
Comments