[英]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。
如果你需要在另一个 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.