Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: David AmellerОтветов: 6

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

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


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

  • Это во многом зависит от того, какой это объект/переменная. Принадлежит ли переменная одному классу, и вам просто нужен доступ? Это константа? Пример был бы хорош. Swati 24.09.2008

javaweb-applicationsservlets

Ответы

Ответ 1 · рейтинг 79 · William

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

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

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

Ответ 2 · рейтинг 9 · bpapa

Поместите его в один из 3-х разных прицелов.

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

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

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

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

Ответ 3 · рейтинг 7 · shemnon

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

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

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

Ответ 4 · рейтинг 2 · ggrandes

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

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

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

Ответ 5 · рейтинг 1 · yalestar

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

e.g:

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

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

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

Ответ 6 · Reed Sandberg

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы