: jsp 페이지에서 바로 사용 불가능 (라이브러리 설치 후 사용하고자 하는 jsp페이지에 연동 해야됨)
커스텀 액션태그는 모든 태그명 앞에 jsp: 이외의 접두어 붙음
제공되고 있는 대표적인 유용한 라이브러리가 있음(jstl)
JSP Standard Tag Library의 약자로 JSP에서 사용되는 커스텀 태그로,
공통적으로 사용되는 코드의 집합을 의미
보다 편리하게 사용할 수 있도록 태그화하여 표준으로 제공함
JSTL을 사용하고자 하는 해당 jsp 페이지 상단에
taglib 지시어 사용해서 선언해야됨
<표현법> : <%@ taglib prefix="접두어" uri= "라이브러리 파일" %>
: 변수와 조건문, 반복문 등의 로직과 관련된 문법을 제공
변수 선언 및 초기화 ( c: set var ="변수명" value ="초기값" scope="scope영역"(생략가능))
- 변수 선언하고 초기값을 대입해두는 기능을 제공
- 변수 선언시 scope 지정가능 (생략시 기본 scope는 pageScope)
- 즉, 해당 scope에 setAttribute를 통해 key-value 형태로 값을 담아놓는거라고 생각하면 됨!
유의사항
1) 변수타입은 별도로 선언하지 않음!
2) 초기값은 반드시 지정해야됨
3) c:set을 통해 선언된 변수는 EL을 이용해서 사용 (단, 스크립틀릿에서는 사용 불가)
<%@ 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="num1" value="10" />
<c:set var="num2" value="20" scope="request" />
<%-- 마지막에 /> 꼭 붙여야 됨 아니면 </c:set> 이렇게 --%>
<!-- request.setAttribute("num2", "20") 이것과 같은 맥락 -->
num1 변수값 : ${ num1 } <br>
num2 변수값 : ${ num2 } <br>
<c:set var="result" value="${ num1 + num2 }" scope="session" />
${ num1 } + ${ num2 } = ${ result } <br><br>
${ pageScope.num1 } <br>
${ requestScope.num2 } <br>
${ requestScope.result } <br>
${ sessionScope.result } <br><br>
</body>
</html>
변수 삭제 (c:remove var = "삭제하고자 하는 변수명" (scope="scope영역" 생략가능))
- 지정한 변수를 scope에서 찾아서 삭제시켜주는 태그
- scope 생략시 모든 scope 영역에서 다 찾아서 삭제됨
- 즉, 해당 scope에 removeAttribute 를 통해 삭제하는거라고 생각하면 됨
<c:set var="result" value="9999" scope="request" />
삭제 전 result : ${ result } <br><br>
1) 특정 scope 지정해서 삭제 <br>
<c:remove var="result" scope="request" />
request에서 삭제 후 result : ${ result } <br>
2) 모든 scope에서 삭제 <br>
<c:remove var="result" />
모두 삭제 후 result : ${ result } <br>
변수 출력(c:out value="출력하고자 하는 값" (excapeXml="true | false" default="기본값" 생략가능))
- 데이터를 출력하고 할 때 사용되는 태그
<c:set var="outTest" value="<b>출력테스트</b>" />
<c:out value="${ outTest }" /> <!-- <b>출력테스트</b> 으로 출력 -->
<!-- escapeXml의 기본값 == true == 태그 해석 안됨(문자열 취급) -->
<c:out value="${ outTest }" escapeXml ="false" />
<!-- 태그로서 해석됨 -->
<c:out value="${ result }" /> <br>
<!-- 선언되지 않은 변수여서 아예 안뜸 -->
<c:out value="${ result }" default="현재 답변이 없습니다" />
<!-- default 속성을 통해 기본값으로 뭘 뜨게할지 설정 -->
: (c:if test="")
- JAVA의 단일 if문과 비슷한 역할을 수행
- 조건식 test 속성에 작성 (단, EL구문으로 기술해야 됨)
<!-- num1:10 num2:20 -->
- 기존 방식
<%--
<% if(num1 > num2) { %>
<% } %>
--%>
- EL 방식
<c:if test="${ num1 gt num2 }">
<b> num1이 더 큽니다</b> <br>
</c:if>
<c:if test="${ num le num2 }">
<b> num2가 더 큽니다</b> <br>
</c:if>
<%--
<c:set var="str" value="안녕하세요" />
<% if(str.equals("안녕하세요")){ %>
<% } %>
--%>
<c:if test="${ str eq '안녕하세요' }">
<b>일치합니다.</b>
</c:if>
<c:if test="${ str ne '안녕하세요' }">
<b>일치하지 않습니다.</b>
</c:if>
(3) 조건문 (Choose)
: (c:choose c:when c:otherwise)
- JAVA의 if-else, if-elseif 또는 switch문과 비슷한 역할을 하는 태그
- 각 조건들을 c:choose의 하위요소로 c:when을 통해서 작성 (else 또는 default문 같은건 c:otherwise로!)
- 기존방식
<%--
<% if(num1 == 20){ %>
<% } else if (num1 == 10){ %>
<% } else { %>
<% } %>
--%>
<c:choose>
<c:when test="${ num1 eq 20 }">
<b>안녕하세요</b>
</c:when>
<c:when test="${ num1 eq 10 }">
<b>반갑습니다</b>
</c:when>
<c:otherwise>
<b>안녕히계세요</b>
</c:otherwise>
</c:choose>
(4) 반복문 - forEach
- for loop문
(c:forEach var ="변수명" begin="초기값" end="끝값" (step="반복시증가값"))- for each문 (향상된 for문)
(c:forEach var="변수명" items="순차적으로 접근할 배열 및 리스트"(varStatus="순차적으로접근하는 요소의 상태값을 보관할 변수명"))
<%--
<%for(int i=1; i<=10; i++){ %>
<% } %>
--%>
<c:forEach var="i" begin="1" end="10" step="2">
반복 확인: ${ i } <br>
</c:forEach>
<c:forEach var="i" begin="1" end="6">
<h${i}> 태그 안에서도 적용 가능함 </h${ i }>
</c:forEach>
<%--
<%
String [] colors = { "red", "blue", "yellow"};
%>
<% for(String s: colors){ %>
<% } %>
--%>
<!-- colors : red, blue, yellow, pink, green -->
<%
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("홍길동", 20, '남'));
list.add(new Person("김말똥", 20, '여'));
list.add(new Person("김개똥", 20, '남'));
request.setAttribute("pList", list);
%>
<table border="1">
<thead>
<tr>
<th>순번</th>
<th>이름</th>
<th>나이</th>
<th>성별</th>
<th>인덱스</th>
</tr>
</thead>
<tbody>
<%--
<% for( Person p : list){ %>
<% } %>
--%>
<c:forEach var="p" items="${ pList }" varstatus="status">
<tr>
<td>${ status.count }</td>
<!-- 순차적으로 인덱스 접근할 때 마다 status라는 변수명으로 접근해두겠다.
count속성(순번):1부터 -->
<td>${ p.name }</td>
<td>${ p.age }</td>
<td>${ p.gender }</td>
<td>${ status.index }</td>
<!-- index속성(인덱스):0부터 -->
</tr>
</c:forEach>
</tbody>
</table>
: ( c:forTokens var="변수명" items="문자열" delims="구분자")
- 문자열에 포함된 구분자를 통해 각각의 문자열(토큰)로 분리 후 반복 처리
- JAVA의 split ("구분자") 또는 StringTokenizer 와 비슷한 기능 처리
<c:set var="device" value="컴퓨터, 핸드폰, TV/에어컨. 냉장고. 세탁기"/>
<ul>
<c:forTokens var="d" items="${ device }" delims=",./">
<li>${ d }</li>
</c:forTokens>
</ul>
<c:url var ="변수명" value="요청할 url">
<c:param name="키값" value="전달할 값"/>
</c:url>
- url 경로를 생성하고, 해당 url의 쿼리스트링을 정의할 수 있는 태그
변수명 = 요청할 url?키값=전달할값&키값=전달할값...<a href="list.do?currentPage=1&num=2">기존방식</a> <br>
<c:url var="url" value="list.do">
<c:param name="currentPage" value="1" />
<c:param name="num" value="2" />
<!-- url == "list.do?currentPage=1&&num=2" -->
</c:url>
<a href="${ url }"> c:url 사용방식</a>