Как я могу поделиться переменной или объектом между двумя или несколькими сервлетами?
Я хотел бы знать, есть ли способ поделиться переменной или объектом между двумя или несколькими Сервлетами, я имею в виду некоторый "стандартный" способ. Я полагаю, что это не очень хорошая практика, но это простой способ создать прототип.
Я не знаю, зависит ли это от используемых технологий, но я буду использовать Tomcat 5.5
Я хочу поделиться Vector объектов простого класса (только публичные атрибуты, строки, ints и т.д.). Мое намерение состоит в том, чтобы иметь статические данные, подобные в БД, очевидно, что он будет потерян, когда Tomcat будет остановлен. (это просто для тестирования)
Ответы
Ответ 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") Если я использую подобное, данные будут сохраняться, даже если я переключаюсь на другой браузер или окна инкогнито. Я хочу очистить эти данные, когда переключаюсь в другой браузер или окно инкогнито. Как мне этого добиться?