-
14. 서블릿 관련 Listener API개발자 수업/JSP 2021. 12. 6. 16:58
1. Listener API
1) 서블릿에서 발생하는 이벤트에 대해서 처리할수 있는 기능
- HttpSessionBindingListenenr 이용해 로그인 접속자수 표시
- HttpSessionListener 이용해 로그인 접속자수 표시<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>로그인</title> </head> <body> <form name="frmLogin" method="post" action="login2" enctype="utf-8"> 이름 : <input type="text" name="user_name"><br> 비밀번호 : <input type="password" name="user_pw"><br> <input type="submit" value="로그인"> <input type="reset" value="다시 입력"> </form> </body> </html>
package kr.co.ezenac.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; @WebServlet("/login2") public class LoginTest extends HttpServlet{ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.setCharacterEncoding("utf-8"); //post방식으로 한글 전송시 인코딩 작업 생략함 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); String user_name = request.getParameter("user_name"); String user_pw = request.getParameter("user_pw"); //이벤트 핸들러를 생성 LoginImple loginUser = new LoginImple(user_name, user_pw); if(session.isNew()) { //세션에 바인딩시 LoginImple의 valueBound() 메서드를 호출함 session.setAttribute("loginUser", loginUser); } out.print("<html><head>"); out.print("<script type='text/javascript'>"); out.print("setTimeout('history.go(0)', 5000)"); //5초마다 서블릿에 재요청 out.print("</script>"); out.print("</head>"); out.print("<body>"); out.print("아이디는 " + loginUser.user_id + "<br>"); out.print("총 접속자수는 " + LoginImple.total_user + "<br>"); //접속자 수를 브라우저로 출력 out.print("</body></html>"); } }
package kr.co.ezenac.listener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; //세션에 바인딩시 이벤트를 처리함 public class LoginImple implements HttpSessionBindingListener{ String user_id; String user_pw; static int total_user = 0; //세션에 바인딩시 1씩 증가시킴 public LoginImple() { } public LoginImple(String user_id, String user_pw) { this.user_id = user_id; this.user_pw = user_pw; } //세션에 저장시 접속자 수를 증가시킴 @Override public void valueBound(HttpSessionBindingEvent event) { System.out.println("사용자 접속"); ++total_user; } //세션에서 소멸시 접속자 수를 감소시킴 @Override public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("사용자 접속 해제"); total_user--; } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>로그인</title> </head> <body> <form name="frmLogin" method="post" action="login3" enctype="utf-8"> 이름 : <input type="text" name="user_name"><br> 비밀번호 : <input type="password" name="user_pw"><br> <input type="submit" value="로그인"> <input type="reset" value="다시 입력"> </form> </body> </html>
package kr.co.ezenac.listener02; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletContext; 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; @WebServlet("/login3") public class LoginTest extends HttpServlet{ ServletContext context = null; List userList = new ArrayList(); //로그인한 접속자 ID를 저장하는 ArrayList @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.setCharacterEncoding("utf-8"); //post방식으로 한글 전송시 인코딩 작업 생략함 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); context = getServletContext(); HttpSession session = request.getSession(); String user_name = request.getParameter("user_name"); String user_pw = request.getParameter("user_pw"); //LoginImple 객체 생성한 후 전송된 ID와 비밀번호를 저장함 LoginImple loginUser = new LoginImple(user_name, user_pw); //최초 로그인시 접속자 ID를 ArrayList에 차례로 저장한 후 다시 context 객체에 속성으로 저장함 if(session.isNew()) { session.setAttribute("loginUser", loginUser); userList.add(user_name); context.setAttribute("userList", userList); } out.print("<html>"); out.print("<body>"); out.print("아이디는 " + loginUser.user_id + "<br>"); out.print("총 접속자 수는 " + LoginImple.total_user + "<br>"); //총 접속자 수를 브라우저로 출력 out.print("접속 아이디 : "); //context 객체의 ArrayList를 가져와 접속자 ID를 차례대로 브라우저에 출력함 List list = (ArrayList)context.getAttribute("userList"); for(int i=0; i<list.size(); i++) { out.print(list.get(i) + "<br>"); } //로그아웃 클릭시 서블릿 logout으로 접속자 ID를 전송해 로그아웃함 out.print("<a href='logout?user_id=" + user_name + "'>로그아웃</a>"); out.print("</body></html>"); } }
package kr.co.ezenac.listener02; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * Application Lifecycle Listener implementation class LoginImple * */ @WebListener //어노테이션으로 리스너가 등록된 것임 public class LoginImple implements HttpSessionListener { String user_id; String user_pw; static int total_user = 0; //세션에 바인딩시 1씩 증가시킴 /** * Default constructor. */ public LoginImple() { // TODO Auto-generated constructor stub } public LoginImple(String user_id, String user_pw) { this.user_id = user_id; this.user_pw = user_pw; } /** * @see HttpSessionListener#sessionCreated(HttpSessionEvent) * 세션 생성시 이벤트 처리함 */ public void sessionCreated(HttpSessionEvent se) { System.out.println("세션 생성"); ++total_user; //세션 생성시 접속자 수를 1증가시킴 } /** * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) * 세션 소멸시 이벤트 처리함 */ public void sessionDestroyed(HttpSessionEvent se) { System.out.println("세션 소멸"); --total_user; //세션 소멸시 접속자 수를 1 감소시킴 } }
package kr.co.ezenac.listener02; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletContext; 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; @WebServlet("/logout") public class LogoutTest extends HttpServlet{ ServletContext context; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.setCharacterEncoding("utf-8"); //post방식으로 한글 전송시 인코딩 작업 생략함 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); context = getServletContext(); HttpSession session = request.getSession(); //userList에서 삭제할 ID를 가져옴 String user_id = request.getParameter("user_id"); session.invalidate(); //로그아웃시 세션을 소멸시킴 //userList에서 로그아웃한 접속자 ID를 삭제한 후 다시 userList를 컨텍스트에 저장함 List userList = (ArrayList)context.getAttribute("userList"); userList.remove(user_id); context.removeAttribute("userList"); context.setAttribute("userList", userList); out.print("<br>로그아웃 했습니다."); } }
'개발자 수업 > JSP' 카테고리의 다른 글
16. JSP 내장 객체(내장 변수) (0) 2021.12.07 15. JSP와 구성요소 + 연습 (0) 2021.12.07 13. 필터 API (0) 2021.12.06 12. 서블릿 스코프, URL 패턴 (0) 2021.12.06 11. 웹 페이지 연결 기능 (0) 2021.12.03