반응형
<리스너를 알기 위해 정리해야 할 개념>
-리스너
-이벤트
=>리스너는 이벤트가 발생함과 동시에 특정 행동 (메서드나 함수 실행)을 하는 것,
이것을 이벤트 핸들링이라고 한다.
=>이벤트는 발생한 특정 행동을 말한다. ex) 마우스 클릭, 키보드 키 입력, 텍스트 입력 ...
리스너(Listener)
이벤트가 발생하기를 기다리는 (청취하는) 컴포넌트(함수나 객체)를 말한다.
Java에서 리스너는 객체가 되고 특정 이벤트가 발생했을 때 실행될 메서드를 가지고 있다.
리스너 API
HttpSessionBindingListener implements 받아 로그인 접속자 수 카운트하기
우클릭 - Listener 클릭하여 생성
login2.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!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" action="login3" method="post" 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>
|
cs |
LoginTest.java
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
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 {
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);
//최초 로그인 시(isNew == true) 접속자 ID를 userList(ArrayList)에 차례로 저장한 후
//다시 context 객체에 속성으로 저장함.
if(session.isNew()) {
session.setAttribute("loginUser", loginUser);
userList.add(user_name);
context.setAttribute("userList", userList);
}
out.print("<html><head>");
out.print("<body>");
out.print("아이디는 "+loginUser.user_id+"<br>");
out.print("총 접속자 수는" + LoginImple.total_user+"<br>"); //접속자 수를 브라우저로 출력.
out.print("접속 아이디 : <br>");
//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>");
out.print("</head></html>");
}
}
|
cs |
LoginImple (리스너) ★★
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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;
/**
* Default constructor.
*/
public LoginImple() {
// TODO Auto-generated constructor stub
}
public LoginImple(String user_id, String user_pw) {
super();
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 감소시킴.
}
}
|
cs |
Logout.java
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import java.awt.desktop.UserSessionListener;
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 = null;
List userList = new ArrayList();
@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");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
context = getServletContext();
HttpSession session = request.getSession();
String urse_id = request.getParameter("user_id"); //userList에서 삭제할 아이디를 가져옴.
session.invalidate(); //로그아웃 시 세션을 소멸시킴.
//userList에서 로그아웃한 접속한 ID를 삭제한 후
//다시 userList를 컨텍스트에 저장함.
List list = (ArrayList)context.getAttribute("userList");
userList.remove(urse_id);
context.removeAttribute("userList");
context.setAttribute("userList", userList);
out.print("<br>로그아웃했습니다.");
}
}
|
cs |
<실행 화면>
접속자 수 1 증가
다른 브라우저(파이어폭스)에서 로그인해도
접속자 수 1증가 (1 -> 2)
로그아웃 해보면
다시 줄어듦!! (2->1)
반응형
'📒 education archive > 📍Servlet, JSP' 카테고리의 다른 글
[국비학원 기록/JSP] 스크립트 요소, 선언문, 스크립틀릿, 표현식, 주석문 (0) | 2021.12.07 |
---|---|
[국비학원 기록/JSP] JSP 구성 요소, 디렉티브 태그 종류 (0) | 2021.12.07 |
[국비학원 기록/Servlet] 서블릿 필터(Filter), 필터 한글(utf-8) 인코딩 (0) | 2021.12.06 |
[국비학원 기록/Servlet] 서블릿 스코프(scope), URL - pattern (0) | 2021.12.06 |
[국비학원 기록/Servlet] 쿠키, 세션, HttpSession (0) | 2021.12.03 |