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. частная строка loginDatetime //Время входа пользователя; 12.… 13. public void valueBound (событие HttpSessionBindingEvent) 14. { 15. Соединение конн = ноль; 16. Строка sqlStr = "вставить в T_LOGIN_LOG(ID, USER_ID, DT_LOGIN)" + 17. "значения(SEQ_LOGIN_LOG_ID.NEXTVAL,?,? )"; 18. попробовать 19. { 20. conn = DBConnection.getConnection(); 21. ReadedStatement pStat = conn.prepareStatement(sqlStr); 22. loginDatetime = getCurrDatetimeStr(); //строка текущего времени; 23. pStat.setString(1, идентификатор пользователя); 24. pStat.setString(2, loginDatetime); 25. pStat.executeUpdate(); 26. 27. } catch (SQLException e) 28. { 29. выдать новое RuntimeException( 30. «Ошибка записи журнала входа пользователя»); 31. } наконец 32. { 33. попробовать 34. { 35. если (conn != ноль) 36. { 37. конн.закрыть(); 38. } 39. } catch (SQLException ex) 40. { 41. ex.printStackTrace(); 42. } 43. } 44. } 45. 46. public void valueUnbound (событие HttpSessionBindingEvent) 47. { 48. Соединение конн = ноль; 49. Строка sqlStr = "обновить T_LOGIN_LOG, установить DT_LONOUT =?" + 50. "где USER_ID=? и DT_LOGIN =?"; 51. попробовать 52. { 53. conn = DBConnection.getConnection(); 54. ReadedStatement pStat = conn.prepareStatement(sqlStr); 55. pStat.setString(1, getCurrDatetimeStr()); 56. pStat.setString(2, идентификатор пользователя); 57. pStat.setString(3, loginDatetime); 58. pStat.executeUpdate(); 59. 60. } catch (SQLException e) 61. { 62. выдать новое RuntimeException( 63. «Ошибка записи журнала выхода пользователя»); 64. } наконец 65. { 66. попробовать 67. { 68. если (conn != ноль) 69. { 70. конн.закрыть(); 71. } 72. } catch (SQLException ex) 73. { 74. ex.printStackTrace(); 75. } 76. } 77. } 78. 79. //Получаем строку текущего времени и возвращаем ее в формате ггггММддЧЧммсс, например 20050505010101 80. частная статическая строка getCurrDatetimeStr() 81. { 82. Форма SimpleDate at sdf = новая форма SimpleDate at("yyyyMMddHHmmss"); 83. вернуть форму sdf в (новая дата()); 84. } 85. } |
Метод valueBound() вставляет журнал входа в таблицу T_LOGIN_LOG и обновляет время выхода таблицы журнала в методе valueUnbound(). Кроме того, строки с 80 по 84 предоставляют метод getCurrDatetimeStr() для получения строки текущего времени. Этот метод используется для получения строки входа и времени для момента времени выхода.
Ниже описывается, как программа записывает время входа и выхода пользователя, описывая шаги, которые пользователь выполняет, пока не выйдет из системы:
1. После того, как пользователь вводит пароль для входа через login.jsp, программа переключается на страницу управления switch.jsp.
2. В switch.jsp мы привязываем объект userBean класса User.java к сеансу с помощью метода session.setAttribute("ses_userBean", userBean).
3. В это время вызывается метод интерфейса HttpSessionBindingListener valueBound() объекта userBean, и журнал входа вставляется в таблицу T_LOGIN_LOG.
4. switch.jsp переключается на страницу Welcome.jsp.
5. Когда пользователь щелкает ссылку на странице Welcome.jsp, чтобы выйти из системы, он перенаправляется на страницу quit.jsp.
6. quit.jsp вызывает метод session.invalidate(), и объект userBean удаляется из сеанса.
7. В это время вызывается метод valueUnbound() интерфейсного метода HttpSessionBindingListener объекта userBean, обновляется время выхода журнала и закрывается окно браузера.
Интерфейс HttpSessionBindingListener — это интерфейс событий веб-контейнера. Класс, реализующий этот интерфейс, вызывается автоматически при возникновении события. Веб-контейнер имеет несколько таких интерфейсов событий.
·Интерфейс ServletContextListener: интерфейс обработки событий для запуска и уничтожения веб-контейнера. В интерфейсе определены два метода.
·Интерфейс ServletContextAttributeListener: интерфейс обработки событий при изменении атрибутов веб-контекста.
· Интерфейс HttpSessionListener: интерфейс обработки событий для событий создания и уничтожения сеанса.
· Интерфейс HttpSessionAttributeListener: интерфейс обработки событий для изменений объекта атрибута в сеансе сеанса. Этот интерфейс аналогичен интерфейсу HttpSessionBindingListener, который мы использовали ранее.
Кроме того, в J2EE1.4 предусмотрены еще два интерфейса обработки событий:
·Интерфейс ServletRequestListener: интерфейс обработки событий создания и уничтожения объекта запроса.
·Интерфейс ServletRequestAttributeListener: интерфейс обработки событий при изменении объекта атрибута в запросе.
Развертывание программы
После завершения разработки веб-программы мы приступаем к развертыванию программы. Мы надеемся развернуть это веб-приложение на сервере веб-приложений Tomcat5.0.
Сначала мы устанавливаем домашнюю страницу веб-приложения по умолчанию, а затем упаковываем всю веб-программу в архивный файл WAR.
1. Установите страницу доступа по умолчанию, дважды щелкните узел webModule на панели проекта, JBuilder отобразит следующую страницу на панели содержимого:
Рисунок 26. Установка страницы по умолчанию, к которой будет обращаться веб-программа.
Нажмите кнопку «Добавить...» в правой части списка файлов приветствия, введите login.jsp во всплывающем диалоговом окне и нажмите кнопку «ОК», чтобы установить страницу login.jsp в качестве страницы по умолчанию. следующее развертывание, выделенное жирным шрифтом, будет добавлено в файл описания развертывания web.xml:
Листинг 19. Страница веб-приложения по умолчанию.
1.…
2. <веб-приложение>
3. <отображаемое имя>webModule</отображаемое имя>
4. <список-приветственных файлов>
5. <файл-приветствия>login.jsp</файл-приветствия>
6. </список-приветственных файлов>
7.…
8. </веб-приложение>
Когда пользователь не указывает конкретное имя файла доступа в URL-адресе, веб-контейнер автоматически проверяет, существует ли файл login.jsp по URI, и если да, напрямую вызывает этот файл.
2. Щелкните правой кнопкой мыши узел webModule в дереве ресурсов на панели проекта, выберите Свойства...->Сборка->На панели настроек сборки установите для параметра Сборка веб-архива значение При сборке проекта или модуля, как показано на следующем рисунке:
Рис. 27. Настройка архивного файла WAR, который будет создан при пересборке проекта или веб-модуля.
3. Щелкните правой кнопкой мыши Chapter13.jpx на панели проекта и выберите «Перестроить» во всплывающем меню, чтобы скомпилировать весь проект.
4. После завершения компиляции в корневом каталоге проекта будет создан файл webModule.war.
5. Скопируйте файл webModule.war в каталог <каталог установки JBuilder2005>/ Thirdparty/jakarta-tomcat-5.0.27/webapps.
На этом развертывание веб-приложения завершено. Далее мы запускаем сервер веб-приложений Tomcat 5.0 и получаем доступ к только что развернутому приложению webModule.war.
1. Дважды щелкните файл start.bat в <каталог установки JBuilder2005>/ Thirdparty/jakarta-tomcat-5.0.27/bin, чтобы запустить сервер веб-приложений Tomcat 5.0 (во избежание конфликтов убедитесь, что в это время в JBuilder не запущено ни одно веб-приложение). .
2. Откройте IE, введите http://localhost:8080/webModule, и вы получите правильный доступ к только что развернутому веб-приложению, как показано на следующем рисунке:
Рис. 28. Эффект доступа к файлу login.jsp после развертывания.
Сервер Tomcat по умолчанию работает через порт 8080, поэтому вам необходимо добавить номер порта после имени машины. Вы можете изменить этот номер порта, изменив файл конфигурации Tomca server.xml, расположенный в каталоге conf.
Поскольку файл WAR нашего веб-приложения называется webModule.war, после запуска веб-сервера файл WAR будет автоматически распакован в каталог webModule, поэтому доступ к нему должен осуществляться через http://localhost:8080/webModule . Кроме того, поскольку страницей доступа по умолчанию является login.jsp, когда конкретная страница не указана, вызывается страница login.jsp.