0

Enterprise Java Beans を使用して Web カレンダーを作成したいと考えています。そこで、ステートフル (@Stateful) なクラス CalendarBean をプログラムします。属性として、両端キューを使用してすべての日を保存します。または、最後または最初に新しい年を追加することもできます。JSP では<jsp:useBean>-Tag を使用します。JSP を呼び出すたびに、Bean の新しいインスタンスが作成されます。新しい両端キューを作成するたびに。

どうすれば防ぐことができますか?Singleton のような Bean のインスタンスが 1 つだけ必要です。

4

2 に答える 2

0

ステートフル セッション Bean では、インスタンス変数は一意のクライアント Bean セッションの状態を表します。したがって、各クライアントには独自のインスタンスがあります。Bean のインスタンスが必要な場合は、ステートフル セッション Bean またはシングルトン セッション Bean を使用できます。U を見ることができます: http://docs.oracle.com/javaee/5/tutorial/doc/bnbly.html

于 2013-07-16T05:56:37.900 に答える
0

Java EE 6 での Contexts and Dependency Injectionの記事を参照してください。それは言います:

@StatefulBean は、注入中にコンテナーによって作成されます。

したがって、JSP がコンパイルおよび実行されると、コンテナーは新しいCalenderBean.

Bean をシングルトンにしたい場合は、アノテーションを として宣言し、ステートレスにするのが最善@Statelessですその動作は、インスタンス変数の状態に依存してはなりません。つまり、2 つのスレッドが Bean に同時にアクセスする場合、インスタンス変数を変更することによって、Bean の相互の動作に影響を与えることはできません。

たとえば、CalenderBean にインスタンス変数private Calendar calendarがあり、インスタンス メソッドが次のような処理を行う場合:

this.calendar.set(Calendar.YEAR, input.getYear()); // where input is a parameter
                                                   // to the method you were calling
return calendar.get(Calendar.ERA);

ここで、2 人の訪問者がまったく同じインスタンスで Web ページにアクセスするが、入力が異なるとします。

  • ユーザー 1input.getYear()2000
  • ユーザー 2input.getYear()-5

2 つのスレッドが順番に処理されることを保証できないため、次のことが発生する可能性があります。

  • ユーザー 1 にサービスを提供するスレッドは、年を2000
  • ユーザー 2 にサービスを提供するスレッドは、年を-5
  • ユーザー 1 にサービスを提供するスレッドは、ERA を設定して を返しますGregorianCalendar.BC

これは明らかに間違っています。ユーザー 1 がCalendarBeanユーザー 2 の動作に影響を与えているため、Bean はステートレスではありません。

于 2013-07-16T06:00:38.097 に答える