막강 커스텀 태그
<c:forEach>
JSTL의 <c:forEach> 태그를 사용하면 배열과 컬렉션 데이터를 루프로 돌리는 작업을 간단히 처리할수 있다.
JSP 코드
<% taglib prefix=”c” urihttp://java.sun.com/jsp/jstl/core %>
<html>
<body>
<strong> movie list : </strong>
<br>
<table>
<c:forEach var =”movie” items =”${movieList}”>
<tr>
<td> ${movie}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
<c:forEach>태그
<c:forEach var =”movie” items=”${movieList}”>
${movie}
</c:forEach>
//같은 의미
String[] items = (String[]) request.getAttribute(“movieList”);
for(int i = 0; i< items.length; i++){
String movie = items[i];
out.println(movie);
}
varStatus 속성으로 루핑횟수 알기
<table>
<c:forEach var=”movie” items=”${movieList}” varStatus=”movieLoopCount” >
<tr>
<td> count : ${movieLoopCount.count}</td>
</tr>
<td>${movie} <br><br></td>
</tr>
</c:forEach>
</table>
<c:forEach>안에 <c:forEach>를 품을수도 있습니다.
<c:forEach var=listElement” items=”${movies}”>
<c:forEach var=”movie” items=”${listElement}”>
<tr>
<td>${movie}</td>
</tr>
</c:forEach>
</c:forEach>
<c:if> 태그로 조건문 만들기
<%@ taglib prefix=”c” uri=http://java.sun.com/jsp/jstl/core %>
<html><body>
<hr>${commentList}</hr>
<c:if test=”${userType eq ‘member’}”>
<jsp:include page =”inputComents.jsp”/>
</c:if>
<body><html>
else의 표현은?
<c:if test=”${userpref==’preformance’}”> hello1 </c:if>
</c:if test=”${userpref==’safety’}”> hello2 </c:if>
또는
<c:choose>
<c:when test=”$userpref==’performance’)”>
hello1
</c:when>
<c:when test=”$userpref==’maintenance’)”>
hello2
</c:when>
<c:otherwise>
byebye
</c:otherwise>
</c:choose>
<jsp:setProperty> 보다 더 나은 <c:set>태그
<jsp:setProperty>태그는 오직 하나밖에 할줄 모릅니다. 빈이아니라 맵이라면 어떻게 값을 설정할건가요? 또 맵에 값을 하나 더 추가하고 싶을 경우에는 어떻게 하죠?
변수와 대상이 바로 그것인데 변수 var에는 속성으로 설정할 변수가 들어가고 target에는 빈 프로퍼티나 맵 값을 설정합니다. <c:set>태그에는 두가지 버전이 있는데 몸체가 있는 녀석과 몸체가 없는 녀석입니다. <c:set>몸체는 값<value>을 설정하는 또 하나의 방식입니다.
1.몸체가 없는 버전
<c:set var=”userLevel” scope=”session” value=”Cowboy” />
<c:set var=”fido” value=”${person.dog}”/>
2. 몸체가 있는버젼
<c:set var=”userLevel” scope =”session”>
sheriff, bartender, cowgirl
</c:set>
빈과 맵에 <c:set>태그 사용하기
1. 몸체가 없는 경우
<c:set target=”${PetMap}” property=”dogName” value=”Clover” />
2. 몸체가 있는경우
<c:set target=”${person”} property=”name}>
${foo.name}
</c:set>
———————————————————-<c:set> 핵심정리
<c:set> 태그는 쓰기는 쉽지만 몇가지 중요한 사항이 있으므로 반드시 짚고 넘어가야 합니다.
<c:set>태그에 var와 target을 동시에 사용할수 없습니다 .
scope은 옵션이니다. 없을경우 디폴트는 page 생존 범위입니다.
value가 널이면, var에 있는 속성은 제거되니다.
var 이름으로 속성이 없으면, 자동적으로 만듭니다. 하지만 value가 널이 아닐때만 그렇습니다.
target 표현식이 널이면, 컨테이너는 예외사항을 던집니다.
target에는 실제 객체를 표현하는 표현식이 들어가야 합니다. 빈이나 맵의 id 이름을 나타내는 물자열을 기입히면, 작동하지 않습니다. 즉, target은 빈이나 맵의 속성명이 아니라 속성 객체가 들어가야 하니다.
target 표현식이 빈이나 맵이 아니면 컨테이너는 예외사항을 던집니다.
target 표현식이 빈이고, property에 명기된 이름으로 된 프로퍼티가 빈에 없다면 컨테이너는 예외사항을 던집니다. 주의할 점은 프로퍼티가 빈에 없다고 하더라도 EL 표현식 그 자채만으로 예외사항을 발생시키니 않는다는 것입니다. 하지만 notAProperty를 target 속성값으로 사용하면 컨테이너는 예외사항을 던집니다.
<c:set>이 속성을 제거하기위해서는?
<c:remove>로 해야합니다.
<c:set var”userStatus” scope=”request” value=”Brillian”/>
userStatus: ${userStatus}<br>
<c:remove var=”userStatus” scope=”request”/>
<c:import>까지.. 이것까지 합쳐 이제 컨텐츠를 포함하는 방법이 모두 3가지로 늘었습니다.
1. incldue 지시자
<%@ include file=”Header.html”%> : 정적인 방식
2. <jsp:include> 표준 액션
<jsp:include page=”Header.jsp”/> : 동적인 방식 – 요청이 들어오는 시점에 page 속성에 명기한 파일을 현재 컨텐츠에 포함합니다.
3. <c:import> JSTL 태그
<c:import url =”http://www.wi.co.kr/sky/abc.html/>
동적인 방식 : 요청이 들어오는 시점에 URL속성에 명기한 파일을 현재 컨텐츠에 포함합니다. <jsp:include>와 비슷하게 행동하지만, 훨씬 막강하며 유연합니다.
<c:import>는 외부자원도 포함될수 있다.
-> jsp파일
<%@ taglib prefix=”c” uri=”http:/java.sun.com/jsp/jstl/core” %>
<html><body>
<c:import url=http://yahoo.co.kr />
</body></html>
서버 b 포함될 컨텐츠
<img src=”http://www.yahoo.co.kr/img/abc.gif”>
<c:param>으로 똑같은 일을 할수 있죠
1. <c:import> 태그가 있는 jsp
<c:import url=”Header.jsp”>
<c:param name=”subTitle” value=”yes we can” />
</c:import>
2. 포함될 파일(header.jsp)
<img src=”images/Web-Services.jpg”><br>
<em><strong>${param.subTitle}</strong></em>
나만의 오류 페이지를 만들어 보죠
오류 처리용 페이지(“errorPage.jsp”)
<%@ page isErrorPage=”true”%>
예외사항이 발생하는 페이지(“badPage.jsp”)
<%@ page errorPage=errorPage.jsp” %>
DD에서 오류 페이지 설정하기
모두다 적용되는 오류 페이지 선언
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/errorpage.jsp</location>
</error-page>
특정 예외사항 오류 페이지 선언
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/arithmeticError.jsp</location>
</error-page>
HTTP상태 코드에 따라 다르게 오류 페이지 선언
<error-page>
<error-code>404</error-code>
<location>/notFoundError.jsp</location>
</error-page>
오류 페이지에서만 쓸수 있는 객체 : exception
오류 페이지는 예외사항을 처리하지만 이도 엄연히 JSP 입니다. 하지만 다른 JSP와 달리 컨테이너에게 부여받은 내장 객체가 하나 더있으니 그것이 바로 exception 입니다. 물론 이 객체가 있다고 해서 사용자에게 그대로 예외사항을 보여주어야 하는것은 아닙니다.
서블릿에서 내장 객체인 exception을 쓸수 있었듯이 JSP에서 EL 표현식으로 ${pageContext,exception}로 내장객체에 접근할수도 있습니다.
명시적으로 오류 페이지임을 나타낸 페이지(“errorPage.jsp”)
<%@ page isErrorPage=”ture” %>
<html><body>
You caused a ${pageContext.exception} on the server.<br>
<c:catch> 태그. 자바의 try/catch문
<c:catch> 태그로 의심되는 태그를 감싸면 자바의 <try/catch>와 동일한 메커니즘으로 작동합니다. 즉 DD에서 선얺ㄴ 오류 페이지가 사용자 화면에 나타날 겁니다.
<c:catch>
<% int x = 10/ 0; %>
</c:catch>
Exception을 속성으로 만들수 있어요
<c:catch var=”myException”>
Inside the catch
<% int x = 10/0; %>
</c:catch>
<c:if test=”${myException != null}”>
there was an exception: ${myException.message}<br>
</c:if>