ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글