JSF / JAVA布尔切换器(JSF专用,Beans公共静态)

时间:2011-05-28 20:06:45

标签: java jsf richfaces

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

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

JSF需要私有布尔及其getter和setter,但如果我想解析应用服务器中的某些内部逻辑,则必须将其定义为static。例如

IF (USERFOUND) SAVEACCEPTED = true;

所以,我正在使用settings class and there are public static booleans defined。在bean中有getter和setter指向Settings.VARIABLE

Settings.java

public static boolean SAVEACCEPTED = false;

Bean.java

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

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

如何解决这个问题,是否有一些标准解决方案?

2 个答案:

答案 0 :(得分:3)

不要使用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必须是静态的。

使用静态变量。

如果需要在另一个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);
    }
}

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

答案 1 :(得分:2)

在这种情况下使用静态变量并不理想。根据定义,静态字段在类的所有实例之间共享。所以正在发生的事情是您正在为托管bean的所有实例共享的值。

我建议您使用@ViewScoped将其保存在请求范围内,或者使用<managed-bean-scope>在faces-config.xml中进行定义。