2011-03-11 42 views
1

我想我已经知道变量何时有值。 但我很惊讶,当我在另一个浏览器中打开它时,该变量已经有了一个值。 我想这个值仍然驻留在Web服务器上。我一直在想,当我将它打开到另一台浏览器时,甚至到另一台计算机时,它将在内存中拥有自己的变量。什么时候变量值在Java中死亡或删除

我在我的Servlets中的全局范围内声明变量设置为null。

List<RecordsInfo> recordsInfo = null; 

//with getter and setter; 

然后我有这样

function exportToExcel(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
String filePath = ""; 

try { 
    if(recordsInfo != null){ 
     /*I need to check first if recordsInfo has already value before creating an excel file. 
     This is to make sure that the records viewed are the same and will not make another query.*/ 
     filePath = excelExporter.generateExcel(recordsInfo); //do something... 

     request.setAttribute("filePath ",filePath);        
     getServletContext().getRequestDispatcher("/docs/download.jsp").forward(request, response); 
    } else { 
     //so something.... 
    } 
} catch (Exception e)  
    e.printStackTrace(); 
} 
} 

download.jsp功能(JSTL)

Click <a href="${filePath}">here</a> to download. 

我知道我能得到recordsInfo的价值后,我初始化它,所以我在exportToExcel中使用它。但我的问题是其他浏览器使用相同的功能得到相同的结果,我认为它是空的,因为它有不同的会话。

虽然我已经有计划解决这个问题,但我只想给专家一些建议。

我的问题是什么时候变量die(当Java垃圾收集器处理它时) 以及声明每个会话都是唯一变量的最佳做法是什么? 我希望我明确提出了我的问题。我会感谢任何帮助。谢谢!

+0

相关:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909 – BalusC 2011-03-11 11:11:27

回答

3

我在我的Servlets中的全局作用域中声明变量设置为null。当首先要求它

Servlet是一次加载到内存中..

现在的每一个请求它的服务方法被调用。但是您在全局范围内有recordsInfo,所以它将在所有会话/请求被共享,直到servlet由类加载器重新加载。

因此,对于你的情况,你可以设置recordsInfo作为会话属性,你需要它的不同session不同,为缓存requests

更新为新问:

在Servlet将加载哪个内存,它在Web服务器中?

内存将是您的机器的内存,特别是您的jvm的服务器正在运行的堆内存。

是如果太大,缓存,不

+0

在哪Servlet将加载的内存是否在Web服务器中?基于你的答案我认为这是网络服务器,我只是想确保:)。关于类加载器我并不十分熟悉这一点,而且我对java还是一个新手,这可以替代会话。关于会议,我认为这是比我打算做的更好的选择。但尽可能地我不想在我的会议中放大对象。我有可能获得大约数十万或数百万的记录。再次感谢我现在尝试使用会话。 – ace 2011-03-11 05:59:39

+0

为您的新问答添加了答案。 – 2011-03-11 06:03:33

+0

谢谢!这是一个很大的帮助。 – ace 2011-03-11 06:07:35