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 { ... }
}
}
我们有一个带有 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 { ... }
}
}