JSTL (JSP Standard Tag Library)
JSTL이란 JSP에서 자주 사용하는 기능을 구현하는 커스텀태그와 라이브러리의 모음이다.
앞서 포스팅한 EL식(참조)이 JSTL 안에 자주 같이 쓰인다.
JSTL 환경구축 :
JSTL을 사용하기 위해서는 다음 jar파일 2개를
사용하고자 하는 웹프로젝트 내 WebContent\WEB-INF\lib 안에 복사한 뒤
지시자태그를 통해 사용할 .jsp에 아래 코드를 붙여넣으면 된다.
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:import> :
<%@include file="#" %> 과 같이 다른 페이지를 현재페이지에 삽입하는 용도로 사용한다.
다만 JSP의 <include>는 경로를 통해 가져오므로 외부url을 통한 웹페이지를 불러오는 것이 불가함과 달리
import는 url을 통해 외부페이지를 불러오는 것이 가능하다.
현재페이지에 외부페이지를 불러오는데 외부url가능
현재페이지에 외부페이지를 불러오는데 외부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를 넣어주고, 검색어로 지진을 넣은 것이다.
구글은 다음과 마찬가지로 검색쿼리name에 q가 들어가지만 네이버는 query를 쓰고 있다. (query=지진)
<c:param name="q" value="지진"></c:param>
</c:url>
<c:redirect url="${daum}"></c:redirect>