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. public void valueBound(HttpSessionBindingEvent イベント) 14. { 15. 接続 conn = 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. PreparedStatement 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. if (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. 接続 conn = null; 49. String sqlStr = " update T_LOGIN_LOG set DT_LONOUT = ? " + 50. "ここで USER_ID=? および DT_LOGIN = ?"; 51. 試してみる 52. { 53. conn = DBConnection.getConnection(); 54. PreparedStatement 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. throw new RuntimeException( 63.「ユーザー終了ログの書き込みエラー」); 64. } ついに 65. { 66. 試してみる 67. { 68. if (conn != null) 69. { 70. conn.close(); 71. } 72. } catch (SQLException ex) 73. { 74. ex.printStackTrace(); 75. } 76. } 77. } 78. 79. // 現在の時刻文字列を取得し、20050505010101 などの yyyyMMddHHmmss 形式で返します。 80. プライベート静的文字列 getCurrDatetimeStr() 81. { 82. sdf の SimpleDate フォーム = new SimpleDate フォーム at("yyyyMMddHHmmss"); 83. sdf フォームを返す (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 インターフェイスは、Web コンテナのイベント インターフェイスであり、イベントが発生すると自動的に呼び出されます。
・ServletContextListenerインターフェース:Webコンテナの起動と破棄のためのイベント処理インターフェース インターフェースには2つのメソッドが定義されています。
・ServletContextAttributeListenerインターフェース:Webコンテキスト属性変更時のイベント処理インターフェース。
·HttpSessionListener インターフェイス: セッションの作成および破棄イベントのイベント処理インターフェイス。
·HttpSessionAttributeListener インターフェイス: セッション セッションでの属性オブジェクト変更のイベント処理インターフェイス。このインターフェイスは、前に使用した HttpSessionBindingListener インターフェイスに似ています。
さらに、J2EE1.4 では、次の 2 つのイベント処理インターフェイスが提供されています。
・ServletRequestListenerインターフェース:リクエストリクエストオブジェクトの作成・破棄イベント処理インターフェース。
・ServletRequestAttributeListenerインターフェース:Request内の属性オブジェクトを変更する際のイベント処理インターフェース。
プログラムの展開
Web プログラムの開発が完了したら、この Web アプリケーションを Tomcat5.0 Web アプリケーション サーバーにデプロイする作業を開始します。
まず、Web アプリケーションのデフォルトのホームページを設定し、Web プログラム全体を WAR アーカイブ ファイルにパッケージ化します。
1.デフォルトのアクセス ページを設定し、プロジェクト ペインで webModule ノードをダブルクリックすると、JBuilder のコンテンツ ペインに次のページが表示されます。
図 26 Web プログラムがアクセスするデフォルト ページの設定
「ウェルカム ファイル」リストの右側にある「追加...」ボタンをクリックし、ポップアップ ダイアログ ボックスに「login.jsp」と入力し、「OK」ボタンを押して、login.jsp ページをデフォルト ページとして設定します。次の太字のデプロイメントが web.xml デプロイメント記述ファイルに追加されます。
コード リスト 19 Web アプリケーションのデフォルト ページ1.…
2. <ウェブアプリ>
3. <表示名>webModule</表示名>
4. <ウェルカムファイルリスト>
5. <ウェルカムファイル>login.jsp</ウェルカムファイル>
6. </ウェルカムファイルリスト>
7.…
8. </web-app>
ユーザーが URL で特定のアクセス ファイル名を指定しない場合、Web コンテナは URI の下に login.jsp ファイルがあるかどうかを自動的に確認し、存在する場合はこのファイルを直接呼び出します。
2.次の図に示すように、プロジェクト ペインのリソース ツリーで webModule ノードを右クリックし、[プロパティ...] -> [ビルド] -> [ビルド設定] パネルで、[Web アーカイブのビルド] を [プロジェクトまたはモジュールのビルド時] オプションに設定します。
図27 プロジェクトまたはWebモジュールのリビルド時に作成されるWARアーカイブファイルの設定
3.プロジェクトペインでchapter13.jpxを右クリックし、ポップアップメニューで「再構築」を選択してプロジェクト全体をコンパイルします。
4.コンパイルが完了すると、プロジェクトのルート ディレクトリに webModule.war ファイルが生成されます。
5. webModule.war ファイルを <JBuilder2005 インストール ディレクトリ>/thirdparty/jakarta-tomcat-5.0.27/webapps ディレクトリにコピーします。
これで Web アプリケーションのデプロイが完了しました。次に、Tomcat 5.0 Web アプリケーション サーバーを起動し、デプロイしたばかりの webModule.war アプリケーションにアクセスします。
1. <JBuilder2005 インストール ディレクトリ>/thirdparty/jakarta-tomcat-5.0.27/bin にあるstartup.bat をダブルクリックして、Tomcat 5.0 Web アプリケーション サーバーを起動します (競合を避けるため、この時点では JBuilder で Web アプリケーションが実行されていないことを確認してください)。 。
2. IE を開いて http://localhost:8080/webModule と入力すると、次の図に示すように、デプロイしたばかりの Web アプリケーションに正しくアクセスできます。
図28 デプロイ後のlogin.jspのアクセス効果
Tomcat サーバーはデフォルトでポート 8080 で動作するため、マシン名の後にポート番号を追加する必要があります。このポート番号は、conf ディレクトリにある Tomca のserver.xml 設定ファイルを変更することで変更できます。
Web アプリケーションの WAR ファイルの名前は webModule.war であるため、Web サーバーの起動後、WAR ファイルは webModule ディレクトリに自動的に解凍されるため、 http://localhost:8080/webModuleを通じてアクセスする必要があります。また、デフォルトのアクセスページはlogin.jspであるため、特定のページが指定されていない場合はlogin.jspページが呼び出されます。