본문 바로가기

개발자노트/웹

HTML - JSP - 커스텀태그에서 for문 (for each)사용 (리스너 클래스 사용)

커스텀 태그에서 for:each를 사용하는 방법이다.

 

 

우선 리스너 클래스를 사용해 서버의 시작을 감지해서

for문을 이용해 객체의 생성과 datas에 그 객체들을 넣는 작업까지 해주었다.

package test;

import java.util.ArrayList;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * Application Lifecycle Listener implementation class InitialMember
 *
 */
@WebListener
public class InitialMember implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public InitialMember() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent sce)  { 
         // 톰캣의 종료
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sce)  { 
         // context == application scope 
    	 // 톰캣(서버,서블릿 컨테이너)의 시작을 감지(모니터링)
    	 // 시작을 감지하면 아래의 내용을 수행
    	
    	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));
    	
    	ServletContext context=sce.getServletContext(); // application scope의 데이터를 가져와서 
    	context.setAttribute("datas", datas); // 세팅해줌
    	context.setAttribute("data", new Member());
    }
	
}

 

그리고 ServletContext 를 사용하여 context.setAttribute로 ("datas", datas); 로 datas라는 이름으로 datas를 세팅해줬다.

 

그 후 .jsp 파일에서는 < c: foreach > 를 사용하여 datas의 정보들을 꺼내서 확인해 볼 것인데,

items 에는 스코프에 set 해놓은 datas를 써주면 되고, begin과 end는 말 그대로 시작과 끝값을 지정해주면 된다.

그리고 varStatus=는 변수에 대한 정보를 볼 수 있는데,

status.index는 배열의 index 처럼 0부터 시작되고,

status.count는 지금까지 출력된 갯수를 카운트 해준다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>for</title>
</head>
<body>

<c:forEach var="v" items="${datas}" begin="0" end="3" varStatus="status">
	index: ${status.index}<br>
	count: ${status.count}<br>
	${v.name} | ${v.phone}<hr>
</c:forEach>

<hr>

<c:forTokens items="사과,바나나,키위" delims="," var="v">
			<!-- 필수속성 items="값" delims="구분자" var="변수명" -->
	${v} <br>
<!-- 흔히 사용되진 않지만 외부기사,등을 가져와서 띄울 때 사용하면 좋음 -->
</c:forTokens>
</body>
</html>

그리고 forTokens는 item에 들어갈 값(내용) 을 적어주고

delims=" " 에는 구분자 여기서는 각각의 items들이  ( , ) 로 구분되어 있는 것을 볼 수 있다.

이러한 구분자를 기준으로 for문이 출력되게 된다.

 

 

 

수행결과

 

위에서 말햇듯, index는 0부터 시작되고 count는 1부터 시작된다.

그리고 begin / end 값을 지정해놓아서

리스너클래스에서 set 해준 datas 에는 i=1 ; i < 10 ; i++;  로 9개의 객체를 만들었음에도

인덱스 0~3까지 출력이 된 것을 볼 수 있고

 

forTokens 를 사용해 구분자를 구별해서 각 내용들을 각각 출력한 것을 볼 수 있다.