1. 패키지 서점; 2. javax.servlet.http.HttpSessionBindingListener를 가져옵니다. 3. javax.servlet.http.HttpSessionBindingEvent를 가져옵니다. 4. java.sql.* 가져오기; 5. java.text.SimpleDate 양식을 가져옵니다. 6. java.util.Date를 가져옵니다. 7. 8. 공용 클래스 사용자가 HttpSessionBindingListener를 구현합니다. 9. { 10.… 11. private String loginDatetime; //사용자 로그인 시간; 12.… 13. 공개 무효 valueBound(HttpSessionBindingEvent 이벤트) 14. { 15. 연결 연결 = null; 16. String sqlStr = "T_LOGIN_LOG(ID, USER_ID, DT_LOGIN)에 삽입 " + 17. " 값(SEQ_LOGIN_LOG_ID.NEXTVAL,?,? )"; 18. 시도해 보세요 19. { 20. conn = DBConnection.getConnection(); 21. ReadyStatement pStat = conn.prepareStatement(sqlStr); 22. loginDatetime = getCurrDatetimeStr() //현재 시간 문자열 23. pStat.setString(1, userId); 24. pStat.setString(2, loginDatetime); 25. pStat.executeUpdate(); 26. 27. } catch(SQLException e) 28. { 29. 새로운 RuntimeException을 발생시킵니다( 30. "사용자 로그인 로그 작성 오류"); 31. } 마침내 32. { 33. 시도해 보세요 34. { 35. 만약 (conn != null) 36. { 37. conn.close(); 38. } 39. } catch (SQLException ex) 40. { 41. ex.printStackTrace(); 42. } 43. } 44. } 45. 46. public void valueUnbound(HttpSessionBindingEvent 이벤트) 47. { 48. 연결 연결 = null; 49. String sqlStr = " T_LOGIN_LOG 업데이트 DT_LONOUT = ? " + 50. "여기서 USER_ID=? 및 DT_LOGIN = ?"; 51. 시도해 보세요 52. { 53. conn = DBConnection.getConnection(); 54. 준비된Statement pStat = conn.prepareStatement(sqlStr); 55. pStat.setString(1, getCurrDatetimeStr()); 56. pStat.setString(2, userId); 57. pStat.setString(3, loginDatetime); 58. pStat.executeUpdate(); 59. 60. } catch(SQLException e) 61. { 62. 새로운 RuntimeException을 발생시킵니다( 63. "사용자 종료 로그 쓰기 오류"); 64. } 마침내 65. { 66. 시도하다 67. { 68. 만약 (conn != null) 69. { 70. conn.close(); 71. } 72. } catch (SQLException ex) 73. { 74. ex.printStackTrace(); 75. } 76. } 77. } 78. 79. //현재 시간 문자열을 가져와 yyyyMMddHHmmss 형식으로 반환합니다(예: 20050505010101). 80. 개인 정적 문자열 getCurrDatetimeStr() 81. { 82. SimpleDate form at sdf = new SimpleDate form at("yyyyMMddHHmmss"); 83. return sdf.at(new Date()); 84. } 85. } |
valueBound() 메소드는 로그인 로그를 T_LOGIN_LOG 테이블에 삽입하고 valueUnbound() 메소드에서 로그 테이블의 종료 시간을 업데이트합니다. 또한 80~84행에서는 현재 시간 문자열을 가져오는 getCurrDatetimeStr() 메소드를 제공합니다. 이 메소드는 로그인 및 종료 시점의 시간 문자열을 얻는 데 사용됩니다.
다음은 사용자가 로그아웃할 때까지 거치는 단계를 설명하여 프로그램이 사용자의 로그인 및 로그아웃 시간을 기록하는 방법을 설명합니다.
1. 사용자가 login.jsp를 통해 로그인하기 위해 비밀번호를 입력하면 프로그램은 switch.jsp 제어 페이지로 전환됩니다.
2. switch.jsp에서는 session.setAttribute("ses_userBean", userBean) 메소드를 통해 User.java 클래스의 userBean 객체를 세션에 바인딩합니다.
3. 이때 userBean 객체의 HttpSessionBindingListener 인터페이스 메소드 valueBound()가 호출되어 T_LOGIN_LOG 테이블에 로그인 로그가 삽입된다.
4. switch.jsp는 Welcome.jsp 페이지로 전환됩니다.
5. 사용자가 시스템을 종료하기 위해 Welcome.jsp 페이지의 링크를 클릭하면 quit.jsp 페이지로 리디렉션됩니다.
6. quit.jsp는 session.invalidate() 메소드를 호출하고 userBean 객체는 세션에서 지워집니다.
7. 이때 userBean 객체의 HttpSessionBindingListener 인터페이스 메서드의 valueUnbound() 메서드가 호출되어 로그 종료 시간이 업데이트되고 브라우저 창이 닫힙니다.
HttpSessionBindingListener 인터페이스는 웹 컨테이너의 이벤트 인터페이스입니다. 인터페이스를 구현하는 클래스는 이벤트가 발생할 때 자동으로 호출됩니다. 이러한 이벤트 인터페이스는 다음과 같습니다.
·ServletContextListener 인터페이스: 웹 컨테이너 시작 및 소멸을 위한 이벤트 처리 인터페이스에는 두 가지 메소드가 정의됩니다.
·ServletContextAttributeListener 인터페이스: 웹 컨텍스트 속성이 변경될 때 이벤트 처리 인터페이스입니다.
·HttpSessionListener 인터페이스: 세션 생성 및 소멸 이벤트를 위한 이벤트 처리 인터페이스입니다.
·HttpSessionAttributeListener 인터페이스: 세션 세션에서 속성 개체 변경에 대한 이벤트 처리 인터페이스는 이전에 사용한 HttpSessionBindingListener 인터페이스와 유사합니다.
또한 J2EE1.4에는 두 가지 다른 이벤트 처리 인터페이스가 제공됩니다.
·ServletRequestListener 인터페이스: 요청 요청 객체 생성 및 파기 이벤트 처리 인터페이스입니다.
·ServletRequestAttributeListener 인터페이스: Request에서 속성 객체 변경 시 이벤트 처리 인터페이스.
프로그램 배포
웹 프로그램 개발이 완료되면 프로그램 배포 작업을 시작합니다. 이 웹 응용 프로그램을 Tomcat5.0 웹 응용 프로그램 서버에 배포하려고 합니다.
먼저 웹 애플리케이션의 기본 홈페이지를 설정한 다음 전체 웹 프로그램을 WAR 아카이브 파일로 패키징합니다.
1. 기본 액세스 페이지를 설정하고 프로젝트 창에서 webModule 노드를 두 번 클릭하면 JBuilder가 콘텐츠 창에 다음 페이지를 표시합니다.
그림 26 웹 프로그램이 접근하는 기본 페이지 설정
Welcome files 목록 오른쪽에 있는 Add... 버튼을 클릭하고 팝업 대화 상자에 login.jsp를 입력한 후 OK 버튼을 누르면 login.jsp 페이지가 기본 페이지로 설정됩니다. web.xml 배포 설명 파일에 다음과 같은 굵은 배포가 추가됩니다.
코드 목록 19 웹 애플리케이션 기본 페이지
1.…
2. <웹앱>
3. <표시 이름>webModule<//표시 이름>
4. <웰컴 파일 목록>
5. <환영파일>login.jsp</환영파일>
6. </welcome-file-list>
7.…
8. </웹앱>
사용자가 URL에 특정 액세스 파일 이름을 지정하지 않으면 웹 컨테이너는 URI 아래에 login.jsp 파일이 있는지 자동으로 확인하고, 있으면 이 파일을 직접 호출합니다.
2. 프로젝트 창의 리소스 트리에서 webModule 노드를 마우스 오른쪽 버튼으로 클릭하고 속성...->빌드->빌드 설정 패널에서 다음 그림과 같이 웹 아카이브 빌드를 프로젝트 또는 모듈을 빌드할 때 옵션으로 설정합니다.
그림 27 프로젝트 또는 웹 모듈 재구축 시 생성될 WAR 아카이브 파일 설정
3. 프로젝트 패널에서 Chapter13.jpx를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 Rebuild를 선택하여 전체 프로젝트를 컴파일합니다.
4. 컴파일이 완료되면 프로젝트 루트 디렉터리에 webModule.war 파일이 생성됩니다.
5. webModule.war 파일을 <JBuilder2005 설치 디렉터리>/thirdparty/jakarta-tomcat-5.0.27/webapps 디렉터리에 복사합니다.
이것으로 웹 애플리케이션 배포가 완료됩니다. 다음으로 Tomcat 5.0 웹 애플리케이션 서버를 시작하고 방금 배포된 webModule.war 애플리케이션에 액세스합니다.
1. <JBuilder2005 설치 디렉터리>/thirdparty/jakarta-tomcat-5.0.27/bin 아래의 start.bat를 두 번 클릭하여 Tomcat 5.0 웹 응용 프로그램 서버를 시작합니다(충돌을 방지하려면 현재 JBuilder에서 실행 중인 웹 응용 프로그램이 없는지 확인하십시오). .
2. IE를 열고 http://localhost:8080/webModule을 입력하면 다음 그림과 같이 방금 배포한 웹 애플리케이션에 올바르게 액세스할 수 있습니다.
그림 28 배포 후 login.jsp의 액세스 효과
Tomcat 서버는 기본적으로 포트 8080에서 작동하므로 시스템 이름 뒤에 포트 번호를 추가해야 합니다. conf 디렉터리에 있는 Tomca의 server.xml 구성 파일을 변경하여 이 포트 번호를 변경할 수 있습니다.
우리 웹 애플리케이션의 WAR 파일 이름은 webModule.war이므로 웹 서버가 시작된 후 WAR 파일은 webModule 디렉터리에 자동으로 압축 해제되므로 http://localhost:8080/webModule을 통해 액세스해야 합니다. 또한, 기본 접속 페이지는 login.jsp이므로 특정 페이지를 지정하지 않은 경우에는 login.jsp 페이지가 호출된다.