【问题标题】:JSF/JAVA boolean switchers (private for JSF, public static for Beans)JSF/JAVA 布尔切换器(JSF 私有,Beans 公有静态)
【发布时间】:2011-05-28 20:06:44
【问题描述】:

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

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

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

IF (USERFOUND) SAVEACCEPTED = true;

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

的 getter 和 setter

Settings.java

public static boolean SAVEACCEPTED = false;

Bean.java

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

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

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

【问题讨论】:

    标签: java jsf richfaces


    【解决方案1】:

    不要使用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 的正确实例。


    BalusCcmets:

    根据问题历史,OP 使用的是 Tomcat,它只是一个简单的 servletcontainer。

    由于您似乎没有使用完整的 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);
        }
    }
    

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

    【讨论】:

    • 谢谢,但是如果我需要在另一个 bean 中(不是在 JSF 中)设置 saveAccepted = true 怎么办?它不起作用,因为在这种情况下, saveAccepted 必须是静态的..:(
    • @gaffcz 查看我的编辑。为此,您必须放弃使用static
    • 谢谢,请问如何设置getters的注入?
    • 你给我看一个saveAccepted(注入)的setter,我不知道如何构造getter..
    • @Matt:根据问题历史,OP 使用的是 Tomcat,它只是一个简单的 servlet 容器。 @gaffcz:改用@ManagedBean/@ManagedProperty
    【解决方案2】:

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

    我建议您使用@ViewScoped 将其保存在请求范围内,或者使用&lt;managed-bean-scope&gt; 在 faces-config.xml 中定义它。

    【讨论】:

    • 谢谢,但我无法更改另一个 bean 中的值。它必须是静态的
    • @gaffcz - 要访问另一个 bean 中的字段,您需要将该 bean 作为另一个 bean 的托管属性注入。这就是通常的做法。
    • 谢谢,我在努力,但还是不行,如果你想看看下面的:)
    • @gaffcz - 您能否将您当前的设置添加到您的帖子中?这应该包括 web.xml、faces-config.xml 和来自 xhtml 和支持 bean 的相关 sn-ps。
    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 2013-12-17
    • 2010-12-11
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多