ApplicationListener を使用して、いくつかの Bean で通常のバックグラウンド作業を行ういくつかのタイマー ライブラリをロードしています。しかし、applicationCreated では、ApplicationEx オブジェクトを介して ServletContext に入る方法を見つけることができないようです。それらが役に立ったと思われる非推奨のメソッドがたくさんあります。applicationCreatedメソッド中にApplicationExからFacesContextまたは外部ServletContextにトラバースする方法を知っている人はいますか?
2 に答える
ApplicationEx から FacesContext または ServletContext を取得する方法はないようです。
ServletContextListenerは、Web アプリケーションの初期化時に ServletContext を提供しますが、残念ながら、この種のリスナーは XPages ではサポートされていません。
では、ApplicationListener とアプリケーション スコープのマネージド Bean の組み合わせはどうでしょうか。
まず、ApplicationListener が開始されます。次に、ユーザーが最初に呼び出すことができるすべてのページの beforePageLoad イベントでマネージド Bean が「呼び出される」と、マネージド Bean がインスタンス化されます。この時点
で、マネージド Bean は ApplicationListener オブジェクトを取得できます。
(ApplicationEx)(FacesContext.getCurrentInstance().getApplication()).getApplicationListeners()
また、ApplicationListener でメソッドを実行して、FacesContext、ExternalContext、および Bean を取得できます。ApplicationListener は、FacesContext/ExternalContext を使用してすべてのアクション (タイマー ライブラリなど) を開始し、コンテキストや Bean を ApplicationListener オブジェクトのフィールドとして保存できます。applicationDestroyed() の時点で、コンテキストを操作したり、マネージド Bean を「シャットダウン」したりすることは可能です。
次に例を示します。
アプリケーションリスナー "MyApplicationListener"
package com.knutherrmann.listener;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import com.ibm.xsp.application.ApplicationEx;
import com.ibm.xsp.application.events.ApplicationListener;
public class MyApplicationListener implements ApplicationListener {
private FacesContext facesContext;
private ExternalContext externalContext;
private AppBean app;
public void applicationCreated(ApplicationEx arg0) {
System.out.println("applicationCreated(" + arg0.getApplicationId() + ") in MyApplicationListener");
}
public void applicationDestroyed(ApplicationEx arg0) {
System.out.println("applicationDestroyed(" + arg0.getApplicationId() + ") in MyApplicationListener");
System.out.println("...FacesContext: " + facesContext);
System.out.println("...ExternalContext: " + externalContext);
System.out.println("...AppBean: " + app);
app.stop();
}
public void initContext(AppBean app) {
facesContext = FacesContext.getCurrentInstance();
externalContext = facesContext.getExternalContext();
this.app = app;
System.out.println("initContext() in MyApplicationListener");
System.out.println("...FacesContext: " + facesContext);
System.out.println("...ExternalContext: " + externalContext);
System.out.println("...AppBean: " + app);
}
}
クラス「AppBean」のインスタンスとしてのアプリケーション スコープのマネージド Bean「app」
package com.knutherrmann.listener;
import java.io.Serializable;
import javax.faces.context.FacesContext;
import com.ibm.xsp.application.ApplicationEx;
import com.ibm.xsp.application.events.ApplicationListener;
public class AppBean implements Serializable {
private static final long serialVersionUID = 1L;
public AppBean() {
ApplicationEx app = (ApplicationEx) FacesContext.getCurrentInstance().getApplication();
for (ApplicationListener listener : app.getApplicationListeners()) {
if (listener instanceof MyApplicationListener) {
MyApplicationListener myApplicationListener = (MyApplicationListener) listener;
myApplicationListener.initContext(this);
}
}
}
public void start() {
}
public void stop() {
System.out.println("AppBean stopped");
}
}
XPage
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
beforePageLoad="#{app.start}">
Test MyApplicationListener and AppBean
</xp:view>
サーバーコンソールの出力
07:23:44 HTTP JVM: applicationCreated(32) in MyApplicationListener
07:23:44 HTTP JVM: initContext() in MyApplicationListener
07:23:44 HTTP JVM: ...FacesContext: com.ibm.xsp.domino.context.DominoFacesContext@f850f85
07:23:44 HTTP JVM: ...ExternalContext: com.ibm.xsp.domino.context.DominoExternalContext@13891389
07:23:44 HTTP JVM: ...AppBean: com.knutherrmann.listener.AppBean@22c522c5
07:54:06 HTTP JVM: applicationDestroyed(32) in MyApplicationListener
07:54:06 HTTP JVM: ...FacesContext: com.ibm.xsp.domino.context.DominoFacesContext@f850f85
07:54:06 HTTP JVM: ...ExternalContext: com.ibm.xsp.domino.context.DominoExternalContext@13891389
07:54:06 HTTP JVM: ...AppBean: com.knutherrmann.listener.AppBean@22c522c5
07:54:06 HTTP JVM: AppBean stopped
サーバーのプリロード xpage 機能 ( bit.ly/10rfvEs ) を使用しますが、これはセッションを作成しないため、FacesContext はありません (get current インスタンスは null を返します)。そのため、リスナーからアプリへのリンクを開くいくつかのトリックを行い、必要な最初のセッションとアプリ スコープを作成しました。