ドメインオブジェクトの属性変更の時間リスナーは、ServletContext、HttpSession、およびHttpServletRequestの3つのオブジェクトの属性変更情報イベントを監視するために使用されるリスナーです。3つのリスナーインターフェイスは、ServletContextAttributeListener、HttpSessionAttributeListener、およびServletRequestAttributeListenerです。これら3つのインターフェイスでは、監視対象オブジェクトの属性の追加、削除、および置換のイベントを処理する3つのメソッドが定義されています。これら3つのインターフェイスには同じイベントがありますで対応するメソッド名は、受け入れられるパラメータタイプが異なることを除いて、まったく同じです。
1.1 attributeAddedメソッド
監視対象オブジェクトに属性を追加すると、Webコンテナーはイベントリスナーのattribute addedメソッドを呼び出して応答します。このメソッドはイベントタイプパラメーターを受け取ります。リスナーはこのパラメーターを使用して、属性を追加して保存するドメインオブジェクトを取得できます。ドメイン内のプロパティオブジェクト。
各ドメインプロパティリスナーの完全な構文は、次のように定義されます。
public void attributeAdded(ServletContextAttributeEvent scae) public void attributeReplaced(HttpSessionBindingEvent hsbe) public void attributeRmoved(ServletRequestAttributeEvent srae)
1.2 attributeRemovedメソッド
監視対象オブジェクトの属性を削除すると、WebコンテナはイベントリスナーのattributeRemovedメソッドを呼び出して、各ドメイン属性リスナーの完全な構文定義に次のように応答します。
public void attributeRemoved(ServletContextAttributeEvent scae) public void attributeRemoved(HttpSessionBindingEvent hsbe) public void attributeRemoved(ServletRequestAttributeEvent srae)
1.3 attributeReplacedメソッド
リスナーのドメインオブジェクトの特定の属性が置き換えられると、WebコンテナはイベントリスナーのattributeReplacedメソッドを呼び出して応答します。各ドメイン属性リスナーの完全な構文は、次のように定義されます。
public void attributeReplaced(ServletContextAttributeEvent scae) public void attributeReplaced(HttpSessionBindingEvent hsbe) public void attributeReplaced(ServletRequestAttributeEvent srae)
2.ドメインオブジェクトの属性変更のxxxAttributeListener
①ServletContext、HttpSession、ServletRequestを監視して属性の追加、属性の置換、属性の削除を行うイベントリスナー。
②ServletRequestArrributeListenerを例にとります。
//属性を追加するときに呼び出されます @オーバーライド public void attributeAdded(ServletRequestAttributeEvent arg0){ } //属性が削除されたときに呼び出されます @オーバーライド public void attributeRemoved(ServletRequestAttributeEvent arg0){ } //属性を置き換えるときに呼び出されます @オーバーライド public void attributeReplaced(ServletRequestAttributeEvent arg0){ }
③これら3つのリスナーServletContextAttributeListener、ServletRequestAttributeListener、HttpSessionAttributeListenerはすべて使用量が少ない
④APIのgetName()メソッドとgetValue()メソッドを使用して、変更された属性名と属性値を確認します。次に例を示します。
public void attributeAdded(ServletRequestAttributeEvent arg0){ System.out.println( "リクエストに属性を追加:" + arg0.getName()+ ":" + arg0.getValue()); }
3.セッションにバインドされたイベントリスナー
セッションフィールドに格納されたオブジェクトは、複数の状態を持つことができます:セッションへのバインド(session.setAttribute( "bean"、Object))、セッションフィールドからの削除(session.removeAttribute( "bean"))。 Sessionオブジェクトはストレージデバイスに永続化され、Sessionオブジェクトを使用してストレージデバイスから回復されます。
サーブレット仕様では、JavaBeanオブジェクトがセッションドメインのこれらの状態を理解できるように、2つの特別なリスナーインターフェース「HttpSessionBindingListenerとHttpSessionActivationListener」を定義しています。これら2つのインターフェースを実装するクラスは、web.xmlファイルに登録する必要はありません。
3.1 HttpSessionBindingListener
HttpSessionBindingListenerインターフェースを実装するJavaBeanオブジェクトは、セッションにバインドされ、セッションで削除されたイベントを検知できます。オブジェクトがHttpSessionオブジェクトにバインドされると、Webサーバーはオブジェクトのvoid valueBound(HttpSessionBindingEventイベント)メソッドを呼び出し、オブジェクトがHttpSessionオブジェクトからバインド解除されると、Webサーバーはオブジェクトのvoid valueUnbound(HttpSessionBindingEventイベント)メソッドを呼び出します。たとえば、次のとおりです。
Customer.java
パッケージcom.javaweb.Listener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; パブリッククラスCustomerはHttpSessionBindingListener { @オーバーライド public void valueBound(HttpSessionBindingEvent arg0){ System.out.println( "セッションにバインド"); Object value = arg0.getValue(); System.out.println(this == value); System.out.println(arg0.getName()); } @オーバーライド public void valueUnbound(HttpSessionBindingEvent arg0){ System.out.println( "セッションからバインド解除"); } }
HttpSessionBindingListenerTest.jsp
<ボディ> <h4> HttpSessionBindingListener </ h4> <% 顧客customer = new Customer(); session.setAttribute( "customer"、customer); System.out.println( "-------------------"); session.removeAttribute( "customer"); %> </ body>
実行後の出力:
3.2 HttpSessionActivationListener
HttpSessionActivationListenerインターフェースを実装するJavaBeanオブジェクトは、そのアクティブ化(非直列化)イベントとパッシベーション(直列化)イベントを感知できます。
- アクティブ化:ディスクからセッションオブジェクトを読み取る
- パッシベーション:セッションオブジェクトをディスクに書き込む
- セッションオブジェクトは、Tomcatサーバーのwork \ Catalina \ localhost \ contextPathディレクトリに保存されます。SESSION.SER
Javaでのシリアライゼーションとデシリアライゼーションの概念:
オブジェクトをバイトのシーケンスに変換するプロセスはオブジェクトのシリアル化と呼ばれ、バイトのシーケンスをオブジェクトに復元するプロセスはオブジェクトの逆シリアル化と呼ばれます。オブジェクトのシリアル化には、主に2つの目的があります。
1)オブジェクトのバイトシーケンスはハードディスクに永続的に保存され、通常はファイルに保存されます;
2)オブジェクトのバイトシーケンスはネットワーク上で送信されます。
多くのアプリケーションでは、一部のオブジェクトをシリアル化し、それらをメモリ領域から残して、長期間保存するために物理ハードディスクに残す必要があります。たとえば、最も一般的なのはWebサーバーのSessionオブジェクトです。100,000のユーザーが同時にアクセスしている場合、100,000のSessionオブジェクトがあり、メモリが不足している可能性があります。Webコンテナは、最初にハードディスクへの参照をシリアル化します。使用して、ハードディスクに保存されたオブジェクトをメモリに復元します。
2つのプロセスがリモート通信しているとき、それらは互いにさまざまなタイプのデータを送信できます。データのタイプに関係なく、バイナリシーケンスの形式でネットワークに送信されます。送信側はこのJavaオブジェクトをネットワーク上で送信する前にバイトシーケンスに変換する必要があり、受信側はバイトシーケンスをJavaオブジェクトに復元する必要があります。
HttpSessionオブジェクトにバインドされたjavabeanオブジェクトがHttpSessionオブジェクトでパッシベーション(シリアル化)される前に、Webサーバーはjavabeanオブジェクトのvoid sessionWillPassivate(HttpSessionEvent event)メソッドを呼び出します。このようにして、javabeanオブジェクトは、HttpSessionオブジェクトによってハードディスクにシリアル化(パッシベーション)されることを知ることができます。
HttpSessionオブジェクトにバインドされたjavabeanオブジェクトをHttpSessionオブジェクトでアクティブ化(非直列化)する場合、Webサーバーはjavabeanオブジェクトのvoid sessionDidActive(HttpSessionEvent event)メソッドを呼び出します。このようにして、javabeanオブジェクトは、HttpSessionオブジェクトで逆シリアル化(アクティブ化)されてメモリに戻されることを認識できます。
リスニングドメインオブジェクト自体によって作成および破棄されるリスナー:ServletContextListener、HttpSessionListener、ServletRequestListener
ドメインオブジェクトの属性変更のリスナー:ServletContextAttributeListener、HttpSessionAttributeListener、およびServletRequestAttributeListener
HttpSessionドメインにバインドされたオブジェクトの状態をリッスンするイベントリスナー:HttpSessionBindingListener、HttpSessionActivationListener
wxで「プログラマーコアラ」を検索し、Javaの分野に焦点を合わせてください。