Уникальная идентификация экземпляра портлета JSR-168 - PullRequest
1 голос
/ 23 декабря 2008

Я пишу портлет JSR-168, который можно добавить в контейнер несколько раз. Каждый контейнер (Liferay, JBoss и т. Д.) Имеет свой собственный внутренний способ различения нескольких экземпляров одного и того же портлета.

Я, однако, хотел бы однозначно идентифицировать мой экземпляр портлета внутри самого метода doView().

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

Ответы [ 3 ]

3 голосов
/ 23 декабря 2008

Портлет 1.0 (168) предоставляет метод RenderResponse.getNamespace () , который должен быть уникальным для каждого экземпляра портлета.

Из спецификации: PLT.12.3.4 Кодировка пространства имен :

Метод getNamespace должен обеспечивать портлет с механизмом, который обеспечивает уникальность возвращаемого строка на всей странице портала. За Например, метод getNamespace будет вернуть уникальную строку, которая может быть префикс к имени переменной JavaScript в контенте, созданном портлет, обеспечивающий его 5 уникальность в вся страница GetNamespace метод должен вернуть то же значение, если вызывается несколько раз в рендере запрос.

Если вы хотите получить к нему доступ в processAction , вы, вероятно, захотите сохранить его в сеансе или в качестве параметра actionURL .

Если обновление является опцией, Portlet 2.0 (286) изменяет базовый интерфейс PortletResponse , чтобы обеспечить метод getNamespace () , а также добавляет PortletRequest.getWindowID () метод, который может быть вам полезен.

0 голосов
/ 12 ноября 2010

Я удивлен, что этот уникальный идентификатор, кажется, не существует согласно Ame. Идентификатор экземпляра можно использовать для хранения всех настроек портлета в нашей собственной базе данных, а не в предоставленном контейнере. Одной из причин, по которой нам нужно хранить это самостоятельно, являются настройки, предоставляемые контейнером, которые не поддерживают специфичные для локали настройки.

Т.е. один экземпляр портлета может иметь разные предпочтения для локали.

Мы пытаемся использовать Liferay для наших нужд.

0 голосов
/ 23 декабря 2008

Нет, для экземпляра нет общего идентификатора. Я сам реализовал контейнер с портлетами, в общедоступном API-интерфейсе нет идентификатора для каждого экземпляра - у контейнера есть один, причины. Сеанс портлета (javax.portlet.PortletRequest#getPortletSession()) уникален для одного портлета (определение по тегу в portlet.xml) и одного пользователя (javax.servlet.http.HttpSession), что вам недостаточно.

Таким образом, imho сгенерированный идентификатор (также может быть простым (синхронизирующим) счетчиком в классе portletl) и сохраненный в сеансе портлета, является единственным переносимым способом. Сам класс портлета обычно совместно используется экземплярами, поэтому java.lang.System#identityHashCode(Object x) также бесполезен.

Зачем тебе это нужно?

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