Обучение Java. Сервлеты

Сохранение и получение данных сессии


Интерфейс HttpSession предоставляет методы, которые сохраняют и возвращают данные:

  • Стандартные свойства сессии, такие как идентификатор сессии. 
  • Данные приложения, которые сохраняются в виде пары с именным ключом, когда имя это строка (String) и величина - объект Java. (Также как java.util.Dictionary.) Поскольку используется доступ нескольких сервлетов к пользовательской сессии, Вам надо выбрать условное именование для организации имен соответствующих пользовательским данным. Это позволит сервлетам избежать случайной перезаписи одних величин другими. Одина из таких условностей servletname.name, где servletname это полное имя сервлета, включая его пакет. Например, com.acme.WidgetServlet.state это закладка с именем сервлета com.acme.WidgetServlet и именем state.
  • Пример Duke's Bookstore использует прослеживание сессии для того, чтобы хранить информацию о книгах в корзине для покупок пользователя. Вот пример сервлета CatalogServlet получающего идентификатор пользовательской сессии, который получает и устанавливает данные, соответствующие сессии этого пользователя:

    public class CatalogServlet extends HttpServlet {

    public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Получаем сесию пользователя и корзину для покупок

    HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart)session.getValue(session.getId());

    // Если у пользователя нет корзины, создаем ее

    if (cart == null) { cart = new ShoppingCart(); session.putValue(session.getId(), cart);

    } ... } }

    Потому как объект может быть ассоциирован с сессией, пример Duke's Bookstore

    хранит книги отобранные пользователем в объекте. Этот объект типа ShoppingCart и каждая книга, отобранная пользователем, хранится в корзине для покупок, то есть в объекте ShoppingCartItem. Например, вот, что получается в таком случае в методе doGet сервлета CatalogServlet:

    public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart)session.getValue(session.getId()); ... // Смотрим есть ли покупки в корзине

    String bookId = request.getParameter("Buy");

    // Если пользователь хочет добавить книгу, добавляем и пишем ответ

    String bookToAdd = request.getParameter("Buy"); if (bookToAdd != null) { BookDetails book = database.getBookDetails(bookToAdd);

    cart.add(bookToAdd, book);

    out.println("<p><h3>" + ...); } }

    В заключении, отметим, что сессия может быть разработана как новая. Новая сессия - если метод isNew класса HttpSession возвращает true, показывает, например, что, клиент не устанавливал сессию еще. С новой сессий данные еще не ассоциированы.

    Вам надо разобраться с ситуациями вызывающими новые сессии. В примере Duke's Bookstore

    приведенном выше, если у пользователя нет корзины для покупок (единственные данные ассоциированные с сессией), сервлет создает ему новую. С другой стороны, если Вам нужна информация пользователя, чтобы открыть сессию (такая как имя пользователя), Вы, возможно, перенаправите пользователя на "стартовую страницу", где возьмете всю необходимую информацию.

     


    Содержание раздела