Когда значения переменных умирают или удаляются в Java - PullRequest
1 голос
/ 11 марта 2011

Я думал, что уже знаю, когда переменная имеет значение. Но я был удивлен, что переменная уже имеет значение, когда я открываю ее в другом браузере. Я предполагаю, что значение все еще находится на веб-сервере. Я думал, что когда я открою его в другом браузере, даже на другом компьютере, у него будет собственная переменная, расположенная в памяти.

Я объявляю переменную, установленную в 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. Но моя проблема в том, что другие браузеры, использующие ту же функцию, получают тот же результат, который, по моему мнению, является нулевым, поскольку у него другой сеанс.

Хотя я уже планирую это исправить, я просто хочу посоветоваться с экспертом.

У меня вопрос, когда переменная умирает (когда ее удаляет сборщик мусора Java) и как лучше объявлять переменную, уникальную для каждого сеанса. Надеюсь, я прояснил свой вопрос. Я буду признателен за любую помощь. Спасибо!

1 Ответ

3 голосов
/ 11 марта 2011

Я объявляю переменную, установленную на ноль, в первый раз в глобальной области видимости в моих сервлетах.

Сервлет загружается один раз в память при первом запросе ..

Теперь для каждого запроса вызывается его сервисный метод.но у вас есть recordsInfo в глобальной области видимости, поэтому он будет использоваться для всех сеансов / запросов до тех пор, пока сервлет не будет перезагружен загрузчиками классов.

Так что для вашего сценария вы можете установить recordsInfo в качестве атрибута сеансатак как он вам нужен для разных session и для кэширования для requests

Обновление для вашего нового Q.:

В какой памятиБудет загружен сервлет, находится ли он на веб-сервере?

Память будет памятью вашей машины, особенно кучи памяти вашего jvm, на котором работает сервер.

да, если он слишком большойкешировать, не

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...