본문 바로가기

Java

자바 JSTL (JSP Standard Tag Library)

JSTL (JSP Standard Tag Library)

JSTL이란 JSP에서 자주 사용하는 기능을 구현하는 커스텀태그와 라이브러리의 모음이다.
앞서 포스팅한 EL식(참조)이 JSTL 안에 자주 같이 쓰인다.




JSTL 환경구축 :

JSTL을 사용하기 위해서는 다음 jar파일 2개를

사용하고자 하는 웹프로젝트 내 WebContent\WEB-INF\lib 안에 복사한 뒤




지시자태그를 통해 사용할 .jsp에 아래 코드를 붙여넣으면 된다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"; prefix="c"%>

prefix="c" 옵션은 접두어 c를 쓰면 JSTL을 사용하겠다는 일종의 선언이다.
위의 설정을 마치고 나면 <c: >를 통해 JSTL를 사용할 수 있다.





JSTL 사용하기:


<c:set> :
영역객체에 저장하기.
따로 영역을 지정하지 않으면 page 영역에 저장된다.
     <%-- set태그 : 변수를 선언(영역에 저장) --%>
     <c:set var="request" value="requestScope!"></c:set>

scope="" 에 저장할 영역을 지정할 수 있다.

     <%-- set태그 : 변수를 선언(영역에 저장) --%>
     <c:set var="request" value="requestScope!" scope="request">
     </c:set>
     <%-- 아래와 같다 --%>
     <%
          request.setAttribute("request", "requestScope!");
     %>


<c:remove var="키" scope="영역"> 
영역에 저장된 값을 삭제한다.
키가 겹친다면 scope를 이용해 영역을 지정할 수 있다. (ex:scope="session")

     <%-- remove태그 : 영역에 저장된 값을 삭제 --%>
     <c:remove var="request" />
     <%-- 아래랑 같음 --%>
     <%
          request.removeAttribute("request");
     %>


<c:if test="condition">:

단순 if 조건문이다.

     <c:set var="num1" value="100" scope="request"></c:set>
          <c:if test="${num1==100}">
          num1은 100이다
          </c:if>

다음과 같이 출력된다.







<c:choose> :

다중조건(else, else if)를 위해 사용한다.
choose 태그 안에 <c:when test="condition">을 사용하면 각각의 조건을 지정할 수 있고
<c:otherwise>를 사용하여 else를 지정할 수 있다.

     <%-- choose 다중조건문 (else/else if) --%>
     <c:choose>
          <c:when test="${num1>90}">
              90보다커
          </c:when>
          <c:when test="${num1>40}">
              40보다커
          </c:when>
          
          <c:otherwise>
              40보다작아
          </c:otherwise>
     </c:choose>



<c:forEach>

For 반복문이다. begin과 end를 이용해 반복문이 돌 시작점과 끝점을 선언할 수 있다. '<=' 연산자와 같이 end값이 포함된다는 것이 특징이다.
var에는 for(i=0; i<10; i++) 부분과 같이 반복문에 쓰일 변수가 선언된다.
step에는 for(i=0; i<10; i++) 부분과 같이 증감량이 선언된다. 생략하면 1이 기본값이 된다. 

     <c:forEach begin="0" end="10" var="i" step="2">
          <font size="${i }"> 반복 ${i } </font>
     </c:forEach>


결과:





다음과 같이 items=""와 EL식을 이용해 영역에 올려진 배열이나 리스트 등을 가져와 한번에 빼낼 수 있다.
단순히 items="list"로 빼내려고 하면 문자열로 인식하니 주의.

     <%-- forEach --%>
     <%
          ArrayList<String> list = new ArrayList<String>();
          list.add("성은");
          list.add("보람");
          list.add("성민");
          list.add("다솔");
          request.setAttribute("list", list); //request 영역에 list 올림     
     %>
     
     <c:forEach items="${list }" var="i">
          ${i }
     </c:forEach>


결과:




(위와 같은 코드) EL식을 이용해 객체가 담긴 list를 불러오고 차례로 vo 정보를 빼오는 것을 조합해본 것이다.

     <%-- forEach 객체 --%>
      <%
          ArrayList<MemberVO> list2 = new ArrayList<MemberVO>();
          list2.add(new MemberVO("jason","123","azddd","100"));
          list2.add(new MemberVO("benny","564","ffeee","10"));
          request.setAttribute("list2", list2);
          
     %>
     
     <c:forEach items="${list2}" var="vo">
          ${vo.id} ${vo.pw} ${vo.nick} ${vo.age}<br>
     </c:forEach>


결과:




<c:forTokens>
반복문은 반복문인데 items="" 값에 삭제하고 싶은 문자를 delims=""에 넣으면 delims에 지정된 문자들이 제외되고 구분되서 차례로 var에 담긴다.

     <%-- forTokens --%>
     <c:forTokens items="성은.%#@보람.성민.다솔" delims=".%#@" var="i">
          ${i }
     </c:forTokens>


결과:


<c:catch>
예외처리를 해준다.
var="" 변수에 예외처리메시지가 담긴다.

     <%-- catch:예외처리 --%>
     <c:catch var="msg">
          <%=2/0 %>
     </c:catch>
     ${msg }

결과:




<c:out> :
catch와 같이 쓰이며 default="" 에는 에러가 없을 시 출력되는 문구를 넣는다. 
생략하면 에러가 없을 시 아무것도 출력되지 않게 된다.
     <%-- catch:예외처리 --%>
     <c:catch var="msg">
          <%=2/0 %>
     </c:catch>
     <br>
     
     <%-- out : msg변수가 없을때는 출력이 안됨. --%>
     <c:out value="${msg }" default="에러가 없습니다.">
     
     </c:out>




<c:redirect> :
url로 보내버린다. response.sendRedirect(url); 메소드와 기능이 같다.
<c:redirect url="https://www.naver.com";></c:redirect>     





<c:import> : 
<%@include file="#" %> 과 같이 다른 페이지를 현재페이지에 삽입하는 용도로 사용한다.
다만 JSP의 <include>는 경로를 통해 가져오므로 외부url을 통한 웹페이지를 불러오는 것이 불가함과 달리 
import는 url을 통해 외부페이지를 불러오는 것이 가능하다.

     현재페이지에 외부페이지를 불러오는데 외부url가능
     <c:import url="https://www.naver.com";></c:import>
     현재페이지에 외부페이지를 불러오는데 외부url은 불가능
     <%@ include file="ex05foreach.jsp" %>



<c:url>과 <c:param> :

<c:url>의 var에 변수명을, value에 접속하고자 하는 url을 올린 뒤
<c:url>태그 안에 <c:param>을 이용하여 name과 value로 쿼리스트링 형식을 지정할 수 있다. (a:b)
아래의 코드는 다음에서 검색시 나오는 기본 url인 https://search.daum.net/search? 뒤에 검색요청 name으로 지정되어 있는 q를 넣어주고, 검색어로 지진을 넣은 것이다.

즉 url이 "http://search.daum.net/search?q=지진" 으로 변환되어 변수명 daum에 담기고, 이를 redirect를 이용해 이동시킨 것이다.

구글은 다음과 마찬가지로 검색쿼리name에 q가 들어가지만 네이버는 query를 쓰고 있다. (query=지진)

      <c:url value="https://search.daum.net/search?"; var="daum">
          <c:param name="q" value="지진"></c:param>
      </c:url>
      <c:redirect url="${daum}"></c:redirect>