FireDrago
[Servlet] EventListener 사용하기 본문
서블릿은 여러가지 이벤트를 발생에 따라 적절한 처리를 해주는 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(톰캣)이 객체를 자동으로 생성하고,
이에 맞는 이벤트가 발생시에 (이번 예제에서는 세션생성) 정의된 동작을 실행시킨다.
