Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Servlet время жизни переменных


Автор: Flashed 19.4.2012, 17:29
Допустим код:
Код

package jp.math.controller;

import java.io.IOException;
import java.net.Socket;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public abstract class MyController extends HttpServlet{

    protected A a; 
    protected B b;


    @Override
    public void service(HttpServletRequest arg0, HttpServletResponse arg1)
            throws ServletException{
                //иницилизация a
                //...
                //инициализация b
                //...
                arg0.getSession().setAttribute("b",b);

    }

}
 
Будет ли данные, записанные при запросе 1 в переменную типа A, сохранены так, чтобы их можно было читать при запросе 2? 

Автор: jk1 19.4.2012, 18:32
Цитата

Будет ли данные, записанные при запросе 1 в переменную типа A, сохранены так, чтобы их можно было читать при запросе 2?  


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

Автор: COVD 19.4.2012, 19:13
Потоки из пула берутся, а сервлет всегда в одном экземпляре. Сервлет не должен хранить состояние, не должен иметь никаких переменных, кроме локальных в методах.

Автор: jk1 19.4.2012, 22:26
Цитата

Потоки из пула берутся, а сервлет всегда в одном экземпляре. 


Перечитал спеку. Да, именно так оно и есть, я перепутал.

Цитата

Сервлет не должен хранить состояние, не должен иметь никаких переменных, кроме локальных в методах. 


Это, разумеется, верно. В любом случае состояние в сервлетах это плохо

Автор: AlexSerov 20.4.2012, 05:52
Вроде бы для хранения состояния используется сессия - объект уникальный для данного пользователя. См. метод getSession.

Автор: Flashed 20.4.2012, 06:42
Так понимаю, значение для объекта типа B из моего примера, будет храниться в сессиях не 1, а несколько экземпляров (т.е. для каждого пользователя 1)?

Автор: Flashed 20.4.2012, 22:42
Да, именно так оно и есть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)