Как я могу разделить переменную или объект между двумя или более сервлетами? - PullRequest
40 голосов
/ 24 сентября 2008

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

Не знаю, зависит ли это от используемых технологий, но я буду использовать Tomcat 5.5


Я хочу поделиться вектором объектов простого класса (только открытые атрибуты, строки, целые и т. Д.). Мое намерение состоит в том, чтобы иметь статические данные, как в БД, очевидно, они будут потеряны, когда Tomcat остановлен. (это только для тестирования)

Ответы [ 6 ]

77 голосов
/ 24 сентября 2008

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

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

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    String shared = "shared";
    request.setAttribute("sharedId", shared); // add to request
    request.getSession().setAttribute("sharedId", shared); // add to session
    this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context
    request.getRequestDispatcher("/URLofOtherServlet").forward(request, response);
}

Если вы поместите его в объект запроса, он будет доступен сервлету, который перенаправляется до завершения запроса:

request.getAttribute("sharedId");

Если вы поместите его в сеанс, он будет доступен всем сервлетам, идущим вперед, но значение будет привязано к пользователю:

request.getSession().getAttribute("sharedId");

До истечения сеанса на основе отсутствия активности пользователя.

Сбрасывается вами:

request.getSession().invalidate();

Или один сервлет удаляет его из области видимости:

request.getSession().removeAttribute("sharedId");

Если вы поместите его в контекст сервлета, он будет доступен во время работы приложения:

this.getServletConfig().getServletContext().getAttribute("sharedId");

Пока вы его не удалите:

this.getServletConfig().getServletContext().removeAttribute("sharedId");
8 голосов
/ 24 сентября 2008

Положите его в одну из 3 разных областей.

запрос - длится жизнь запроса

сеанс - длится жизнь сеанса пользователя

приложение - действует до выключения приложения

Вы можете получить доступ ко всем этим областям через переменную HttpServletRequest, которая передается методам, которые выходят из класса HttpServlet

7 голосов
/ 24 сентября 2008

Зависит от предполагаемого использования данных.

Если данные используются только для каждого пользователя, например, информация для входа в систему, количество посещений страницы и т. Д., Используйте объект сеанса (httpServletRequest.getSession (). get / setAttribute (String [, Object]))

Если это одни и те же данные для нескольких пользователей (общее количество посещений веб-страниц, рабочие потоки и т. Д.), Используйте атрибуты ServletContext. servlet.getServletCongfig (). getServletContext (). get / setAttribute (String [, Object])). Это будет работать только в одном и том же военном файле / веб-приложении. Обратите внимание, что эти данные также не сохраняются при перезагрузках.

2 голосов
/ 17 апреля 2013

Другой вариант - обмен данными между контекстами ...

Доля-данные между-сервлет-на-кот

  <Context path="/myApp1" docBase="myApp1" crossContext="true"/>
  <Context path="/myApp2" docBase="myApp2" crossContext="true"/>

В myApp1:

  ServletContext sc = getServletContext();
  sc.setAttribute("attribute", "value");

В myApp2:

  ServletContext sc = getServletContext("/myApp1");
  String anwser = (String)sc.getAttribute("attribute");
1 голос
/ 24 сентября 2008

Не могли бы вы просто поместить объект в HttpSession и затем ссылаться на него по имени его атрибута в каждом из сервлетов?

например:

getSession().setAttribute("thing", object);

... затем в другом сервлете:

Object obj = getSession.getAttribute("thing");
0 голосов
/ 27 октября 2017

Вот как я это делаю с Jetty.

https://stackoverflow.com/a/46968645/1287091

Использует контекст сервера, в который записывается синглтон во время запуска встроенного сервера Jetty и используется всеми веб-приложениями в течение всего срока службы сервера. Может также использоваться для обмена объектами / данными между веб-приложениями, если предполагается, что в контексте есть только один писатель, в противном случае вам следует помнить о параллелизме.

...