본문 바로가기

개발자노트/웹

[ 리스너 클래스 ]

[리스너 클래스]

→ 클래스로 끝난다 = .java
→ POJO가 아닌 클래스 ( 서블릿처럼 )
→ 특수한 형태의 서블릿 ( 서블릿을 상속받은 형태 ) 
→ 어떤 행동을 모니터링(감지) 할 지 선택할 수 있음
     해당 동작을 감지하면, 본인을 자동호출 할 수 있게됨
     onclick 콜백함수, addEventListner 와 비슷한 면이 있음
     : 인터페이스 동작이 감지되면, 내가 구현한 코드가 자동호출됨
     ☞ 맨위부터 체크 = 톰캣의 시작이 감지되면 코드가 실행
→ .jar 파일 을 WEB-INF / lib 폴더에 넣어줘야함

                    ↓↓↓↓

 

리스너클래스 생성방법

서버가 실행/종료 될 때 Listner 클래스가 하는 행위를 지정할 것이니 Lifecycle 체크 후 Finish

 

리스너 클래스 코드

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());
    }
	
}

 

MemberVO 코드

package test;

public class Member {

		private String name;
		private String phone;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getPhone() {
			return phone;
		}
		public void setPhone(String phone) {
			this.phone = phone;
		}
		public Member() { // 기본 생성자 오버로딩
			name="김티오";
			phone="010-1234-1234";
		}
		public Member(String name,String phone) {
			this.name=name;
			this.phone=phone;
		}
}

 

 

 

.jsp 코드

사용할 때는 핸들러 기반 커스텀태그와 비슷하니 태그 라이브러리 지시어를 사용해야하는 것을 유의!

<%@ 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>리스너 클래스 예제</title>
</head>
<body>
<h1>&lt;회원 리스트&gt;</h1> <!-- 꺽쇠괄호를 쓰고 싶어서 -->
						  <!-- 제어문자를 사용 -->

<table border="1">
   <tr>
      <th>이름</th>
      <th>전화번호</th>
   </tr>
   <c:forEach var="v" items="${datas}"> <!-- forEach가 내장 -->
   			  <!-- 왼쪽에 이름 오른쪽에 요소 -->
   <tr>
      <td>${v.name}</td>
      <td><c:out value="${v.phone}" escapeXml="false"><font color="red">phone 정보없음</font></c:out></td>
   									<!-- 기본값이 true, 태그 바디 안에 내용을 전부 문자열로 인식하기 때문에 -->
   </tr>							<!-- font color를 걸기 위해 false로 바꿈 -->
   </c:forEach>
</table>

 

 

수행결과

 

 

JAVA 코드를 사용하지 않고, useBean 또한 사용하지 않아도 정보를 받아올 수 있으며,
내장객체인 forEach 를 사용하여 출력할 수 있음