JSP

[JSP] 리스너 클래스, JSTL

코딩 수달 2022. 8. 18. 22:53
728x90
반응형

리스너 클래스 

  • (서블릿처럼) 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.jar
0.02MB
standard.jar
0.38MB

파일 경로 

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>&lt;회원 리스트&gt;</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>

 

728x90
반응형