ServletContext には、Web アプリケーションですべてのサーブレットが共有するリソースにユーザーがアクセスできるようにする API があります。ServletContext オブジェクトには次の 2 つのイベントリスナインターフェイスがあります。
ServletContextListener
ServletContextAttributeListener
JRun は ServletContextEvent オブジェクトを ServletContext に渡し、
ServletContextAttributeEvent オブジェクトを ServletContextAttribute イベントに渡します。JRun は、イベントオブジェクトを介して ServletContext および ServletContext の属性にアクセスできます。
ServletContext イベントが発生すると、リスナインターフェイスが実装しているメソッドをトリガーできます。次の表に、ServletContext
インターフェイスのメソッドと、JRun にこれらのメソッドを呼び出させるイベントを示します。
リスナを使用して、データベース接続のロギングや作成などのタスクを実行する
ServletContext リスナイベントメソッドに開始または終了コードを入れることができます。
JRun は、Web アプリケーションがリクエストを受け取る準備が整い、新規 ServletContext が作成されたとき、および Web アプリケーションがコンテナから削除され、ServletContext が廃棄されたときに ServletContextListener に通知します。これらのイベントは通常、JRun サーバの起動、停止、および再起動時に発生します。
ServletContextListener サーブレットには次の 2 つのメソッドがあります。
contextInitialized(ServletContextEvent event)
contextDestroyed(ServletContextEvent event)
ServletContextEvent オブジェクトには次の 1 つのメソッドがあります。
ServletContext の属性には、Web アプリケーション内のすべてのサーブレットからアクセス可能です。ServletContext の属性は、RequestDispatcher を使用して頻繁に関連付けられます。
JRun は、ServletContext の属性が追加または削除されるか、または属性の値が変更されると ServletContextAttributeListener に通知します。
attributeAdded(ServletContextAttributeEvent event)
attributeReplaced(ServletContextAttributeEvent event)
attributeRemoved(ServletContextAttributeEvent event)
ServletContextAttributeEvent オブジェクトは ServletContextEvent オブジェクトから getServletContext
メソッドを継承します。ServletContext の属性にアクセスできるメソッドが他に 2 つあります。
getName()
getValue()
次の例は、ServletContextEvent オブジェクトで使用可能な唯一のメソッド getServletContext
の使用方法を示しています。このメソッドを使用すると、
ServletContext オブジェクトを取得し、ServletContext のすべてのメソッドにアクセスできます。
この単純な ServletContext イベントリスナは ServletContextListener
インターフェイスのメソッドを実装します。これらのいずれかのイベントが発生すると、ログファイルに行が書き込まれます。
public final class ContextLoggingListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) { event.getServletContext().log("ServletContext initialized"); } public void contextDestroyed(ServletContextEvent event) { event.getServletContext().log("ServletContext destroyed"); } }
このイベントリスナは web.xml ファイルで定義されます。たとえば、次のコードは
ContextLoggingListener を定義します。
<listener>
<listener-class>jrunsamples.events.ContextLoggingListener</ listener-class> </listener>
この例では、ServletContext オブジェクトから初期化パラメータを取得し、ServletContext に別の属性を設定します。
...
public final class ContextLoggingListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { private static final char c = File.separatorChar; try { System.out.println("ServletContext initialized"); File baseDir = (File) event.getServletContext().getInitParameter("baseDir"); String fullpath = baseDir.getAbsolutePath() + c + "temp.txt"; event.getServletContext().setAttribute("fullpath", fullpath); File f = new File(fullpath); if (!f.exists()) { ... // ファイル操作ロジック } else { ... // } catch (Exception e) { e.printStackTrace(); } } ...
次の例では、ServletContextAttributeListener
のメソッドを実装します。
これらのいずれかのイベントが発生すると、標準出力に行が出力されます。この例では、
ServletContextAttributeEvent オブジェクトに用意されている便利な getValue
メソッドの使用方法も示しています。
public final class ContextLoggingAttributeListener implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent event) { System.out.println("ServletContext attribute added"); Enumeration enum = event.getServletContext().getAttributeNames(); while (enum.hasMoreElements()) { String attrname = (String)enum.nextElement(); System.out.println(attrname + "=" + event.getValue(attrname)); } public void attributeReplaced(ServletContextAttributeEvent event) { System.out.println("ServletContext attribute replaced"); } public void attributeRemoved(ServletContextAttributeEvent event) { System.out.println("ServletContext attribute removed"); } }