여러 가지 서블릿 관련 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와 접속자 수가 표시됩니다.


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 |