JSTL은 Javaserver pages Standard Tag Library의 줄임말로
Custom Tag들 중 자주 사용되고 유용한 것만을 모아 다양하게 사용할 수 있도록 만든 라이브러리이다
이를 쓰는 또다른 이유는 Scriptlet을 대체하기 위해서이다
그리고 이를 쓰기 위해서는
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
를 반드시 붙여줘야한다
<%@ 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><!-- 상대경로 : 보안좋음 / 절대경로 : 보안취약 -->
<ol><!-- c.set에서 c는 커스텀태그의 약자 -->
<li><a href="./taglist/set.jsp">*c:set</a></li><!-- 변수선언 -->
<li><a href="./taglist/if.jsp">*c:if</a></li>
<li><!-- 다중조건 처리 -->
*c:choose</a>
<form action ="./taglist/choose.jsp">
<input type = "text" name="num"/>
<button>submit</button>
</form>
</li>
<li><a href="./taglist/foreach.jsp">*c:foreach</a></li>
<li><a href="./taglist/url.jsp">*c:url</a></li>
<li><a href="./taglist/forTokens.jsp">c:forTokens</a></li>
<li><a href="./taglist/import.jsp">c:import</a></li>
<li><a href="./taglist/redirect.jsp">c:redirect</a></li>
<li><a href="./taglist/function.jsp">fn:000</a></li>
</ol>
</body>
</html>
index.jsp
나열되어 있는 링크 이름순으로 정리할 것이다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 위에꺼 없으면 오류뜸. JSTL쓰기위한 코드. JSTL쓰는목적 : Scriptlet 대체위해 -->
<%
session.setAttribute("myId","admin");
session.setAttribute("uId","105784");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>set tag</h3>
<!-- el 변수 생성(페이지 내에서 el로 무언가 하고 싶다면 변수를 생성해야함) -->
<%--1. <c:set var="변수명" value="값" [scope="영역"]/>--%>
<%--2. <c:set var="변수명" [scope="영역"]>값</c:set> --%>
<ul>
<li>var : 변수의 이름</li>
<li>value : 변수가 담을 값</li>
<li>scope : 저장할 영역(page, request, session, application)</li>
<!-- 특수한 경우가 아니면 scope는 잘 명시하지 않는다 -->
</ul>
<!-- scope : 변수가 저장되는 영역 설정(page | request | session | application 생략가능 생략시 기본값은 page) -->
<c:set var = "name1" value="test" scope="page"/>
<!-- sessionScope : 웹 브라우저별로 변수를 관리 -->
<c:set var = "name2" value="${sessionScope.myId}"/>
<c:set var = "name3" value="${sessionScope.myId}_${sessionScope.uId}"/>
<c:set var = "name4" scope="request">test2</c:set>
<c:set var = "name5">${sessionScope.myId}</c:set>
<c:set var = "name6">${sessionScope.myId}_${sessionScope.uId}</c:set>
<h3>변수 리스트</h3>
<ul>
<li>${name1}</li>
<li>${name2}</li>
<li>${name3}</li>
<li>${name4}</li>
<li>${name5}</li>
<li>${name6}</li>
</ul>
<!-- 변수 삭제 -->
<%-- <c:remove var="변수명" scope="영역"/> --%>
<c:remove var="name4" scope="request"/>
<c:remove var="name5"/>
<h3>삭제 후 변수 리스트</h3>
<ul>
<li>${name1}</li>
<li>${name2}</li>
<li>${name3}</li>
<li>${name4}</li>
<li>${name5}</li>
<li>${name6}</li>
</ul>
</body>
</html>
set.jsp
c:set은 JSP에서 사용될 변수를 설정하며
c:remove는 그뜻 그대로 제거하는 역할을 한다
(아래 name4, name5에 해당하는 값이 삭제되어있음을 볼 수 있다)
그리고 Scope는 변수가 저장되는 영역 설정을 하는 역할을 한다
page | request | session | application 4가지가 가능하며 생략가능하다.
생략시 기본값은 page이다
<%@ 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>
<ul>
<li>자바 if문과 비슷한 기능을 제공한다.</li>
<li>c: if test = "조건"</li>
<li>test 속성 내의 결과가 true일 경우 몸체 내용이 처리된다.</li>
<li>c: if test = "조건" var="조건 결과가 저장되는 변수명"</li>
</ul>
<!-- 작성법 두가지 숙지. %쓰는것과 c:if 쓰는것 -->
<%if(true){%>
<p>항상 실행 된다.</p>
<%}%>
<c:if test="true">
<p>항상 실행 된다.</p>
</c:if>
<c:set var = "myId">admin</c:set>
<!-- c:if는 else문이 없다. if하나 더만들어서 반대조건 걸어줘야함 -->
<c:if test="${myId eq 'admin'}" var="result">
myId는 admin이 맞습니다.<br/>
결과값 : ${result} <!-- true -->
</c:if>
<!-- 그래서 else에 해당하는 조건을 가진 if를 하나 더 만들어줘야 한다. -->
<c:if test="${myId ne 'admin'}">
myId는 admin이 아닙니다.
</c:if>
</body>
</html>
if.jsp
c:if는 자바 if문과 비슷한 기능을 제공하며
test 속성 내의 결과가 true일 경우 몸체 내용이 처리된다
대신 여기서는 else문이 따로 없기에
else에 해당하는 조건을 가진 if를 하나 더 만들어줘야한다
<%@ 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>
<ul>
<li>자바의 switch 구문과 비슷하다</li>
<li>c:when 의 test 속성에 조건을 넣는다.</li>
<li>그 조건이 참이면 태그 몸체를 실행</li>
<li>c:otherwise는 else 역할을 한다.(필수로 넣어야하는건 아님)</li>
</ul>
<c:choose>
<c:when test = "${param.num == '0'}">
<h3>num 의 값은 0 입니다.</h3>
</c:when>
<c:when test = "${param.num == '1'}">
<h3>num 의 값은 1 입니다.</h3>
</c:when>
<c:otherwise>
<h3>0~1 사이 값을 넣어주세요</h3><!-- 말만이렇게 적었지 0,1빼고 다이거뜸 -->
</c:otherwise>
</c:choose>
</body>
</html>
choose.jsp
c:choose는 다중 조건을 처리할 때 사용한다
c:otherwise는 else역할을 하지만 필수로 넣어야하는 것은 아니다
이는 switch문과 유사한 모습을 보여준다
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String[] sports = {"축구", "야구","농구", "골프", "수영", "볼링"};
HashMap map = new HashMap();
map.put("name", "kim");
map.put("age", "30");
map.put("phone", "010-1234-1234");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul>
<li>array, map, list 등에 저장되어 있는 값을 순차적으로 꺼낼때 사용한다.</li>
<li>c:forEach var="변수" items="덩어리" begin="시작값" end="끝값" step="증가값"</li>
</ul>
<!-- 일반적인 for처럼 사용하는 방식 -->
<%for(int i = 1 ; i<=10 ; i++){%>
<%=i%>
<%}%>
<hr/>
<c:forEach var="i" begin="1" end="10" step="1">
${i}
</c:forEach>
<h3>1부터 100까지 합</h3>
<%
int sum = 0;
for(int i = 1 ; i<=100 ; i ++){
sum += i;
}
%>
<%=sum %>
<br/>
<c:set var = "total">0</c:set>
<c:forEach var="i" begin="1" end="100" step="1">
<c:set var = "total" value="${total+i}"/>
</c:forEach>
${total}
<!-- 향상된 for처럼 사용하는 방식(앞으로 우리가 자주 사용할 방식-->
<h3>sports 배열에 있는 값 뽑아내기</h3>
<!-- sports는 c:set을 사용해 선언하지 않았기 때문에 el을 사용할 수 없음 -->
<c:forEach var="s" items="<%=sports%>" varStatus="stat">
[${stat.index}]${s}
</c:forEach>
<h3>sports 배열에서 1~3번 인덱스만 뽑아내기</h3>
<c:forEach var="s" items="<%=sports%>" varStatus="stat" begin="1" end="3" step="1">
[${stat.index}]${s}
</c:forEach>
<h3>map에 있는 모든 값을 뽑아내기</h3>
<c:forEach var="item" items="<%=map %>">
<p>${item.key} : ${item.value}</p>
</c:forEach>
</body>
</html>
foreach.jsp
c:forEach는 array, Map, list 등에 저장되어있는 값을 순차적으로 꺼낼때 사용하며
c:forEach var="변수" items="덩어리" / begin="시작값" end="끝값" step="증가값" 로 구성되어있다
또한 varStatus 속성으로 인덱스 값을 출력할 수 있다
<%@ 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>
<ul>
<li>url 생성을 도와준다.</li>
<li>var와 scope 속성이 있으나 생략한다.</li>
<li>param을 통해 url의 파라메터를 추가할 수 있다.</li>
<li>절대 url과 상대 url을 입력 할 수 있다</li>
</ul>
<!--https://search.daum.net/search?w=blog&q=독도-->
<c:url value = "https://search.daum.net/search" var="searchUrl">
<c:param name="w">blog</c:param>
<c:param name="q">독도</c:param>
</c:url>
<a href = "${searchUrl}">독도 검색</a>
<ul>
<li>${searchUrl}</li><!-- 절대 url : 클릭하면 곧바로 간다 -->
<li><c:url value = "/url.jsp"/></li><!-- 상대url : 나를 기준으로 설명. 풀주소x, 절대경로 -->
<li><c:url value = "./url.jsp"/></li><!-- 상대url. 상대경로 ip주소는비공개 -->
<li><c:url value = "../index.jsp"/></li><!-- 상대url. 상대경로 ip주소는비공개 -->
</ul>
<h3>c:url을 사용할때와 사용하지 않을 때</h3>
<ul>
<!-- 상대경로url.jsp : 새탭으로 같은주소 열림 -->
<li><a href = "./url.jsp" target="_blank"> 상대경로 url.jsp</a></li>
<!-- c:url 상대경로url.jsp : 새탭으로 같은주소 열림 -->
<li>
<a href = "<c:url value ="./url.jsp"/>" target="_blank">
c:url 상대경로 url.jsp
</a>
</li>
<!-- 절대경로 index.jsp : http://localhost/index.jsp / 404뜸-->
<li><a href = "/index.jsp" target="_blank">절대경로 index.jsp</a></li>
<!-- c:url 절대경로 index.jsp : http://localhost/11_JSTL/index.jsp-->
<li>
<a href = "<c:url value ="/index.jsp"/>" target="_blank">
c:url 절대경로 index.jsp
</li>
</ul>
<!-- 절대 경로 : 처음부터 시작하여 목적지까지의 절대적인 경로. 최상위에 / 포함 -->
<!-- 상대 경로 : 현재 위치를 기준으로 하여 목적지까지의 상대적인 경로. /거지치 않고 이동가능 -->
<!-- 기본페이지 : http://localhost/11_JSTL/taglist/url.jsp -->
<p>절대 경로에서 /는 root를 의미한다.</p>
<p>일반적으로는 ip:port 이후를 의미한다.</p>
<p>http://localhost:80/index.jsp</p>
<p>c:url은 ip:port/context 이후를 root로 받아들인다</p>
<p>http://localhost/11_JSTL/index.jsp</p>
http://localhost/11_JSTL/index.jsp
</body>
</html>
url.jsp
c:url은 url 생성을 도와주며 var 와 scope 속성이 있으나 생략한다
또한 절대 url 이나 상대 url을 입력할 수 있다
여기서 절대 url은 클릭하면 서버위치로 곧바로 가는 풀주소이다
상대 url은 본인을 기준으로 설명하기 때문에 풀주소가 아니다
상대 url에는 크게 절대 경로와 상대 경로가 있다
절대 경로는 처음부터 시작하여 목적지까지의 절대경로를 나타내는 것으로 최상위에 '/'를 포함한다
반면 상대 경로는 ip주소도 비공개하며 현재위치를 기준으로 하여 목적지까지의 상대적인 경로를 나타낸다.
또한 '/'를 거치지 않고 이동가능하다. '.'나 '..'를 통해 가능하다
여기서 c:url을 쓰는 이유는
클라이언트가 쿠키생성을 못하게 하면 로그인 유지가 어려워지는데 이때 세션을 유지시키기 위해서이다
<%@ 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>
<ul>
<li>자바의 Tokenizer와 같은 기능을 한다.</li>
<li>특정 구분자를 기준으로 값을 나눈다.</li>
<li>c:forTokens var="쪼개진 값이 담길 변수명" items="문자열" delims="구분자"</li>
</ul>
<c:set var="text" value="축구,야구,농구,배구,골프,수영"/>
<c:forTokens var = "item" items="${text}" delims=",">
${item}
</c:forTokens>
<hr/>
<!-- 꼭 변수에 담을 필요없다. 직접써도된다 -->
<c:forTokens var="sports" items="축구^야구^농구^배구^골프^수영" delims="^">
${sports}/
</c:forTokens>
</body>
</html>
fortokens.jsp
c:forTokens는 자바의 Tokenizer와 같은 기능을 하며 특정 구분자를 기준으로 값을 나눈다
<%@ 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>
<ul>
<li> 특정 url의 결과를 읽어와 현재 위치에 삽입하거나 변수에 저장한다.</li>
<li> 자체페이지 또는 외부 페이지도 불러올 수 있다.</li>
<li> c:import url="불러올 페이지" var="변수명" scope="영역" charEncoding="캐릭터셋"</li>
</ul>
<!-- 내부 페이지 -->
<%-- <c:import url="../index.jsp"> --%>
<!-- 외부 페이지 --><!-- redirect와 차이점은 얘는 ul태그내용 잠시보여줌 -->
<!-- https://www.youtube.com/results?search_query=jsp -->
<c:import url="https://www.youtube.com/results">
<c:param name="search_query" value="jsp"/>
</c:import>
</body>
</html>
import.jsp
c:import는 url을 사용하여 다른 자원의 결과를 삽입한다
이는 뒤에나올 redirect와 비슷하지만 페이지를 불러오는 측면에서 차이점을 보인다
<%@ 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>
<ul>
<li>import와 비슷하다. 다만 불러오느냐, 보내느냐의 차이</li>
</ul>
<!-- https://www.youtube.com/results?search_query=jsp -->
<c:redirect url ="https://www.youtube.com/results">
<c:param name="search_query" value="jsp"/>
</c:redirect>
</body>
</html>
redirect.jsp
c:redirect는 지정한 경로로 리다이렉트 한다
앞서 말한 import와 비슷하나 페이지를 보낸다는 측면에서 차이점을 보인다
마지막으로 함수 모음이다
${fn:length()} | 길이값 반환 |
${fn:toUpperCase()}, ${ fn:toLowerCase()} | 대문자, 소문자로 변환 |
${fn:substring()}, ${fn:substringAfter()}, ${fn:substringBefore()} | 문자열을 잘라줌 |
${fn:replace()} | 문자열을 교체 |
${fn:indexOf()} | 문자열을 찾아서 인덱스 값을 반 |
${fn:startsWith()} | 문자열로 시작하면 true 아니면 false |
${fn:endsWith()} | 문자열로 끝나면 true 아니면 false |
${fn:contains()} | 문자열을 포함하면 true 아니면 false |
${fn:split()} | 문자열 쪼개기 |
${fn:join()} | 문자열 추가 |