我们有一个带有primefaces的Java EE应用程序,我们想知道是否有一种方法可以拥有" global"应用变量。
我的意思是:想象user1正在编辑document1,当user2尝试访问document1时,我们想要显示一条消息:" User1已经在编辑此文档"。
所以,我们必须使用" global"为了跟踪用户操作或文档锁定等等,实现这一目标的最佳方法是什么?
我在互联网上搜索但是意见不同,通常没有提供工作示例,所以欢迎链接和指针!
编辑:以上只是一个例子,请不要关注"文件",你可以称之为"资源",或任何你喜欢的。我以文档锁定问题为例,但它可以是一个总计数器或其他需要在应用程序级别存储的东西。 我问的问题(如果不清楚则表示对不起)不是如何管理文档锁定,而是什么是拥有"全球" Java EE中应用程序级别的变量,如果可能的话。谢谢
好奇:如果我添加" hola,"或者"嗨,"作为第一行,当我保存编辑时它会消失?
答案 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和用户名。 另一种可能性是在外部(例如在数据库中)存储这种映射