FireDrago

[Servlet] EventListener 사용하기 본문

카테고리 없음

[Servlet] EventListener 사용하기

화이용 2023. 7. 10. 17:53

서블릿은 여러가지 이벤트를 발생에 따라 적절한 처리를 해주는 Listener API를 제공한다.

특정 작업을 인식하고 이에 알맞는 작업을 처리하기위해 사용된다. 

(접속자 수를 알려주거나 , 데이터베이스 연결등 여러 응용이 가능하다)

 

Listener 추상 메서드 기능
ServletContextAttributeListener attributeAdded()
attributeRemoved( )
attributeReplace( )
Context 속성 추가/제거/ 수정 시
HttpSessionListner sessionCreated( )
sessionDestroyed( )
세션 객체 생성/소멸 시
ServletRequestListener requestInitiallized( )
requestDestroyed( )
request 요청 발생시
ServletRequestAttributeListener attributedAdded( )
attributedRemoved( )
attributeReplaced( )
request 객체 속성 추가/제거/수정 시
HttpSessionBindingListner valueBound( )
valueUnbound( )
세션에 바인딩/ 언바인딩 객체 알려줄 시
HttpSessionAttributeListner attributedAdded( )
attributedRemoved( )
attributedReplaced( )
세션에 속성 추가/제거/수정 시
ServletContextListner contextInitialized( )
contextDestroyed( )
Context 객체 생성/소멸 시
HttpSessionActivationListener sessionDidActivate( )
sessionWillPassivate( )
세션 활성화 / 비활성화 시

 

 

구체적으로 어떤 식으로 작성하는지 살펴보자

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


@WebListener
public class LoginImpl implements HttpSessionListener {
    static int total_user=0;

    @Override
    public void sessionCreated(HttpSessionEvent se)  { 
    	System.out.println("세션 생성");
    	++total_user;
    }
	@Override
    public void sessionDestroyed(HttpSessionEvent se)  { 
         System.out.println("세션 소멸");
         --total_user;
    }
	
}

세션생성, 소멸시 이벤트 처리를 위해 HttpSessionListner 인터페이스를 구현한다.

 

세션 생성 ------- > sessionCreated 오버라이딩

세션 소멸 --------> sessionDestroyed 오버라이딩

 

구체적으로 살펴보면 로그인 요청되어  서버에서 세션이 생성될때 접속자수 (total_user)의 값이 1증가한다. 

세션이 소멸되면 (로그인 정보 소멸)  접속자 수 도 1 줄어든다.

리스너 객체를 봤으니, 실제 서블릿에서 리스너 객체를 어떻게 실행하는지 살펴보자

 

@WebServlet("/login")
public class LoginTest extends HttpServlet {
	ServletContext context =null;
	List user_list = new ArrayList();
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		context = getServletContext();
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		LoginImpl loginUser = new LoginImpl();
		if (session.isNew()) {
			session.setAttribute("loginUser", loginUser);
            session.setAttribute("id",id);
            session.setAttribute("pw",pw);
			user_list.add(user_id);
			context.setAttribute("user_list", user_list);
		}
		out.print("<html><body>");
		out.print("아이디는 "+loginUser.user_id+"<br><br>");
		out.print("총 접속자 수 : "+LoginImpl.total_user+"<br><br>");
		out.print("접속 아이디:<br>");
		List list =(ArrayList)context.getAttribute("user_list");
		for (int i=0; i<list.size(); i++) {
			out.print(list.get(i)+"<br>");
		}
		out.print("<a href='logout?user_id="+user_id+"'>로그아웃 </a>");
		out.print("</body></html>");
	}
}

LoginImpl loginUser = new LoginImpl( );

if (session.isNew()) {

session.setAttribute("loginUser", loginUser);

 

@WebListner 애너테이션에 따라 was(톰캣)이 객체를 자동으로 생성하고,

이에 맞는 이벤트가 발생시에 (이번 예제에서는 세션생성) 정의된 동작을 실행시킨다.