Listenerリスナーの構成
8.1.HttpSessionListenerの使用
OnlineUserListenerを作成します.
package anni;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class OnlineUserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
//
String username = (String) session.getAttribute("username");
//
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(username);
System.out.println(username + " 。");
}
}
OnlineUserListenerはHttpSessionListener定義の2つの方法:sessionCreated()とsessionDestroyed()を実現した.この2つの方法は、現在のアプリケーションにおけるsessionの作成と破棄状況を傍受することができる.ここではsessionDestroyed()がsession破棄時に操作するだけでよい.
破棄するセッションをHttpSessionEventから取得し、セッションのユーザー名を取得し、オンラインリストから削除します.最後の文はconsoleにメッセージを印刷し、操作に成功したことを示します.これはデバッグ用に、正常な実行時に削除するだけです.
リスナーが機能するようにwebに追加します.xml:
<listener>
<listener-class>anni.OnlineUserListener</listener-class>
</listener>
セッションの破棄イベントは、次の2つの場合に発生します.
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// session
request.getSession().invalidate();
//
response.sendRedirect("index.jsp");
}
<session-config>
<session-timeout>1</session-timeout>
</session-config>
時間単位は1分で、整数のみで、ゼロまたは負数の場合、セッションはタイムアウトしません.対応例は08-01で、OnlineUserListenerが正常に実行できるかどうかを検証するために、2人のユーザーにログインし、そのうちの1人はログアウトをクリックし、もう1人は1分待ってからconsoleで出力の情報を見ることができます.
8.2.HttpSessionBindingListenerの使用
HttpSessionBindingListenerはListenerと呼ばれますが、使い方はHttpSessionListenerとは全く違います.実際にどのように使われているかを見てみましょう.
我々のOnlineUserBindingListenerはHttpSessionBindingListenerインタフェースを実現し、インタフェースはvalueBound()とvalueUnbound()の2つの方法を定義し、それぞれデータバインディングに対応し、2つのイベントをバインディング解除します.
セッションをデータバインディングとは、セッションを呼び出すことである.setAttribute()HttpSessionBindingListenerをセッションに保存します.我々はここにいるJAvaでこのステップを行います.
//
session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
これがHttpSessionBindingListenerとHttpSessionListenerの最大の違いである:HttpSessionListenerはwebに設定するだけである.xmlでは、アプリケーション全体のすべてのセッションをリスニングできます.HttpSessionBindingListenerは、リスニングを行うためにインスタンス化されたセッションに入れなければなりません.
傍受範囲から比較すると、HttpSessionListenerは一度に設定するとすべてのsessionを傍受することができ、HttpSessionBindingListenerは通常1対1である.
このような違いこそH ttpSessionBindingListenerの優位性を達成し、listenerごとに1つのusernameに対応させることができ、sessionに行くたびにusernameを読み取る必要がなく、さらにすべての操作オンラインリストのコードをlistenerに移動することができ、メンテナンスが容易になります.
valueBound()メソッドのコードは次のとおりです.
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
//
List onlineUserList = (List) application.getAttribute("onlineUserList");
// ,
if (onlineUserList == null) {
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
}
onlineUserList.add(this.username);
}
usernameはすでに構造方法によってlistenerに渡されており,データバインド時に直接ユーザリストに入れることができる.
これに対応するvalueUnbound()メソッドで、コードは次のとおりです.
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
//
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(this.username);
System.out.println(this.username + " 。");
}
ここではlistenerのusernameを直接使用してオンラインリストを操作することができ、sessionにusernameが存在するかどうかを心配する必要はありません.
valueUnboundのトリガ条件は、次の3つです.
したがって,listenerをセッションから削除しない限り,セッションの破棄を傍受することができる.