티스토리 뷰

Servlet

서블릿 Listener

dev23 2024. 8. 13. 17:39
반응형

서블릿 리스너 API

- 자바 GUI에서는 마우스 클릭과 같은 이벤트 발생 여러 가지 이벤트 핸들러를 이용해 화면의 기능을 구현한다.

- 이처럼 서블릿에서도 서블릿에서 발생하는 이벤트에 대해 적절한 처리를 해주는 여러 가지 리스너를 제공한다.

 

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

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

 

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

- HttpSessionBindingListener를 이용해  페이지에 로그인한 접속자수를 알아본다.

 

* login.html

<!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>

 

* LoginTest.java

package listener;

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

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

/**
 * Servlet implementation class LoginTest
 */
@WebServlet("/login")
public class LoginTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	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); // 세션에 바인딩 시 LoginImpl의 valueBound() 메서드를 호출한다.
		}
		
		out.print("<html><head>");
		out.print("<script type='text/javascript'>");
		// JS의 setTimeout() 함수를 이용해 5초마다 서블릿에 재요청하여 현재 접속자수를 표시한다.
		out.print("setTimeout('history.go(0);',5000)");
		out.print("</script></haed><body>");
		out.print("아이디는 " +loginUser.user_id + "<br>");
		out.print("총 접속자수는 " + LoginImpl.total_user + "<br>"); // 총 접속자 수를 브라우저로 출력
		out.print("</body></html>");

	}

}

 

* LoginImpl.java

package listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
 * Application Lifecycle Listener implementation class LoginImpl
 *
 */
@WebListener
public class LoginImpl implements HttpSessionBindingListener {

	// 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--;
	}

	
}

 

- 여러 브라우저를 사용해 로그인을 해 보면 로그인한 수만큼 접속자 수가 증가하는 것을 볼 수 있다.

로그인 시 증가되는 접속자 수

 

반응형

'Servlet' 카테고리의 다른 글

필터  (0) 2024.08.13
서블릿 URL 패턴  (0) 2024.08.13
서블릿 속성 및 스코프  (0) 2024.08.13
encodeURL()  (0) 2024.08.13
서블릿 - 세션 로그인 예제  (0) 2024.08.12
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함