Java EE应用程序和“全局”变量

时间:2015-03-13 15:20:47

标签: java java-ee glassfish global-variables

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

我的意思是:想象user1正在编辑document1,当user2尝试访问document1时,我们想要显示一条消息:" User1已经在编辑此文档"。

所以,我们必须使用" global"为了跟踪用户操作或文档锁定等等,实现这一目标的最佳方法是什么?

我在互联网上搜索但是意见不同,通常没有提供工作示例,所以欢迎链接和指针!

编辑:以上只是一个例子,请不要关注"文件",你可以称之为"资源",或任何你喜欢的。我以文档锁定问题为例,但它可以是一个总计数器或其他需要在应用程序级别存储的东西。 我问的问题(如果不清楚则表示对不起)不是如何管理文档锁定,而是什么是拥有"全球" Java EE中应用程序级别的变量,如果可能的话。

谢谢

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

2 个答案:

答案 0 :(得分:1)

如果你想在全球范围内保存一些东西,在Java EE 6+中它应该使用应用范围

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  { ... }
    }
}

答案 1 :(得分:-1)

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

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

}

然后让我们想象一下,在用户选择了文档后(例如从dataTable中进入selectedDoc字段),他们通过点击一个按钮来获取文档编辑页面,该按钮的动作属性指向方法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和用户名。 另一种可能性是在外部(例如在数据库中)存储这种映射