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

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


JSF需要专用的布尔值及其获取器和设置器,但是如果我想解析应用程序服务器中的某些内部逻辑,则必须将其定义为静态。例如

IF (USERFOUND) SAVEACCEPTED = true;


因此,我正在使用settings class and there are public static booleans defined。并且在bean中有指向设置的吸气剂和吸气剂。

设置.java

public static boolean SAVEACCEPTED = false;


Bean.java

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


问题是,公共布尔值只有一个,如果有一个用户使用一个应用程序,则第一个切换该变量时,它将影响第二个用户形式。

我该如何解决此问题,是否有一些标准解决方案?

最佳答案

不要使用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);
    }
}


抱歉,您要走的路更复杂!

10-07 19:40
查看更多