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

StackOverflow https://stackoverflow.com/questions/123657

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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


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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

обмен данными между сервлетами-на-tomcat

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

В моем приложении1:

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

В моем приложении2:

  ServletContext sc = getServletContext("/myApp1");
  String anwser = (String)sc.getAttribute("attribute");

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

например:

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top