Подтвердить что ты не робот

Как я могу поделиться переменной или объектом между двумя или несколькими сервлетами?

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

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


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

4b9b3361

Ответ 1

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

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

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");

До истечения срока действия сеанса, основанного на неактивности пользователя.

Является reset вами:

request.getSession().invalidate();

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

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

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

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

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

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

Ответ 2

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

запрос - длится срок службы запроса

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

Приложение

- длится до закрытия приложения

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

Ответ 3

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

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

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

Ответ 4

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

share-data-between-servlets-on-tomcat

  <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");

Ответ 5

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

например:

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

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

Object obj = getSession.getAttribute("thing");

Ответ 6

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

fooobar.com/questions/137511/...

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

Ответ 7

this.getServletConfig(). getServletContext(). getAttribute ("sharedId") Если я использую подобное, данные будут сохраняться, даже если я переключаюсь на другой браузер или окна инкогнито. Я хочу очистить эти данные, когда переключаюсь в другой браузер или окно инкогнито. Как мне этого добиться?