簡體   English   中英

Java EE應用程序和“全局”變量

[英]Java EE application and “global” variables

我們有一個帶有撇號的Java EE應用程序,我們想知道是否有一種方法可以擁有“全局”應用程序變量。

我的意思是:假設用戶1正在編輯文檔1,當用戶2嘗試訪問文檔1時,我們想顯示一條消息:“用戶1已經在編輯該文檔”。

因此,我們必須使用“全局”方式來跟蹤用戶操作或文檔鎖定等,實現此目的的最佳方法是什么?

我已經在互聯網上進行搜索,但是意見不一,通常沒有提供可用的示例,因此歡迎使用鏈接和指針!

編輯:以上僅是示例,請不要關注“文檔”,您可以將其稱為“資源”,或任何您喜歡的東西。 我以文檔鎖定問題為例,但是它可以是總計數器或需要在應用程序級別存儲的其他內容。 我要問的是(不是很清楚,很抱歉)不是如何管理文檔鎖定,但是如果可能的話,在應用程序級別的Java EE中擁有“全局”變量的最佳方法是什么。

謝謝

只是好奇:為什么如果我在第一行添加“ hola”或“ hi”,當我保存編輯內容時它消失了?

如果要全局保存內容,則在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  { ... }
    }
}

在大多數簡單情況下,您可以在托管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和用戶名。 另一種可能性是將此類映射存儲在外部(例如,存儲在數據庫中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM