1

ステートフルセッションBeanコードを呼び出し、そのint値をインクリメントするサーブレットコードがあります。しかし、次回サーブレットとそれに対応するBeanを呼び出すと、Beanはその状態を失い、再びインクリメントの開始から開始します。誰かがこの問題を解決する方法を教えてもらえますか?私のコードは以下の通りです:

public class CounterServlet extends HttpServlet {

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

       response.setContentType("text/html;charset=UTF-8");
       PrintWriter out = response.getWriter();

       try {
           Counter counter = new Counter() ;
           HttpSession clientSession = request.getSession(true);
           clientSession.setAttribute("myStatefulBean", counter);

           counter.increment() ;

           // go to a jsp page

       } catch (Exception e) {
           out.close();
       }
   }

}
4

3 に答える 3

4

コードではCounter、リクエストが着信するたびにnewを作成し、そのnewCounterをクライアントのセッションに保存します。その結果、カウンターは常に最初から増加し始めます。

Counterクライアントに新しいものを与える前に、クライアントがすでに持っているかどうかを確認する必要があります。次のようになります。

HttpSession clientSession = request.getSession();
Counter counter = (Counter) clientSession.getAttribute("counter");

if (counter == null) {
    counter = new Counter();
    clientSession.setAttribute("counter", counter);
}

counter.increment();

その上、このトピックの名前で、あなたは言及しStateful session beanました。ただし、新しいものを注入する方法はCounter、ステートフルBeanを注入しているようには見えません。私には通常のJavaオブジェクトのように見えます。

于 2012-01-03T08:47:20.707 に答える
0

サーブレットでは、最初のリクエストがどのSFSBで処理されたかを思い出そうとしていないようです。したがって、次にリクエストが届いたときに、状態を持たない新しいSFSBを作成します。

基本的にあなたがする必要があるのは(擬似コード)です

Session x = httpRequest.getSession
if (!mapOfSfsb.contains(x) {
   Sfsb s = new Sfsb();
   mapOfSfsb.put(x,s);
}

Sfsb s = mapOfSfsb.get(x);

s.invokeMethods();

つまり、httpリクエストを取得し、セッションが接続されているかどうかを確認します。その場合は、このセッションのSFSBがすでに存在するかどうかを確認し、それを使用します。それ以外の場合は、新しいSFSBを作成し、それをセッションに貼り付けます。

また、使用されなくなった古いSFSBをクリーンアップするためのコードを追加する必要があります。

于 2012-01-03T07:58:02.883 に答える
0

これはEJBの問題ではありません。EJBではなくPOJOを作成しています。新しい関数を呼び出すと、毎回新しいオブジェクトが開始されます。Beanインジェクションではありません。

于 2012-01-05T21:17:16.317 に答える