Совместное использование статического объекта между сервлетом и веб-сервисом - PullRequest
3 голосов
/ 02 декабря 2009

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

Ответы [ 5 ]

6 голосов
/ 02 декабря 2009

Вы можете делиться вещами через веб-приложение, сохраняя их как атрибуты в ServletContext (используя setAttribute / getAttribute). Вы можете создать объект с имплементацией ServletContextListener , сохранить его в ServletContext, а затем извлечь его и использовать из веб-службы и сервлета.

2 голосов
/ 02 декабря 2009

Я буду расширять свой комментарий здесь .

В простейшем случае ServletContext.setAttribute/getAttribute было бы хорошо. Но некоторые люди справедливо подняли вопросы о безопасности потоков.

Для этого лучшим подходом было бы сохранить общий POJO в ServletContext во время инициализации веб-приложения и получить его там, где вам нужно, с помощью ServletContext.getAttribute.

Для этого вам необходимо реализовать интерфейс ServletContextListener и объявить его в файле web.xml.

<listener>
  <listener-class>your.package.ServletContextListenerImpl</listener-class>
</listener>

Этот слушатель вызывается один раз, когда ваше веб-приложение загружается контейнером сервлета, и когда оно собирается быть выгруженным контейнером сервлета. В обоих случаях он передает ServletContextEvent с дескриптором на ServletContext. Именно в этот момент вы хотите установить / удалить атрибут, который указывает на ваш общий объект.

Из-за этого вы можете быть уверены, что ServletContext.getAttribute вернет действительный объект при вызове из Servlet.service или одного из do... методов.

Что касается имени атрибута, я бы пошел с вашим именем класса общего класса. Я бы также добавил статический метод доступа к вашему общему классу, чтобы получить его из ServletContext, например:

public class Shared
{
  ...
  public static Shared fromServletContext ( final ServletContext context )
  {
    return (Shared) context.getAttribute( Shared.class.getName( ) );
  }
}
1 голос
/ 02 декабря 2009

Самый простой вариант - создать Singleton - класс, который допускает только один экземпляр в памяти. Поскольку вы получаете его, вызывая статический метод самого класса, он должен быть доступен как сервлету, так и WS

.
0 голосов
/ 02 декабря 2009

Если это специфичные для приложения данные (доступные всем пользователям (сеансам)), тогда используйте ServletContext#set/getAttribute(). Если это данные пользователя (сессии), используйте HttpSession#set/getAttribute().

Позвольте классу сервлета установить объект в желаемой области (приложение или сеанс) по определенному ключу атрибута, а веб-сервис получит объект из требуемой области по тому же ключу атрибута.

Я думаю, тебе скорее нужно HttpSession.

История синглтона здесь не имеет смысла.

0 голосов
/ 02 декабря 2009

Если мое альтернативное понимание вопроса верное, данные, полученные из запроса, должны быть сохранены, а затем получены веб-службой. Если предполагается, что это выполняется в многопользовательской среде, вы можете рассмотреть возможность использования базы данных в памяти ( HSQLDB ) для временного хранения данных. Затем вы сможете получить его с помощью своего веб-сервиса, основываясь на некоторых критериях, которые я не могу предсказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...