[JSP] 리스너 클래스, JSTL
리스너 클래스
- (서블릿처럼) POJO가 아닌 클래스
- 특수한 형태의 서블릿
- 어떤 동작을 모니터링(감지)할지 선택할 수 있음!
해당 동작을 감지하면, 본인을 자동호출할 수 있게됨!! - 인터페이스 동작이 감지되면, 내가 구현한 코드가 자동호출됨
=> ex) 톰캣의 시작
JSTL ( Java Pages Standard Tag Library )
일반적으로 알고있는 JSTL 이란 JSTL + EL 의 조합
JSTL 의 정식명칭은 자바 서버 페이지 표준 태그 라이브러리이고 줄여서 JSTL
이러한 JSTL 은 JSP 페이지 내에서 자바코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공
JSTL 장점
- 빠른 개발 : JSP를 단순화 하는 많은 태그를 제공
- 코드의 재사용성: 다양한 페이지에서 JSTL 태그 사용 가능
- 스크립틀릿 태그를 사용할 필요가 없음
- 날짜, 시간, 숫자의 포멧
- 데이터베이스로의 CRUD
JSTL 의 사용법
첨부된 두 라이브러리를 WEB-INF파일 내부의 lib파일에 추가한 후, 페이지 지시어인 taglib로 사용할 라이브러리를 선언
파일 경로
JSTL은 라이브러리이기 때문에 사용하기 전에 core 를 header 에 추가
<% @taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
core 태그
c:out
|
<% = ... %> 태그 작동 방식과 유사한 표현식의 결과를 표시
|
c:import
|
상대 또는 절대 URL을 검색하여 내용을 'var'의 문자열, 'varReader'의 Reader 또는 페이지에 표시
|
c:set
|
평가중인 표현식의 결과를 'scope'변수에 설정
|
c:remove
|
특정 범위에서 지정된 범위 변수를 제거하는 데 사용
|
c:catch
|
본문에서 발생하는 Throwable 예외를 포착하는 데 사용
|
c:if
|
조건을 테스트하는 데 사용되는 조건부 태그이며 표현식이 참인 경우에만 본문 내용을 표시
|
c:choose, c:when, c:otherwise
|
평가 된 조건이 true 인 경우 본문 내용을 포함하는 간단한 조건부 태그
|
c:forEach
|
기본 반복 태그, 고정 된 횟수 또는 초과 수집 동안 중첩 된 본문 내용을 반복
|
c:forTokens
|
제공된 델리 미터로 분리 된 토큰을 반복
|
c:param
|
포함하는 'import'태그의 URL에 매개 변수를 추가
|
c:redirect
|
브라우저를 새 URL로 리디렉션하고 컨텍스트 기준 URL을 지원
|
c:url
|
c:set과 비슷하며 get 방식으로 파라미터를 전달한다.
|
1.set
변수의 선언처럼 값을 저장하며, 저장되었기에 EL식으로 출력이 가능
<c:set var="msg" value="HELLO!"/>
${msg}
2. remove
셋팅된 변수를 삭제
<c:remove var="msg"/>
3. catch
본문에서 발생하는 Throwable 예외를 포착하는 데 사용
<c:catch var="errMsg">
<%= 10/0 %>
</c:catch>
<hr>
${errMsg}
4. if
test는 필수 속성으로, test내부의 내용이 참일때 수행될 내용을 태그 내부에 작성
var를 활용하여 true로 반환도 가능
표현식이 참인 경우에만 본문 내용을 표시
<c:set var="member" value="ADMIN"/>
<c:if test="${member =='ADMIN'}">
관리자모드입니다.
</c:if>
<c:if test="${member !='ADMIN'}">
일반모드입니다.
</c:if>
<c:if test="${member=='ADMIN'}" var="member">
${member}
</c:if>
5. choose, when
choose태그 내부에 <c:when>태그를 활용하여 분기처리 가능
<form>
<select name="sel">
<option ${param.sel=="-" ? 'selected':'' }>-</option><!-- 이전에 선택한게 - 이면 이전에 선택한게 유지되도록 -->
<option ${param.sel=="apple" ? 'selected':'' } >apple</option>
<option ${param.sel=="banana" ? 'selected':'' }>banana</option>
<option ${param.sel=="kiwi" ? 'selected':'' }>kiwi</option>
</select>
<input type="submit" value="선택">
</form>
<hr>
<c:choose>
<c:when test="${param.sel == 'apple'}">
apple을 선택하셨습니다.
</c:when>
<c:when test="${param.sel == 'banana'}">
banana를 선택하셨습니다.
</c:when>
<c:when test="${param.sel == 'kiwi'}">
kiwi를 선택하셨습니다.
</c:when>
<c:otherwise>
------
</c:otherwise>
</c:choose>
6. import
url속성을 통해 var라는 이름으로 내용을 들여올 주소를 지정
<c:out>태그를 활용해 이때 저장된 url은 html파일의 모든 태그들까지 text형식으로 불러오므로,
default true상태인 escapeXml을 false로 변경하여 파일의 태그들을 제외하고 내용만 출력
※ escapeXml ="true" 일 경우에는 해당 파일 전체 코드가 출력 됨
<c:import url="NewFile1.jsp" var="url"/>
<c:out value="${url}" escapeXml="false"/> <%--escapeXml태그내용이 해석되어 화면에 출력된다. --%>
7. url
c:set과 비슷하며 get 방식으로 파라미터를 전달
요청을 전달하기 위해서는 단독으로 불가능하므로 다른 태그의 도움이 필요
아래의 코드에서 traget에 요청을 전달할 url과 전달할 내용을 저장하고,
<a>태그를 통해 링크를 클릭하면 알맞은 요청이 지정된 url로 전달 됨
<c:url value="NewFile4.jsp" var="target">
<c:param name="sel">banana</c:param>
</c:url>
<hr>
${target}<br>
<a href="${target}">NewFile4.jsp 페이지로 banana 값(파라미터명:sel)을 보내는 링크</a>
8. redirect
url과 다르게 다른 태그의 도움 없이 아래의 코드만으로 지정된 url로 <c:redirect>내부의 내용이 전달
<c:redirect url="NewFile4.jsp"> <%-- 요청을 바로 보여주는 친구 --%>
<c:param name="sel">kiwi</c:param>
</c:redirect>
9. out
<% = ... %> 태그 작동 방식과 유사한 표현식의 결과를 표시
package day46;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class InitialMember implements ServletContextListener {
public InitialMember() {
}
public void contextDestroyed(ServletContextEvent sce) {
// 톰캣의 종료를 감지(모니터링)
}
public void contextInitialized(ServletContextEvent sce) {
// 톰캣(서버,서블릿 컨테이너)의 시작을 감지(모니터링)
ArrayList<Member> datas=new ArrayList<Member>();
for(int i=1;i<10;i++) {
Member data=new Member("홍길동"+i,"010-1234-567"+i);
datas.add(data);
}
datas.add(new Member("임꺽정",null));
datas.add(new Member("아무무",null));
// context == application scope
ServletContext context=sce.getServletContext();
context.setAttribute("datas", datas);
context.setAttribute("data", new Member());
}
}
<h1><회원 리스트></h1>
<table border="1">
<tr>
<th>이름</th>
<th>전화번호</th>
</tr>
<c:forEach var="v" items="${datas}"><!-- 어플리케이션 스코프 내장객체에 저장된 datas -->
<tr>
<td>${v.name}</td>
<!-- <td>${v["phone"]}</td> -->
<td><c:out value="${v.phone}" escapeXml="false"><font color="red">phone 정보없음</font></c:out></td>
<!-- 태그 안에있는 모든 내용을 문자열로 인식하는데 escapeXml을 false로 해주어야 태그로 인식한다. -->
</tr>
</c:forEach>
</table>