2

私はすでに Icefaces フォーラムでこの質問をしましたが、これはより一般的な問題であることに気付きました。

MDB でメッセージを受け取ったときに、JSF ページの一部を更新したいと考えています。

問題は、EJB コンテナーから FacesContext を取得するにはどうすればよいかということです。

メッセージ処理関数で FacesContext.getCurrentInstance() は null を返します。

また、JSF マネージド Bean を MDB にしようとしましたが、できませんでした (同じクラスに両方を含めることはできないようです)。

私はJSFの世界の初心者なので、今はちょっと行き詰まっています。それを機能させる方法はありますか?

(Glassfish v3 + Netbeans 6.8、JSF2 + Icefaces 2.0 alpha2)

4

4 に答える 4

2

FacesContext は HTTP 要求ベースであるため、HTTP 要求の処理中にのみ使用でき、その場合でも、要求 URL が FacesServlet の URL パターンと一致する場合にのみ使用できます。HTTP リクエストを処理するためにサーバーによって実行されるスレッド内にいない場合、FacesContext の手段もありません。EJB コンテナーには、HTTP 要求の手段がまったくありません。

技術的には、EJB が新しいメッセージについて JSF に通知できるようにする唯一の方法は、EJB が FacesServlet の URL パターンに一致する URL で HTTP リクエストを発行し、メッセージをリクエスト パラメータとして使用することです。これに使えますjava.net.URLConnection。次に、JSFはComet/HTTPプッシュのようなものを実行して、あなたが言及したようにIceFacesの方法でメッセージでビューを更新できます。

例えば

URL url = new URL("http://example.com/context/poll.jsf?msg=" + URLEncoder(msg, "UTF-8"));
URLConenction connection = url.openConnection();
InputStream response = connection.getInputStream();

そして、poll.jsf次のようにバッキング Bean にアタッチされます。

@ManagedBean
public class Poll {

    @ManagedProperty(value="#{param.msg}")
    private String msg;

    @PostConstruct
    public void init() {
        // Do something with msg.
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

注: JSF 2.0 アノテーションを使用していますが、十分に自明である必要があります。

于 2010-04-20T14:52:25.223 に答える
1

私は専門家ではありませんが、FacesContext は JSF リクエストの処理中にのみ使用できると思います。残念ながら、あなたが望んでいることを正確に行うことはできませんが、確実に回避できます。実際には次の 2 つの問題があります。

  1. MDB 経由で更新を JSF ページに取得する方法は?
  2. イベントが発生したときにクライアントでページを更新する方法は? 通常、サーバーからクライアントにデータを送信することはできません。クライアントはデータを要求する必要があります (ただし、 http://en.wikipedia.org/wiki/Comet_(programming)などのいくつかの回避策があります)) 。

私は次のようなものをしたい:

  1. MDB で、更新されたデータをグローバル キャッシュ (@Singleton を使用したステートレス セッション Bean および更新用のコレクションまたはマップ) などの場所に保存します。
  2. JSF ページを変更して、定期的に更新をサーバーに照会するように (できれば、Ajax 対応の JSF コンポーネントを介して Ajax を使用してバックグラウンドで) - MDB を介して受信した更新がある場合、サーバーはそれを返し、ページは自分自身を再レンダリングする
于 2010-04-20T09:28:23.933 に答える
0

Icefaces フォーラムでも次のような回答がありました。

org.icefaces.application.PortableRenderer は、プッシュを呼び出すために非 JSF スレッドで使用できるオブジェクトを提供します。(これは svn トランクで利用可能で、次のアルファ (= Icefaces 2.0 alpha 3) リリースで提供されます。)

于 2010-04-21T08:09:21.083 に答える
0

シングルトンをチェックし、必要に応じて更新を起動する JSF 側のタイマーを使用する回避策があります (幸いなことに、サーバー上にのみあり、AJAX とクライアント サーバー間の通信は必要ありません)。ただし、これは適切な解決策ではなく、タイマーなしで実行できるとまだ信じています...

于 2010-04-20T14:42:26.610 に答える