0

サーブレットで ViewScoped ManagedBean にアクセスする方法を知っている人はいますか?

たとえば、次のようにして SessionScoped ManagedBean にアクセスできます。

MyBean bean = (MyBean) request.getSession().getAttribute("myBean");

しかし、スコープを ViewScoped に設定すると、null が返されます。その理由は、サーブレットが Bean に早期にアクセスしようとするためであることはわかっています。しかし、どうすればこれを修正できますか?

バッキング Bean:

@ManagedBean(name = "statistikHandler")
@SessionScoped //or ViewScoped
public class StatistikHandler {

    private Object someAttribute

    //Do something nice here
    //getter and setter

}

サーブレット:

public class ImageStreamServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.println("+++++ CALL THE IMAGESERVLET +++++");

        //try to "inject" the Bean here

        StatistikHandler handler = (StatistikHandler) request.getSession().getAttribute("statistikHandler");

        try {
            if (handler != null) {
                //Do something with the ManagedBean
            } else {
                System.out.println("HANDLER NOT FOUND");
            }

        } finally {
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}

それでおしまい。StatistikHandler を SessionScope に設定すると、正常に動作します。Handler を ViewScoped に設定すると、機能しません。


最初:あなたのawserのTHX。

アルジャン・ティムス:

2 つ目は、ビュー スコープは、処理中のビューがある場合にのみ存在するということです。それは薄い空気から抜け出すことはできません。

それは理にかなっており、私はそれを知っています。私は流れを説明しようとします、そしてあなたが私を理解することを願っています. 私の英語は最高ではありませんが、十分だと思います。それでは試してみましょう:

ビューにリクエストを設定し、ビュー スコープ Bean のインスタンスを設定しました。したがって、ビューと Bean は存在しますが、サーブレットは必要ありません。

ここで、ビューを操作して、別の部分をレンダリングする必要があります。この部分にはサーブレットが必要なので、サーブレットへのリクエストを設定します。

したがって、ビューと Bean はインスタンスとして存在し、(部分的なリロード後) サーブレットを要求します。

アルジャン・ティムス:

サーブレットが参照を見つけて取得できるリクエストスコープに参照を格納するコードが必要です。

私見は重要な部分です。あなたが言うように、ビュースコープのBeanをセッション属性として取得することはできません。私は以前にそれを知らなかったので、この事実を非常に感謝しています。

これで解決策を考えることができます。

感謝と敬意

4

1 に答える 1

3

注意すべきことが2つあります。

1つは、セッション属性を要求しても、ビュースコープのBeanのインスタンスを取得できないことです。それらのBeanは単に(直接)そこに保存されません。

2つ目は、ビュースコープは、処理中のビューがある場合にのみ存在するということです。薄い空気から出ることはできません。

その最後のステートメントを説明するJavaコードの例:

// How to access i here???

while (foo) {
    int i = 1;
    // ...
}

iループ内で宣言されているように、そのwhileループの前にアクセスすることは意味がありません。

サーブレットの場合、サーブレットが同じリクエスト内でFacesサーブレットにディスパッチしている場合は、後でのみビュースコープのBeanにアクセスしますが、直接アクセスすることはできません。サーブレットが参照を見つけて取得できるリクエストスコープに参照を格納するコードが必要になります。

Javaのアナロジーを再び使用するには、次のようになります。

int bar = 0;

while (foo) {
    int i = 1;
    // ...
    bar = i;
}

// use bar here

ビュースコープのBeanが使用するものを設定するためにサーブレットが必要な場合は、その何かをリクエストスコープに格納し、ビュースコープのBeanがそこでそれを取得できるようにします。繰り返しますが、これのJavaアナロジー:

int bar = 23;

while (foo) {
    int i = bar;
    // ...
}

つまり、共通の「チャネル」を使用して、これら2つが相互に通信できるようにします。

于 2012-09-02T08:40:12.763 に答える