我想使用Enterprise Java Bean创建Web日历。所以我编写了一个CalendarBean类,它是有状态的(@Stateful)。作为一个属性,我使用deque存储所有日子。或者,我可以在最后或最初添加新年。
在JSP中,我使用<jsp:useBean>
- 标记。
在每次调用JSP时,都会创建一个Bean的新实例。每次创建一个新的双端队列。
我怎能阻止它?我只想要一个像Bean一样的Bean实例。
答案 0 :(得分:0)
在有状态会话Bean中,实例变量表示唯一的客户端bean会话的状态。因此,每个客户端都有自己的实例。如果您想要Bean的实例,可以使用Statefull Session bean或Singleton Session bean。 你可以看到:http://docs.oracle.com/javaee/5/tutorial/doc/bnbly.html
答案 1 :(得分:0)
请参阅文章Contexts and Dependency Injection in Java EE 6。它说:
在注入过程中,容器会创建一个
@Stateful
bean。
因此,当您的JSP编译为ran时,容器将注入一个新的CalenderBean
。
如果你想让你的bean成为一个单例,最好将它注释为@Stateless
,并且 make 它是无状态的:它的行为不应该依赖于任何实例变量的状态。这意味着,如果两个线程同时访问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);
现在想象两个访问者在完全相同的实例中访问您的网页,但他们有不同的输入:
input.getYear()
为2000
input.getYear()
为-5
由于我们无法保证两个线程将按顺序处理,因此可能会发生以下情况:
2000
-5
GregorianCalendar.BC
。这显然是错误的:用户1影响了CalendarBean
对用户2的工作方式,这样,bean 不无状态。