Как можно поддерживать состояние между сервлетами Java? - PullRequest
4 голосов
/ 18 сентября 2009

Положение

У меня есть несколько сервлетов с единственной ответственностью, которые принимают запрос, выполняют свою работу, отвечают и выполняются - в этих случаях не требуется поддерживать состояние.

Однако у меня есть «Простой старый Java-объект», который поддерживает информацию о состоянии на основе действий, которые пользователь инициировал на клиенте, которые я хотел бы сделать доступными по запросу для моих сервлетов. Я хотел бы сделать доступным один экземпляр этого объекта, и мне не нужно / не нужно поддерживать несколько общих экземпляров.

Примечание: эти данные являются временными (возможно, их нужно хранить в течение 10 минут), и на самом деле я не хочу хранить их в базе данных.

Вопрос

Ранее я поддерживал общий экземпляр объекта с JSP, но в этом случае сервлет имеет больше смысла. Итак, мой вопрос: как мне соответствующим образом управлять временем жизни этого объекта, который поддерживает состояние и может делиться им с сервлетами без сохранения состояния через HTTP-запросы или каким-либо другим механизмом?

Другими словами, если бы это было не веб-приложение, сервлеты без состояния были бы объектами, которым я бы делегировал задачу, а объект с состоянием сохранял бы результаты.

Я изучил ServletContext, но я не совсем понимаю цель этого, чтобы узнать, действительно ли это то, что мне нужно.

Ответы [ 2 ]

13 голосов
/ 18 сентября 2009

Может, я неправильно понимаю ваш вопрос, но вы подумали о сессии?

[править] Так что вам действительно нужна сессия.

Вы можете использовать сеанс, например, таким образом:

public class TestServlet extends HttpServlet {
....
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
    request.getSession().setAttribute("test", new Date());
  }
....
}

Объект, который вы храните там, должен , должен быть сериализуемым IIRC.

Если вы используете eclipse или netbeans, функция code-insight и javadoc должны помочь вам использовать его для более сложных вещей.

1 голос
/ 18 сентября 2009

Если вы можете хранить все сервлеты в одном веб-приложении (контексте), вы можете сохранить сессию в ServletContext или HttpSession.

Если вам нужно несколько экземпляров, ServletContext / HttpSession не будет работать. Я бы предложил хранить сессии в memcached.

В любом случае вам нужно самостоятельно управлять временем ожидания сеанса.

...