0

我有一个豆类如下:

static int variable_static;

public RestaurantBean() {  
    variable_static = 0;  
}

//...  

//value of variable_static  changes throughout the code  
//...

public string button() {  
    //firing this button causes the variable_static value to change back to 0
    return null;
}

我有一个静态变量,它的值在整个代码中都会发生变化(我通过打印出它的值来知道它),但是当按钮被触发时,它的值会自动变回我不想要的默认值。这是 JSF 中的回发吗?我怎样才能防止这种情况发生?

4

2 回答 2

2

问题是,由于它是一个@RequestScopedbean,它是在每个请求(包括 ajax 请求)上创建的,并且构造函数将static变量重新初始化为0默认值)。顺便说一句,这是在您的构造函数中完成的:

public RestaurantBean() {
    //this is the culprit
    variable_static = 0;
}

知道了这一点,解决方案就是将 bean 的范围更改为更广泛的范围,例如@ViewScopedor @SessionScoped(取决于您的需要)。

在此之后,现在 BalusC 和我的想法是:为什么要使用static字段?至少这个字段的唯一目的是在同一个视图中的多个请求中生存(这已经由 完成@ViewScoped),那么没有理由用static修饰符标记它,除非你与其他类共享这个变量(您的应用程序的奇怪设计)。

有关此的更多信息:

于 2013-08-03T21:22:26.783 回答
0

假设您将 @ManagedBean 设置为 @RequestScope 值重置的原因是每次收到新请求时都会创建 bean。当您单击按钮时会发生这种情况。每次创建该类的实例时都会调用构造函数,因此会重置变量的值。

正如上面建议的那样,您“可以”尝试使用@ViewScope bean,但是,请听一下 BalusC 在他的评论中所说的话。真正的问题是您使用静态变量来跟踪信息。如果您需要跟踪信息,则可以考虑使用会话属性。

于 2013-08-03T21:10:26.873 回答