JSTL

3 minute read



JSTL이란?

  • EL태그는 JSP의 표현식을 대체한 것이라면, JSTL은 개발자들이 만든 커스텀 태그를 표준화한 것이다.
  • body태그에서 사용
  • 정식 문법이 아니며, 라이브러리 파일(.jar)을 다운받은 후, 지시자로 선언하여 사용.
    • https://tomcat.apache.org/download-taglibs.cgi
    • Jar Files 다운 (4개 다 받아도 OK) WEB-INF/lib에 복붙한다.

<%@ taglib prefix="" uri="" %>

  • JSTL 페이지 작성 시 <%@ %> 지시자를 이용하여 알린다.

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

  • prefix(uri에 내가 쓰려는 태그를 설정, 접두어를 붙여줌)와, uri 속성을 지닌다.
  • prefix=”c”일때
  • 태그 종류 : 코어, XML, 국제화, 데이터베이스, 함수
  • <c:out …/>
  • EL과 함께 쓰임.


공유공간 명칭

JSTL EL JSP 영역설명
page pageScope pageContext 하나의 파일에서 등록시킨 객체를 동일 파일 내에서만 접근할 수 있는 영역
request requestScope request 하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 한 번 응답 후 사라짐.)
session sessionScope session 하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 여러 번 응답해도 계속 기억.)
application applicationScope application 여러 사용자가 요청하고 응답해도 기억하는 영역 (호스트 이름을 기억하는 용도로 주로 쓰임)





Core태그


<c(Core태그):태그의 속성태그명 var="" value="" [scope=""]/>



set태그

  • 객체를 공유공간에 등록시키기 위한 태그.
  • 이름, 값이 필요

  1값을 가지는 변수 cnt를 공유영역(page)에 등록<br>
  <c:set var="cnt" value="1"/>

  공유영역에 등록된 변수 cnt출력<br>
  cnt : ${ cnt }
  <hr>

  cnt변수에 1 더하고, cnt값 출력<br>
  <c:set var="cnt" value="${ cnt + 1 }" scope="request"/>

  <%-- request에 선언된 변수이므로 cnt+1값이 나오지 않음 --%>
  cnt : ${ cnt }<br>
  request cnt : ${ requestScope.cnt }<br>



remove태그

  • scope를 설정하지 않으면 다 지워버린다!

  request공유영역에 등록된 cnt변수 삭제<br>
  <c:remove var="cnt" scope="request"/>

  cnt삭제 후<br>
  page cnt : ${ cnt }<br>
  request cnt : ${ requestScope.cnt }<br>

  • request영역의 cnt를 삭제했기 때문에 page영역의 cnt는 남아있지만, request영역의 cnt는 empty상태가 된다.



out태그

  • 출력전용 태그
  • 악성 코드가 삽입될 수 있어서 out태그 사용 클릭했을 때 이상한 링크로 넘어갈 수 있어서 텍스트를 텍스트로 인식하게한다.(최소한의 안전장치)
  • 속성
    • default=”” : EL내장객체에 없고, 공유영역에도 없을 때 출력할 값 지정
    • escapeXml=”true”/”false” : html태그 해석여부 설정 (true :문자로해석, false :html태그로해석)

  value속성에 태그가 들어있는 경우(escapeXml = true)<br>
  <c:out value="<h1>Hello</h2>" escapeXml="true"/><br>
  <hr>

  value 속성에 태그가 들어있는 경우(escapeXml = false)<br>
  <c:out value="<h1>Hello</h2>" escapeXml="false"/><br>

  • 위의 결과는

  value속성에 태그가 들어있는 경우(escapeXml = true)
  <h1>Hello</h1>

value 속성에 태그가 들어있는 경우(escapeXml = false)

Hello

  • 으로 표현된다.



if태그

  • test=”조건”이 참일 경우에만 실행! (else는 없음)
  • type이 S인 경우 관리자님 환영합니다. U일때 회원님 환영합니다. 가 나오게 하고싶다면?

  <c:if test="${ param.type == 'S' }">
  <h2>관리자님 환영합니다.</h2>
  </c:if>

  <c:if test="${ param.type == 'U' }">
  <h2>회원님 환영합니다.</h2>
  </c:if>

  • 모두 조건을 걸어줘야 하는 단점 (속도측면에서 좋지않음)
  • 해결방법 : choose



choose태그

  • 다중 선택 태그
  • n개중에 하나 만족시 나머지를 확인하지 않음.
  • when : 조건이 참일 경우 실행할 내용
  • otherwise : when절이 모두 거짓일 경우 실행.

<c:choose>
<c:when test="${ empty param.type }">
  <h3>파라미터가 잘못되었습니다.</h3>	
</c:when>
<c:when test="${ param.type == 'U' }">
  <h3>회원님 환영합니다!</h3>
</c:when>
<c:otherwise>
  <h3>관리자님 환영합니다.</h3>
</c:otherwise>

</c:choose>



forEach태그

  • 반복문
  • 속성
    • var : 사용할 변수명 (i = 자바에서 for(int i)역할)
    • items : 반복시킬 대상 객체 지정
    • begin : 시작값
    • end : 마지막 값
    • varStatus : 반복문의 상태를 알려줌

년도선택 : 

<select>		

  <option>2000</option>
  <option>2001</option>
  <option>2002</option>
  <option>2003</option>
		
</select>

  • select태그에 년도 값을 넣고자 할 때 이전에는 하나하나 직접 작성해야했다면 아래와 같이 forEach태그를 이용해서 코드를 간결하게 만들 수 있다.

년도선택 : <select>
		<c:forEach begin="1921" end="2021" var="year" step="5">
			<option>${ year }</option>
		</c:forEach>
	</select>

  • step속성은 커지는 크기를 조절할 수 있다.(ex . 5씩 커지게)
  • ,를 찍는 다양한 방법

<%
	String[] names = {"홍","강","윤","박"};
	pageContext.setAttribute("names", names);
	pageContext.setAttribute("nameslgth", names.length);
%>
  

<c:forEach begin="0" end="${ nameslgth-1 }"  var="n">
  <c:if test="${ n != 0 }">
  ,
  </c:if>
  ${ names[n] } 
</c:forEach>
<br>


<c:forEach begin="0" end="3"  var="n">
  ${ names[n] } 
  <c:if test="${ n < 3 }">
  ,
  </c:if>
</c:forEach>
<br>


<c:set var="cnt" value="0"/>
<c:forEach items="${ names }" var="n">
  <c:if test="${ cnt != 0 }">
  ,
  </c:if>
  ${ n }
  <c:set var="cnt" value="${ cnt+1 }" />
</c:forEach>
<c:remove var="cnt" scope="page" />
<br>

  • 모두 같은 결과를 보여줌.
  • varStatus
    • first : 반복문의 처음인지 판단. 참/거짓 반환
    • last : 반복문의 마지막인지 판단. 참/거짓 반환
    • index : 반복의 처음에 0을 반환 ( 반복 진행시 1씩 증가 )
    • count : 반복의 처음에 1을 반환 ( 반복 진행시 1씩 증가 )
  • 사용법

<c:forEach items="${ names }" var="n" varStatus="loop">
  ${ loop.first } : ${ loop.index } : ${ loop.count } : ${ loop.last }<br>
</c:forEach>
<br>