프로그래밍 언어/자바 웹

여러 가지 서블릿 관련 Listener API

· 코딩마이데이

자바 GUI에서는 마우스 클릭과 같은 이벤트 발생 시 여러 가지 이벤트 핸들러를 이용해 화면의 기능을 구현합니다. 이처럼 서블릿에서도 서블릿에서 발생하는 이벤트에 대해 적절한 처리를 해결해주는 여러 가지 리스너를 제공합니다.

 

서블릿 관련 여러 가지 리스너들

서블릿 관련 Listener 추상 메서드 기능
ServletContextAttributeListener attributeAdded( )
attributeRemoved( )
attributeReplaced( )
Context 객체에 속성 추가/제거/수정 이벤트 발생 시 처리
HttpSessionListener sessionCreated( )
sessionDestroyed( )
세션 객체의 생성/소멸 이벤트 발생 시 처리
ServletRequestListener requestInitialized( )
requestDestroyed( )
클라이언트의 요청 이벤트 발생 시 처리
ServletRequestAttibuteListener attributedAdded( )
attributedRemoved( )
attributeReplaced( )
요청 객체에 속성 추가/제거/수정 이벤트 발생 시 처리
HttpSessionBindingListener valueBound( )
valueUnbound( )
세션에 바인딩/언바인딩된 객체를 알려주는 이벤트 발생 시 처리
HttpSessionAttributeListener attributedAdded( )
attributedRemoved( )
attributeReplaced( )
세션에 속성 추가/제거/수정 이벤트 발생 시 처리
ServletContextListener contextInitialized( )
contextDestroyed( )
컨텍스트 객체의 생성/소멸 이벤트 발생 시 처리
HttpSessionActivationListener sessionDidActivate( )
sessionWillPassivate( )
세션의 활성화/비활성화 이벤트 발생 시 처리

 

HttpSessionBindingListener 이용해 로그인 접속자수 표시

1. 다음과 같이 실습 파일을 새로 준비합니다.

실습 파일 위치

 

 

2. ID와 비밀번호를 입력하여 전송하는 로그인창을 작성합니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
  <form name="frmLogin" method="post" action="login" encType="utf-8">
      아이디  :<input type="text" name="user_id"><br>
      비밀번호:<input type="password" name="user_pw"><br>
       <input type="submit" value="로그인">
       <input type="reset" value="다시입력">
  </form>
</body>
</html>

 

3. LoginTest 클래스를 다음과 같이 작성합니다. LoginImpl, loginUser=new LoginImpl(user_id, user_pw)를 실행하여 전송된 ID와 비밀번호를 저장합니다. 또 session.setAttribute("loginUser", loginUser)으로 세션에 바인딩 시 미리 HttpSessionBindingListener를 구현한 LoginImpl의 valueBound() 메서드를 호출합니다.

package sec04.ex01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/login")
public class LoginTest extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		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(user_id, user_pw);
		if (session.isNew()) {
			session.setAttribute("loginUser", loginUser);
		}
		
		out.println("<head>");
		out.println("<script  type='text/javascript'>");
		out.println("setTimeout('history.go(0);', 5000)");
		out.println("</script>");
		out.println("</head>");
		out.println("<html><body>");
		out.println("아이디는 " + loginUser.user_id + "<br>");
		out.println("총 접속자수는" + LoginImpl.total_user + "<br>");
		out.println("</body></html>");
	}
}

 

4. LoginImpl 클래스를 다음과 같이 작성합니다. HttpSessionBindingListener를 구현하여 세션에 바인딩 이벤트를 처리하는 이벤트 핸들러가 구현되어 있습니다. 세션에 바인딩 시 valueBound()가 호출되어 static 변수인 total_user의 값을 1 증가시킵니다.

package sec04.ex01;

import jakarta.servlet.http.HttpSessionBindingEvent;
import jakarta.servlet.http.HttpSessionBindingListener;

public class LoginImpl implements HttpSessionBindingListener{
	String user_id;
	String user_pw;
	static int total_user = 0;
	public LoginImpl() {
		
	}
	
	public LoginImpl(String user_id, String user_pw) {
		this.user_id = user_id;
		this.user_pw = user_pw;
	}
	
	@Override
	public void valueBound(HttpSessionBindingEvent arg0) {
		System.out.println("사용자 접속");
		++total_user;
	}
	
	@Override
	public void valueUnbound(HttpSessionBindingEvent arg0) {
		System.out.println("사용자 접속 해제");
		total_user--;
	}
}

 

5. 서로 다른 종류의 브라우저에서 접속하여 실행 결과를 확인해 보겠습니다. 우선 크롬에서 로그인하면 접속자 ID와 접속자수가 표시됩니다.

크롬에서 로그인한 결과

 

 

6. 이번에는 Microflow Edgedp 로그인하면 다음과 같이 접속자 ID와 접속자 수가 표시됩니다.

Microflow Edge에서 로그인한 결과

 

7. 5초 후 크롬에서 접속자수가 갱신되어 표시됩니다.

크롬 화면 재접속 시 갱신된 접속자 수

 

HttpSessionBindingListener를 구현한 LoginImpl 클래스는 리스너를 따로 등록할 필요가 없습니다.

'프로그래밍 언어 > 자바 웹' 카테고리의 다른 글

JSP 등장 배경  (1) 2025.09.10
HttpSessionListener 이용해 로그인 접속자수 표시  (0) 2025.09.07
Filter API  (1) 2025.09.01
서블릿의 여러 가지 URL 패턴  (0) 2025.08.29
서블릿 속성과 스코프  (1) 2025.08.26