Есть ли другие способы сделать это?
Да, но это будет зависеть от того, как долго вы хотите, чтобы значения хранились. В контейнере сервлетов у вас обычно есть доступ к области приложения, области сеанса, области запроса и области страницы. К первым трем можно получить доступ как в сервлетах, так и в JSP, а последний полезен только в контексте JSP.
Если содержимое меню можно повторно использовать в разных сеансах, лучше хранить их в объектах области приложения через интерфейс ServletContext .
Если вам не нужны данные меню помимо текущего запроса, то вы должны сделать это областью запроса, а не областью сеанса.
Если область действия раскрывающегося меню ограничена сеансом, то лучше хранить его в сеансе, если объект не занимает много места. Имейте в виду, что размер объектов, хранящихся в памяти, будет влиять на производительность сайта, особенно при наличии стратегии кластеризации и репликации сеансов - это главным образом потому, что содержимое сеанса должно быть сериализовано и сохранено для возможности создания другого сеанса при отработке отказа.
Кроме того, на производительность будет влиять даже то, что вы не используете стратегию кластеризации и миграции сеансов, поскольку каждый сеанс будет использовать память, которая будет освобождена только при следующем цикле GC после аннулирования сеанса.
Если вы хотите избежать использования сеансов для хранения объектов в области сеансов, вы можете запрашивать данные из базы данных по мере необходимости. Или даже храните содержимое в файлах (если они не являются конфиденциальными / конфиденциальными данными), что может сделать вашу стратегию переноса сеанса немного более болезненной.
Если это самый распространенный способ сделать это, то как мы можем избежать потери сеанса?
Я не понял эту часть вопроса. В любом случае сеансы управляются контейнером от имени разработчика приложения. Самое большее, разработчик может указать значения тайм-аута сеанса, которые будут определять экстент скользящего окна для истечения сеанса. Разработчик также может лишить законной силы сеанс в какой-то важный момент в процессе навигации приложения - например, по нажатию кнопки выхода из системы. Разработчику, как правило, не нужно беспокоиться об управлении сеансами, помимо того, что необходимо сделать с помощью HttpSession API или записей в дескрипторах развертывания.