JSTL
JSP 안에 자바와 HTML이 섞여 있다면 프론트 개발자가 수정하기에 어려움
이를 위해 JSTL 사용
조건문, 반복문 등을 HTML tag 형태로 작성 가능
EL과 연동하여 사용

JSTL 사용방법
사이트에서 아래 3개의 jar 파일 다운로드 후, /web-app/lib에 복사
![]() |
![]() |
JSTL이 제공하는 태그 종류
!! 코어 기능: 조건문, 반복문 등을 처리 시 사용

코어 태그
논리적인 흐름을 태그로 처리 가능
import 태그로 url에 있는 내용을 읽거나 출력하는 기능 포함
set

코어 태그 - 변수 지원 기능
set, remove 태그
set 태그: JSP에서 4가지 scope에다가 값을 저장
var = '변수명' , scope에 따라 저장되는 객체가 달라짐.
remvoe 태그 : 저장된 값을 삭제

코어 태그 실습1 - set, remove tag
jstl01.jsp - set, remove tag
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- core tag를 사용하기 위해 지시자를 이용하여 uri를 적고 prefix 이름 정함 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="value1" scope="request" value="kang"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
성 : ${value1 } <br>
<c:remove var="value1" scope="request"/>
성 : ${value1 } <br>
</body>
</html>

코어 태그 - property, map 처리
property에서 소문자로 시작하여 propertyName이라고 지정했지만
setter, getter 메소드를 호출할 때는 꼭 set, get을 적은 뒤 대문자로 시작해야함
"propertyName" -> .setPropertyName()
some 객체의 종류에 따라 실행 방법의 차이가 있음.
map이면 put() 메소드 호출

코어 태그 - 흐름제어 태그
- if
- choose
- forEach
- import
- redirect
1) if
test = "여기에 조건문 입력"

코어 태그 실습2 - if
jstl02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% //request.setAttribute("n", 10); %>
<!-- 위의 코드와 동일한 내용 -->
<c:set var="n" scope="request" value="10"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:if test="${n==0 }"> <!-- False -->
n과 0은 같습니다
</c:if>
<c:if test="${n==10 }"> <!-- True -->
n과 10은 같습니다
</c:if>
</body>
</html>
2) choose
if - else 구문 사용하고 싶을 때 사용
각각의 when 조건에 만족하지 못하면 otherwise 실행

코어 태그 실습3 - choose
jstl03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% request.setAttribute("score", 83); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:choose>
<c:when test="${score >= 90}">
A학점입니다.
</c:when>
<c:when test="${score >= 80}">
B학점입니다.
</c:when>
<c:when test="${score >= 70}">
C학점입니다.
</c:when>
<c:when test="${score >= 60}">
D학점입니다.
</c:when>
<c:otherwise>
F학점입니다.
</c:otherwise>
</c:choose>
</body>
</html>
3) forEach
대괄호로 되어있는 것은 생략 가능
begin과 end로 범위 설정 가능

코어 태그 실습4 - forEach
jstl04.jsp

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<!-- import로 List interface 가져옴 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("!!!!!");
request.setAttribute("list", list);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:forEach items="${list }" var="item" begin="1">
${item }<br>
</c:forEach>
</body>
</html>
4) import
특정 url 페이지의 결과를 읽어와서 변수에 저장
charEncoding은 utf-8, euc-kr 등
parameter에서 파라미터 값은 url에서 ? 뒤쪽에 위치한 쿼리문을 의미

코어 태그 실습4 - import
jstlValue.jsp
출력할 메세지만 적어주기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
kiki hehe just message
jstl05.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- url에 오픈하려는 jsp의 url 주소를 입력 -->
<!-- 여기에 google 주소 입력하면 google 창이 오픈됨 -->
<c:import url="http://localhost:8081/firstweb/jstlValue.jsp" var="urlValue" scope="request"/>
<!-- param도 사용하면 조금 더 자세한 정보를 도출할 수 있음 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${urlValue }
<!-- import의 var 안에 적은 이름으로 접근 -->
</body>
</html>
잘 보면 jstl05.jsp url로
jstlValue.jsp의 내용이 출력됨 (마치 forwarding 처럼 url 변환 없음...?)

5) redirect
param으로 페이지에 전달할 파라미터도 지정 가능

코어 태그 실습6 - redirect
jstl06.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:redirect url="http://localhost:8081/firstweb/jstl05.jsp" />

jstl06 을 실행했지만
redirect로 인하여 jstl05의 url로 오픈
jstl05가 jstlValue를 import하기 때문에
최종적으로 jstlValue의 내용이 출력됨
코어 태그 - 기타 태그
out
특정 문자열 출력
이미 태그가 있는 문자열을 출력할 때, escapeXml에 true를 적용하면, 해당 태그가 그대로 출력
- value - JspWriter에 출력할 값 (문자열)
- 만약 value 값이 java.io.Reader의 한 종류라면 out 태그는 reader로부터 데이터를 읽어와서 JspWriter에 값을 출력
- escapeXml - 기본값은 true
- default - value에 지정한 값이 존재하지 않을 때 출력할 값을 지정

코어 태그 실습6 - out
jstl07.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="t" value="<script type='text/javascript'>alert(1);</script>"/>
<c:out value="${t }" escapeXml="false"/>
</body>
</html>
![]() escapeXml = "true" 텍스트가 그대로 출력됨. javascript가 적용되지 않음 |
![]() |
결론
jsp 파일에 자바코드를 그대로 쓰지 말고,
가독성을 위해
jstl로 쓰자
'Web > Java+Spring' 카테고리의 다른 글
JDBC 준비 (0) | 2021.05.14 |
---|---|
Maven (0) | 2021.05.13 |
EL (Expression Language) for JSP (0) | 2021.05.10 |
Scope (0) | 2021.05.10 |
Redirect & Forward (0) | 2021.05.10 |