Java EE 应用程序和 "global" 变量

Java EE application and "global" variables

我们有一个带有 primefaces 的 Java EE 应用程序,我们想知道是否有办法拥有一个 "global" 应用程序变量。

我的意思是:假设 user1 正在编辑 document1,当 user2 尝试访问 document1 时,我们想显示一条消息:"User1 is already editing this document".

所以,我们必须使用某些东西 "global" 来跟踪用户操作或文档锁定等,实现此目的的最佳方法是什么?

我在网上搜索了一下,但意见不一,一般都没有提供工作示例,所以link欢迎指点!

编辑:以上只是一个例子,请不要关注"documents",你可以称它为"resources",或任何你喜欢的名字。我以文档锁定问题为例,但它可以是总计数器或其他需要在应用程序级别存储的东西。 我要问的(抱歉,如果不清楚的话)不是如何管理文档锁定,而是在 Java EE 的应用程序级别拥有 "global" 变量的最佳方法是什么,如果可能的话.

谢谢

只是好奇:为什么如果我添加 "hola," 或 "hi," 作为第一行,当我保存编辑时它会消失?

对于大多数简单情况,您可以为此目的在托管 bean 中使用静态字段,因为它将由托管 bean 的所有实例共享。例如,让我们假设要编辑文档,您的用户与以下 bean 交互:

@ManagedBean
@ViewScoped    
public class DocumentManager {
    private static Map<Long, String> editedDocs = new HashMap<>();
    private Document selectedDoc;

}

那么让我们想象一下,在用户选择文档后(例如从数据表中选择文档,以便它进入 selectedDoc 字段),他们通过单击 action 属性指向方法 editDocument 的按钮来获得文档编辑页面像这样:

然后在您的 editDocument 方法中,我们将单击按钮的用户的文档 ID 和用户名添加到跟踪当前编辑文档的映射中。

public String editDocument() {
    if (!editedDocs.contains(selectedDoc.getId())) {
         String username = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();
         editedDocs.put(selectedDoc.getId(), username);    

         String msg = "User " + username + " is already editing the document";
         FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg));
    }
    return theAddressOfEditDocumentPage;
}

请不要忘记在用户离开编辑页面时从 editedDocs 中删除文档 ID 和用户名(通过单击“保存”或“取消”按钮)。 另一种可能性是在外部存储这种映射(例如在数据库中)

如果你想全局保存一些东西,在 Java EE 6+ 中它应该使用 Application Scope

http://docs.oracle.com/javaee/6/api/javax/enterprise/context/ApplicationScoped.html

例如:

@ApplicationScoped
class Global {
   void setDocInUse(boolean) { ... }
   boolean isDocInUse() { ... }
}

@RequestScoped
class MyDocEditor {

    @Inject Global global;

    public void edit() {
       if (global.isDocInUse()) { ... }
       else  { ... }
    }
}