繁体   English   中英

JSF/JAVA boolean 切换器(私有用于 JSF,公共 static 用于 Bean)

[英]JSF/JAVA boolean switchers (private for JSF, public static for Beans)

我正在使用 boolean 切换器来解决应用程序的选定行为,例如 SAVEACCEPTED 启用表单的 SAVE 按钮。

<h:commandButton action="#{bean.save}" disabled="#{!bean.saveaccepted}">

JSF 需要私有 boolean 及其 getter 和 setter,但是如果我想解决应用服务器中的一些内部逻辑,则必须定义 static。 例如

IF (USERFOUND) SAVEACCEPTED = true;

所以,我使用设置 class 并且有 public static booleans defined 在 bean 中有指向 Settings.VARIABLE 的 getter 和 setter

设置.java

public static boolean SAVEACCEPTED = false;

豆.java

public static boolean isSaveAccepted() {
  return Settings.SAVEACCEPTED;
}

问题是,公共 boolean 只有一个,如果有多个用户使用应用程序,当第一个切换变量时,它会影响第二个用户表单。

我该如何解决这个问题,有一些标准的解决方案吗?

不要使用static变量。 使用@SessionScoped@ViewScoped bean 分别为每个用户存储设置。

@Named
@SessionScoped
public class Settings
{
    private boolean saveAccepted = false;

    public boolean isSaveAccepted()
    {
        return saveAccepted;
    }

    public void setSaveAccepted(boolean saveAccepted)
    {
        this.saveAccepted = saveAccepted;
    }
}

<h:commandButton action="#{bean.save}" disabled="#{!settings.saveaccepted}">

如果我需要在另一个 bean 中(不在 JSF 中)设置 saveAccepted = true 怎么办? 它不起作用,因为在这种情况下,saveAccepted 必须是 static。

不要使用 static 变量。

如果你需要在另一个 bean 中设置值,你可以@Inject一个实例:

@Named
@RequestScoped
public class SomeOtherBean
{
    @Inject
    private Settings settings;

    public boolean getSaveAccepted()
    {
        return settings.getSaveAccepted();
    }

    public void setSaveAccepted(boolean saveAccepted)
    {
        settings.setSaveAccepted(saveAccepted);
    }
}

并且CDI将为您提供正确的Settings实例。


BalusC评论:

根据问题历史,OP 正在使用 Tomcat 这只是一个简单的 servlet 容器。

由于您似乎没有使用完整的 Java EE 6 容器,因此您可以使用@ManagedBean而不是@Named@ManagedProperty而不是@Inject

@ManagedBean
@RequestScoped
public class SomeOtherBean
{
    @ManagedProperty
    private Settings settings;

    public boolean getSaveAccepted()
    {
        return settings.getSaveAccepted();
    }

    public void setSaveAccepted(boolean saveAccepted)
    {
        settings.setSaveAccepted(saveAccepted);
    }
}

我很抱歉让你走上更复杂的道路!

在这种情况下使用 static 变量并不理想。 根据定义,Static 字段在 class 的所有实例之间共享。 因此,正在发生的事情是您存储的值正在为托管 bean 的所有实例共享。

我建议您使用 @ViewScoped 将其保存在请求@ViewScoped或使用<managed-bean-scope>在 faces-config.xml 中定义它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM