在会话范围中保存变量而不使它们变为静态?

sei*_*cle 0 java jsf scope java-ee-6 jsf-2

抱歉,这是一个菜鸟问题.

我开发了一个jsf-2应用程序(在Tomcat上),它在会话范围内声明了一个大的控制器bean.

现在,我犯的错误是将所有会话作用域变量放在这个bean中作为静态变量,认为它们不会在应用程序的不同实例之间共享.但它们是 - 静态变量在同一个JVM上的应用程序的所有实例之间共享,这实际上是有意义的.无论如何,我的所有代码目前都是这样的:

@SessionScoped
@ManagedBean
public ControllerBean{
static private String aString = "session wide value for a string";
//static getter and setter for astring

}

@viewscoped
@ManagedBean
public class OneRandomViewScopedBean{
String oneString = ControllerBean.getAString();
//operations on this string...
ControllerBean.setAString(newValueForString);
} 
Run Code Online (Sandbox Code Playgroud)

我是否可以获得有关如何重构代码以删除ControllerBean中的静态变量的指示?我想解决方案很简单但我现在看不到它.

注意:我不需要保留数据,因为卷很小并且在关闭应用程序后它们可能会消失

谢谢!

Bal*_*usC 6

删除static修饰符(这确实是一个巨大的错误;这个问题不是JSF特定的,而只是基本的Java.我真的会花更多的时间学习基础Java,然后继续使用JSF)并使用@ManagedProperty注入其他bean或其属性.

@ManagedBean
@SessionScoped
public class ControllerBean {

    private String aString = "session wide value for a string";
    // Non-static getter and setter for aString.

    // ...
}

@ManagedBean
@ViewScoped
public class OneRandomViewScopedBean {

    @ManagedProperty("#{controllerBean}")
    private ControllerBean controllerBean;
    // Setter for controllerBean. Getter is not mandatory.

    public void someAction() {
        controllerBean.setAString(newValueForString);
    }

    // ...
} 
Run Code Online (Sandbox Code Playgroud)

也可以看看: